@mytechtoday/augment-extensions 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/README.md +136 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/SCHEMA-VALIDATION-REPORT.md +216 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/brand-kit-example.yaml +292 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/campaign-brief-example.yaml +389 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/content-calendar-example.yaml +643 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/email-newsletter-example.md +376 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/landing-page-example.md +934 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/ppc-ad-copy-example.md +301 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/seo-blog-post-example.md +347 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/social-media-campaign-example.md +606 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/module.json +50 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/affiliate-influencer-marketing.md +593 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/asset-management.md +418 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/brand-consistency.md +210 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/content-marketing.md +337 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/conversion-optimization.md +455 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/direct-sales.md +499 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/email-marketing.md +439 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/legal-compliance.md +227 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/ppc-advertising.md +569 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/seo-optimization.md +470 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/social-media-marketing.md +414 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/universal-marketing.md +177 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/asset-inventory.schema.json +247 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/brand-kit.schema.json +326 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/campaign-brief.schema.json +342 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/color-palette.schema.json +223 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/content-template.schema.json +383 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -0
- package/augment-extensions/workflows/beads-integration/README.md +143 -0
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -0
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -0
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -0
- package/augment-extensions/workflows/beads-integration/module.json +75 -0
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -0
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -0
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -0
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/writing-standards/screenplay/README.md +300 -0
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -0
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -0
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -0
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -0
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -0
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -0
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -0
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -0
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -0
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -0
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -0
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -0
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -0
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -0
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -0
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -0
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -0
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -0
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -0
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -0
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -0
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -0
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -0
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -0
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -0
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -0
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -0
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -0
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -0
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -0
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -0
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -0
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -0
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -0
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -0
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -0
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -0
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -0
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -0
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -0
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -0
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +168 -10
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts +19 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +478 -63
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/types/gui.d.ts +62 -0
- package/cli/dist/types/gui.d.ts.map +1 -0
- package/cli/dist/types/gui.js +30 -0
- package/cli/dist/types/gui.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/gui-helpers.d.ts +23 -0
- package/cli/dist/utils/gui-helpers.d.ts.map +1 -0
- package/cli/dist/utils/gui-helpers.js +159 -0
- package/cli/dist/utils/gui-helpers.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +232 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +900 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +559 -105
- package/package.json +17 -6
|
@@ -0,0 +1,980 @@
|
|
|
1
|
+
# Database Security Standards
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers comprehensive security standards for database development, including SQL injection prevention, input validation, encryption strategies, access control, and compliance requirements.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## SQL Injection Prevention
|
|
10
|
+
|
|
11
|
+
### Parameterized Queries (Prepared Statements)
|
|
12
|
+
|
|
13
|
+
**ALWAYS use parameterized queries to prevent SQL injection:**
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// ❌ BAD: String concatenation (SQL injection vulnerability)
|
|
17
|
+
const userId = req.query.id;
|
|
18
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
19
|
+
const result = await db.query(query);
|
|
20
|
+
|
|
21
|
+
// ❌ BAD: Template literals (SQL injection vulnerability)
|
|
22
|
+
const email = req.body.email;
|
|
23
|
+
const query = `SELECT * FROM users WHERE email = '${email}'`;
|
|
24
|
+
const result = await db.query(query);
|
|
25
|
+
|
|
26
|
+
// ✅ GOOD: Parameterized query (PostgreSQL)
|
|
27
|
+
const userId = req.query.id;
|
|
28
|
+
const query = 'SELECT * FROM users WHERE id = $1';
|
|
29
|
+
const result = await db.query(query, [userId]);
|
|
30
|
+
|
|
31
|
+
// ✅ GOOD: Named parameters (MySQL)
|
|
32
|
+
const email = req.body.email;
|
|
33
|
+
const query = 'SELECT * FROM users WHERE email = ?';
|
|
34
|
+
const result = await db.query(query, [email]);
|
|
35
|
+
|
|
36
|
+
// ✅ GOOD: ORM (Prisma)
|
|
37
|
+
const user = await prisma.user.findUnique({
|
|
38
|
+
where: { id: parseInt(userId) }
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// ✅ GOOD: Query builder (Knex)
|
|
42
|
+
const users = await knex('users')
|
|
43
|
+
.where('email', email)
|
|
44
|
+
.select('*');
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Dynamic Query Construction
|
|
48
|
+
|
|
49
|
+
**When building dynamic queries, use query builders or ORMs:**
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
// ❌ BAD: Dynamic query with string concatenation
|
|
53
|
+
function searchUsers(filters) {
|
|
54
|
+
let query = 'SELECT * FROM users WHERE 1=1';
|
|
55
|
+
|
|
56
|
+
if (filters.name) {
|
|
57
|
+
query += ` AND name = '${filters.name}'`; // SQL injection!
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (filters.email) {
|
|
61
|
+
query += ` AND email = '${filters.email}'`; // SQL injection!
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return db.query(query);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ✅ GOOD: Query builder (Knex)
|
|
68
|
+
function searchUsers(filters) {
|
|
69
|
+
let query = knex('users').select('*');
|
|
70
|
+
|
|
71
|
+
if (filters.name) {
|
|
72
|
+
query = query.where('name', filters.name);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (filters.email) {
|
|
76
|
+
query = query.where('email', filters.email);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return query;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ✅ GOOD: ORM (Prisma)
|
|
83
|
+
function searchUsers(filters) {
|
|
84
|
+
const where = {};
|
|
85
|
+
|
|
86
|
+
if (filters.name) where.name = filters.name;
|
|
87
|
+
if (filters.email) where.email = filters.email;
|
|
88
|
+
|
|
89
|
+
return prisma.user.findMany({ where });
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Stored Procedures
|
|
94
|
+
|
|
95
|
+
**Use stored procedures for complex operations:**
|
|
96
|
+
|
|
97
|
+
```sql
|
|
98
|
+
-- Create stored procedure with parameterized inputs
|
|
99
|
+
CREATE OR REPLACE FUNCTION get_user_orders(
|
|
100
|
+
p_user_id INTEGER,
|
|
101
|
+
p_start_date DATE,
|
|
102
|
+
p_end_date DATE
|
|
103
|
+
)
|
|
104
|
+
RETURNS TABLE (
|
|
105
|
+
order_id INTEGER,
|
|
106
|
+
order_date TIMESTAMP,
|
|
107
|
+
total_amount DECIMAL
|
|
108
|
+
) AS $$
|
|
109
|
+
BEGIN
|
|
110
|
+
RETURN QUERY
|
|
111
|
+
SELECT id, created_at, total
|
|
112
|
+
FROM orders
|
|
113
|
+
WHERE user_id = p_user_id
|
|
114
|
+
AND created_at BETWEEN p_start_date AND p_end_date
|
|
115
|
+
ORDER BY created_at DESC;
|
|
116
|
+
END;
|
|
117
|
+
$$ LANGUAGE plpgsql;
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
// Call stored procedure
|
|
122
|
+
const result = await db.query(
|
|
123
|
+
'SELECT * FROM get_user_orders($1, $2, $3)',
|
|
124
|
+
[userId, startDate, endDate]
|
|
125
|
+
);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Input Validation & Sanitization
|
|
131
|
+
|
|
132
|
+
### Validation Before Database Operations
|
|
133
|
+
|
|
134
|
+
**Always validate input before database operations:**
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
const { z } = require('zod');
|
|
138
|
+
|
|
139
|
+
// Define validation schema
|
|
140
|
+
const userSchema = z.object({
|
|
141
|
+
email: z.string().email().max(255),
|
|
142
|
+
name: z.string().min(1).max(255),
|
|
143
|
+
age: z.number().int().min(0).max(150),
|
|
144
|
+
role: z.enum(['user', 'admin', 'moderator'])
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Validate input
|
|
148
|
+
async function createUser(input) {
|
|
149
|
+
// Validate
|
|
150
|
+
const validated = userSchema.parse(input);
|
|
151
|
+
|
|
152
|
+
// Insert with validated data
|
|
153
|
+
const result = await db.query(
|
|
154
|
+
'INSERT INTO users (email, name, age, role) VALUES ($1, $2, $3, $4) RETURNING *',
|
|
155
|
+
[validated.email, validated.name, validated.age, validated.role]
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
return result.rows[0];
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Type Coercion
|
|
163
|
+
|
|
164
|
+
**Ensure proper type coercion:**
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
// ❌ BAD: No type validation
|
|
168
|
+
const userId = req.query.id; // Could be "1 OR 1=1"
|
|
169
|
+
const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
170
|
+
|
|
171
|
+
// ✅ GOOD: Type validation and coercion
|
|
172
|
+
const userId = parseInt(req.query.id, 10);
|
|
173
|
+
if (isNaN(userId)) {
|
|
174
|
+
throw new Error('Invalid user ID');
|
|
175
|
+
}
|
|
176
|
+
const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Whitelist Validation
|
|
180
|
+
|
|
181
|
+
**Use whitelist validation for limited options:**
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
// ❌ BAD: No validation on sort column
|
|
185
|
+
const sortBy = req.query.sort; // Could be "id; DROP TABLE users--"
|
|
186
|
+
const query = `SELECT * FROM users ORDER BY ${sortBy}`;
|
|
187
|
+
|
|
188
|
+
// ✅ GOOD: Whitelist validation
|
|
189
|
+
const ALLOWED_SORT_COLUMNS = ['id', 'name', 'email', 'created_at'];
|
|
190
|
+
const sortBy = req.query.sort;
|
|
191
|
+
|
|
192
|
+
if (!ALLOWED_SORT_COLUMNS.includes(sortBy)) {
|
|
193
|
+
throw new Error('Invalid sort column');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const query = `SELECT * FROM users ORDER BY ${sortBy}`;
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Output Encoding
|
|
202
|
+
|
|
203
|
+
### Prevent Data Leakage
|
|
204
|
+
|
|
205
|
+
**Sanitize output to prevent sensitive data exposure:**
|
|
206
|
+
|
|
207
|
+
```javascript
|
|
208
|
+
// ❌ BAD: Exposing sensitive fields
|
|
209
|
+
async function getUser(userId) {
|
|
210
|
+
const result = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
211
|
+
return result.rows[0]; // Includes password_hash, ssn, etc.
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ✅ GOOD: Select only necessary fields
|
|
215
|
+
async function getUser(userId) {
|
|
216
|
+
const result = await db.query(
|
|
217
|
+
'SELECT id, email, name, created_at FROM users WHERE id = $1',
|
|
218
|
+
[userId]
|
|
219
|
+
);
|
|
220
|
+
return result.rows[0];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ✅ BETTER: Use DTOs (Data Transfer Objects)
|
|
224
|
+
async function getUser(userId) {
|
|
225
|
+
const result = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
226
|
+
const user = result.rows[0];
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
id: user.id,
|
|
230
|
+
email: user.email,
|
|
231
|
+
name: user.name,
|
|
232
|
+
createdAt: user.created_at
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Least Privilege Access
|
|
240
|
+
|
|
241
|
+
### Role-Based Access Control (RBAC)
|
|
242
|
+
|
|
243
|
+
**Create roles with minimum necessary permissions:**
|
|
244
|
+
|
|
245
|
+
```sql
|
|
246
|
+
-- PostgreSQL: Create application roles
|
|
247
|
+
|
|
248
|
+
-- Read-only role
|
|
249
|
+
CREATE ROLE app_readonly;
|
|
250
|
+
GRANT CONNECT ON DATABASE mydb TO app_readonly;
|
|
251
|
+
GRANT USAGE ON SCHEMA public TO app_readonly;
|
|
252
|
+
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_readonly;
|
|
253
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_readonly;
|
|
254
|
+
|
|
255
|
+
-- Read-write role (no DELETE)
|
|
256
|
+
CREATE ROLE app_readwrite;
|
|
257
|
+
GRANT CONNECT ON DATABASE mydb TO app_readwrite;
|
|
258
|
+
GRANT USAGE ON SCHEMA public TO app_readwrite;
|
|
259
|
+
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_readwrite;
|
|
260
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE ON TABLES TO app_readwrite;
|
|
261
|
+
|
|
262
|
+
-- Admin role (full access)
|
|
263
|
+
CREATE ROLE app_admin;
|
|
264
|
+
GRANT ALL PRIVILEGES ON DATABASE mydb TO app_admin;
|
|
265
|
+
|
|
266
|
+
-- Create users with specific roles
|
|
267
|
+
CREATE USER app_reader WITH PASSWORD 'secure-password-1';
|
|
268
|
+
GRANT app_readonly TO app_reader;
|
|
269
|
+
|
|
270
|
+
CREATE USER app_writer WITH PASSWORD 'secure-password-2';
|
|
271
|
+
GRANT app_readwrite TO app_writer;
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Row-Level Security (RLS)
|
|
275
|
+
|
|
276
|
+
**Implement row-level security for multi-tenant applications:**
|
|
277
|
+
|
|
278
|
+
```sql
|
|
279
|
+
-- PostgreSQL: Enable row-level security
|
|
280
|
+
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
|
|
281
|
+
|
|
282
|
+
-- Policy: Users can only see their own documents
|
|
283
|
+
CREATE POLICY user_documents ON documents
|
|
284
|
+
FOR SELECT
|
|
285
|
+
USING (user_id = current_setting('app.user_id')::INTEGER);
|
|
286
|
+
|
|
287
|
+
-- Policy: Users can only update their own documents
|
|
288
|
+
CREATE POLICY user_documents_update ON documents
|
|
289
|
+
FOR UPDATE
|
|
290
|
+
USING (user_id = current_setting('app.user_id')::INTEGER);
|
|
291
|
+
|
|
292
|
+
-- Policy: Admins can see all documents
|
|
293
|
+
CREATE POLICY admin_documents ON documents
|
|
294
|
+
FOR ALL
|
|
295
|
+
USING (current_setting('app.user_role') = 'admin');
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
// Set user context before queries
|
|
300
|
+
async function getUserDocuments(userId) {
|
|
301
|
+
await db.query('SET app.user_id = $1', [userId]);
|
|
302
|
+
await db.query('SET app.user_role = $1', ['user']);
|
|
303
|
+
|
|
304
|
+
// RLS automatically filters results
|
|
305
|
+
const result = await db.query('SELECT * FROM documents');
|
|
306
|
+
return result.rows;
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Column-Level Security
|
|
311
|
+
|
|
312
|
+
**Restrict access to sensitive columns:**
|
|
313
|
+
|
|
314
|
+
```sql
|
|
315
|
+
-- PostgreSQL: Grant column-level permissions
|
|
316
|
+
GRANT SELECT (id, email, name) ON users TO app_readonly;
|
|
317
|
+
-- app_readonly cannot access password_hash, ssn, etc.
|
|
318
|
+
|
|
319
|
+
-- Grant specific columns for updates
|
|
320
|
+
GRANT UPDATE (name, email) ON users TO app_readwrite;
|
|
321
|
+
-- app_readwrite cannot update password_hash, role, etc.
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Encryption Strategies
|
|
327
|
+
|
|
328
|
+
### Encryption at Rest
|
|
329
|
+
|
|
330
|
+
**Database-level encryption:**
|
|
331
|
+
|
|
332
|
+
```sql
|
|
333
|
+
-- PostgreSQL: Use pgcrypto for column-level encryption
|
|
334
|
+
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
335
|
+
|
|
336
|
+
-- Encrypt sensitive data
|
|
337
|
+
CREATE TABLE users (
|
|
338
|
+
id SERIAL PRIMARY KEY,
|
|
339
|
+
email VARCHAR(255) NOT NULL,
|
|
340
|
+
ssn BYTEA, -- Encrypted
|
|
341
|
+
credit_card BYTEA, -- Encrypted
|
|
342
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
-- Insert encrypted data
|
|
346
|
+
INSERT INTO users (email, ssn, credit_card)
|
|
347
|
+
VALUES (
|
|
348
|
+
'user@example.com',
|
|
349
|
+
pgp_sym_encrypt('123-45-6789', current_setting('app.encryption_key')),
|
|
350
|
+
pgp_sym_encrypt('4111-1111-1111-1111', current_setting('app.encryption_key'))
|
|
351
|
+
);
|
|
352
|
+
|
|
353
|
+
-- Query encrypted data
|
|
354
|
+
SELECT
|
|
355
|
+
id,
|
|
356
|
+
email,
|
|
357
|
+
pgp_sym_decrypt(ssn, current_setting('app.encryption_key')) AS ssn,
|
|
358
|
+
pgp_sym_decrypt(credit_card, current_setting('app.encryption_key')) AS credit_card
|
|
359
|
+
FROM users
|
|
360
|
+
WHERE id = 1;
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**Application-level encryption:**
|
|
364
|
+
|
|
365
|
+
```javascript
|
|
366
|
+
const crypto = require('crypto');
|
|
367
|
+
|
|
368
|
+
// Encryption configuration
|
|
369
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
370
|
+
const KEY = Buffer.from(process.env.ENCRYPTION_KEY, 'hex'); // 32 bytes
|
|
371
|
+
|
|
372
|
+
function encrypt(text) {
|
|
373
|
+
const iv = crypto.randomBytes(16);
|
|
374
|
+
const cipher = crypto.createCipheriv(ALGORITHM, KEY, iv);
|
|
375
|
+
|
|
376
|
+
let encrypted = cipher.update(text, 'utf8', 'hex');
|
|
377
|
+
encrypted += cipher.final('hex');
|
|
378
|
+
|
|
379
|
+
const authTag = cipher.getAuthTag();
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
encrypted,
|
|
383
|
+
iv: iv.toString('hex'),
|
|
384
|
+
authTag: authTag.toString('hex')
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function decrypt(encrypted, iv, authTag) {
|
|
389
|
+
const decipher = crypto.createDecipheriv(
|
|
390
|
+
ALGORITHM,
|
|
391
|
+
KEY,
|
|
392
|
+
Buffer.from(iv, 'hex')
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
decipher.setAuthTag(Buffer.from(authTag, 'hex'));
|
|
396
|
+
|
|
397
|
+
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
|
|
398
|
+
decrypted += decipher.final('utf8');
|
|
399
|
+
|
|
400
|
+
return decrypted;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Usage
|
|
404
|
+
async function createUser(userData) {
|
|
405
|
+
const encryptedSSN = encrypt(userData.ssn);
|
|
406
|
+
|
|
407
|
+
await db.query(
|
|
408
|
+
'INSERT INTO users (email, ssn, ssn_iv, ssn_auth_tag) VALUES ($1, $2, $3, $4)',
|
|
409
|
+
[userData.email, encryptedSSN.encrypted, encryptedSSN.iv, encryptedSSN.authTag]
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### Encryption in Transit
|
|
415
|
+
|
|
416
|
+
**Always use SSL/TLS connections:**
|
|
417
|
+
|
|
418
|
+
```javascript
|
|
419
|
+
// PostgreSQL with SSL
|
|
420
|
+
const { Pool } = require('pg');
|
|
421
|
+
|
|
422
|
+
const pool = new Pool({
|
|
423
|
+
host: process.env.DB_HOST,
|
|
424
|
+
database: process.env.DB_NAME,
|
|
425
|
+
user: process.env.DB_USER,
|
|
426
|
+
password: process.env.DB_PASSWORD,
|
|
427
|
+
ssl: {
|
|
428
|
+
rejectUnauthorized: true,
|
|
429
|
+
ca: fs.readFileSync('/path/to/ca-cert.pem').toString(),
|
|
430
|
+
key: fs.readFileSync('/path/to/client-key.pem').toString(),
|
|
431
|
+
cert: fs.readFileSync('/path/to/client-cert.pem').toString()
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
```python
|
|
437
|
+
# MySQL with SSL (Python)
|
|
438
|
+
import mysql.connector
|
|
439
|
+
|
|
440
|
+
connection = mysql.connector.connect(
|
|
441
|
+
host='db.example.com',
|
|
442
|
+
user='dbuser',
|
|
443
|
+
password=os.environ['DB_PASSWORD'],
|
|
444
|
+
database='mydb',
|
|
445
|
+
ssl_ca='/path/to/ca-cert.pem',
|
|
446
|
+
ssl_cert='/path/to/client-cert.pem',
|
|
447
|
+
ssl_key='/path/to/client-key.pem',
|
|
448
|
+
ssl_verify_cert=True
|
|
449
|
+
)
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Secure Connection Strings
|
|
455
|
+
|
|
456
|
+
### Environment Variables
|
|
457
|
+
|
|
458
|
+
**Store connection strings in environment variables:**
|
|
459
|
+
|
|
460
|
+
```javascript
|
|
461
|
+
// ❌ BAD: Hardcoded connection string
|
|
462
|
+
const pool = new Pool({
|
|
463
|
+
connectionString: 'postgresql://admin:password123@db.example.com:5432/mydb'
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
// ✅ GOOD: Environment variable
|
|
467
|
+
const pool = new Pool({
|
|
468
|
+
connectionString: process.env.DATABASE_URL
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
// ✅ BETTER: Individual environment variables
|
|
472
|
+
const pool = new Pool({
|
|
473
|
+
host: process.env.DB_HOST,
|
|
474
|
+
port: parseInt(process.env.DB_PORT, 10),
|
|
475
|
+
database: process.env.DB_NAME,
|
|
476
|
+
user: process.env.DB_USER,
|
|
477
|
+
password: process.env.DB_PASSWORD
|
|
478
|
+
});
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Secrets Management
|
|
482
|
+
|
|
483
|
+
**Use dedicated secrets management systems:**
|
|
484
|
+
|
|
485
|
+
```javascript
|
|
486
|
+
// AWS Secrets Manager
|
|
487
|
+
const AWS = require('aws-sdk');
|
|
488
|
+
const secretsManager = new AWS.SecretsManager({ region: 'us-east-1' });
|
|
489
|
+
|
|
490
|
+
async function getDatabaseCredentials() {
|
|
491
|
+
const secret = await secretsManager.getSecretValue({
|
|
492
|
+
SecretId: 'prod/database/credentials'
|
|
493
|
+
}).promise();
|
|
494
|
+
|
|
495
|
+
return JSON.parse(secret.SecretString);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
async function createDatabasePool() {
|
|
499
|
+
const credentials = await getDatabaseCredentials();
|
|
500
|
+
|
|
501
|
+
return new Pool({
|
|
502
|
+
host: credentials.host,
|
|
503
|
+
database: credentials.database,
|
|
504
|
+
user: credentials.username,
|
|
505
|
+
password: credentials.password,
|
|
506
|
+
ssl: { rejectUnauthorized: true }
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
```javascript
|
|
512
|
+
// HashiCorp Vault
|
|
513
|
+
const vault = require('node-vault')({
|
|
514
|
+
endpoint: process.env.VAULT_ADDR,
|
|
515
|
+
token: process.env.VAULT_TOKEN
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
async function getDatabaseCredentials() {
|
|
519
|
+
const result = await vault.read('secret/data/database/prod');
|
|
520
|
+
return result.data.data;
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## Audit Logging
|
|
527
|
+
|
|
528
|
+
### Comprehensive Audit Trail
|
|
529
|
+
|
|
530
|
+
**Log all database operations for sensitive data:**
|
|
531
|
+
|
|
532
|
+
```sql
|
|
533
|
+
-- Create audit log table
|
|
534
|
+
CREATE TABLE audit_log (
|
|
535
|
+
id BIGSERIAL PRIMARY KEY,
|
|
536
|
+
table_name VARCHAR(255) NOT NULL,
|
|
537
|
+
record_id BIGINT NOT NULL,
|
|
538
|
+
operation VARCHAR(10) NOT NULL, -- INSERT, UPDATE, DELETE, SELECT
|
|
539
|
+
user_id BIGINT,
|
|
540
|
+
user_ip INET,
|
|
541
|
+
user_agent TEXT,
|
|
542
|
+
old_values JSONB,
|
|
543
|
+
new_values JSONB,
|
|
544
|
+
changed_fields TEXT[],
|
|
545
|
+
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
546
|
+
INDEX idx_audit_table_record (table_name, record_id),
|
|
547
|
+
INDEX idx_audit_user (user_id),
|
|
548
|
+
INDEX idx_audit_timestamp (timestamp)
|
|
549
|
+
);
|
|
550
|
+
|
|
551
|
+
-- Audit trigger function
|
|
552
|
+
CREATE OR REPLACE FUNCTION audit_trigger()
|
|
553
|
+
RETURNS TRIGGER AS $$
|
|
554
|
+
DECLARE
|
|
555
|
+
old_data JSONB;
|
|
556
|
+
new_data JSONB;
|
|
557
|
+
changed_fields TEXT[];
|
|
558
|
+
BEGIN
|
|
559
|
+
IF (TG_OP = 'DELETE') THEN
|
|
560
|
+
old_data = to_jsonb(OLD);
|
|
561
|
+
new_data = NULL;
|
|
562
|
+
ELSIF (TG_OP = 'UPDATE') THEN
|
|
563
|
+
old_data = to_jsonb(OLD);
|
|
564
|
+
new_data = to_jsonb(NEW);
|
|
565
|
+
|
|
566
|
+
-- Identify changed fields
|
|
567
|
+
SELECT array_agg(key)
|
|
568
|
+
INTO changed_fields
|
|
569
|
+
FROM jsonb_each(old_data)
|
|
570
|
+
WHERE old_data->key IS DISTINCT FROM new_data->key;
|
|
571
|
+
ELSIF (TG_OP = 'INSERT') THEN
|
|
572
|
+
old_data = NULL;
|
|
573
|
+
new_data = to_jsonb(NEW);
|
|
574
|
+
END IF;
|
|
575
|
+
|
|
576
|
+
INSERT INTO audit_log (
|
|
577
|
+
table_name,
|
|
578
|
+
record_id,
|
|
579
|
+
operation,
|
|
580
|
+
user_id,
|
|
581
|
+
user_ip,
|
|
582
|
+
old_values,
|
|
583
|
+
new_values,
|
|
584
|
+
changed_fields
|
|
585
|
+
) VALUES (
|
|
586
|
+
TG_TABLE_NAME,
|
|
587
|
+
COALESCE(NEW.id, OLD.id),
|
|
588
|
+
TG_OP,
|
|
589
|
+
current_setting('app.user_id', true)::BIGINT,
|
|
590
|
+
current_setting('app.user_ip', true)::INET,
|
|
591
|
+
old_data,
|
|
592
|
+
new_data,
|
|
593
|
+
changed_fields
|
|
594
|
+
);
|
|
595
|
+
|
|
596
|
+
RETURN COALESCE(NEW, OLD);
|
|
597
|
+
END;
|
|
598
|
+
$$ LANGUAGE plpgsql;
|
|
599
|
+
|
|
600
|
+
-- Apply audit trigger to sensitive tables
|
|
601
|
+
CREATE TRIGGER audit_users
|
|
602
|
+
AFTER INSERT OR UPDATE OR DELETE ON users
|
|
603
|
+
FOR EACH ROW EXECUTE FUNCTION audit_trigger();
|
|
604
|
+
|
|
605
|
+
CREATE TRIGGER audit_transactions
|
|
606
|
+
AFTER INSERT OR UPDATE OR DELETE ON transactions
|
|
607
|
+
FOR EACH ROW EXECUTE FUNCTION audit_trigger();
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Application-Level Audit Logging
|
|
611
|
+
|
|
612
|
+
```javascript
|
|
613
|
+
// Middleware for audit logging
|
|
614
|
+
async function auditLog(req, res, next) {
|
|
615
|
+
const originalQuery = db.query.bind(db);
|
|
616
|
+
|
|
617
|
+
db.query = async function(query, params) {
|
|
618
|
+
const result = await originalQuery(query, params);
|
|
619
|
+
|
|
620
|
+
// Log query execution
|
|
621
|
+
await originalQuery(
|
|
622
|
+
'INSERT INTO query_audit_log (user_id, query, params, ip_address, user_agent) VALUES ($1, $2, $3, $4, $5)',
|
|
623
|
+
[
|
|
624
|
+
req.user?.id,
|
|
625
|
+
query,
|
|
626
|
+
JSON.stringify(params),
|
|
627
|
+
req.ip,
|
|
628
|
+
req.get('user-agent')
|
|
629
|
+
]
|
|
630
|
+
);
|
|
631
|
+
|
|
632
|
+
return result;
|
|
633
|
+
};
|
|
634
|
+
|
|
635
|
+
next();
|
|
636
|
+
}
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
---
|
|
640
|
+
|
|
641
|
+
## Compliance Requirements
|
|
642
|
+
|
|
643
|
+
### GDPR (General Data Protection Regulation)
|
|
644
|
+
|
|
645
|
+
**Key Requirements:**
|
|
646
|
+
- ✅ Data minimization: Collect only necessary data
|
|
647
|
+
- ✅ Purpose limitation: Use data only for stated purposes
|
|
648
|
+
- ✅ Storage limitation: Delete data when no longer needed
|
|
649
|
+
- ✅ Right to access: Provide user data on request
|
|
650
|
+
- ✅ Right to erasure: Delete user data on request
|
|
651
|
+
- ✅ Data portability: Export user data in machine-readable format
|
|
652
|
+
- ✅ Consent management: Track and honor user consent
|
|
653
|
+
|
|
654
|
+
```sql
|
|
655
|
+
-- GDPR: Right to access
|
|
656
|
+
CREATE OR REPLACE FUNCTION export_user_data(p_user_id INTEGER)
|
|
657
|
+
RETURNS JSONB AS $$
|
|
658
|
+
DECLARE
|
|
659
|
+
user_data JSONB;
|
|
660
|
+
BEGIN
|
|
661
|
+
SELECT jsonb_build_object(
|
|
662
|
+
'user', (SELECT row_to_json(u.*) FROM users u WHERE u.id = p_user_id),
|
|
663
|
+
'orders', (SELECT jsonb_agg(o.*) FROM orders o WHERE o.user_id = p_user_id),
|
|
664
|
+
'preferences', (SELECT row_to_json(p.*) FROM user_preferences p WHERE p.user_id = p_user_id),
|
|
665
|
+
'audit_log', (SELECT jsonb_agg(a.*) FROM audit_log a WHERE a.user_id = p_user_id)
|
|
666
|
+
) INTO user_data;
|
|
667
|
+
|
|
668
|
+
RETURN user_data;
|
|
669
|
+
END;
|
|
670
|
+
$$ LANGUAGE plpgsql;
|
|
671
|
+
|
|
672
|
+
-- GDPR: Right to erasure
|
|
673
|
+
CREATE OR REPLACE FUNCTION delete_user_data(p_user_id INTEGER)
|
|
674
|
+
RETURNS VOID AS $$
|
|
675
|
+
BEGIN
|
|
676
|
+
-- Anonymize instead of delete (for audit trail)
|
|
677
|
+
UPDATE users
|
|
678
|
+
SET
|
|
679
|
+
email = 'deleted_' || id || '@example.com',
|
|
680
|
+
name = 'DELETED',
|
|
681
|
+
phone = NULL,
|
|
682
|
+
address = NULL,
|
|
683
|
+
deleted_at = CURRENT_TIMESTAMP
|
|
684
|
+
WHERE id = p_user_id;
|
|
685
|
+
|
|
686
|
+
-- Delete related data
|
|
687
|
+
DELETE FROM user_preferences WHERE user_id = p_user_id;
|
|
688
|
+
DELETE FROM sessions WHERE user_id = p_user_id;
|
|
689
|
+
|
|
690
|
+
-- Keep orders for legal/accounting purposes but anonymize
|
|
691
|
+
UPDATE orders
|
|
692
|
+
SET user_id = NULL
|
|
693
|
+
WHERE user_id = p_user_id;
|
|
694
|
+
END;
|
|
695
|
+
$$ LANGUAGE plpgsql;
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
### HIPAA (Health Insurance Portability and Accountability Act)
|
|
699
|
+
|
|
700
|
+
**Key Requirements:**
|
|
701
|
+
- ✅ Access controls: Limit access to PHI (Protected Health Information)
|
|
702
|
+
- ✅ Audit controls: Log all access to PHI
|
|
703
|
+
- ✅ Integrity controls: Ensure PHI is not altered or destroyed
|
|
704
|
+
- ✅ Transmission security: Encrypt PHI in transit
|
|
705
|
+
- ✅ Encryption: Encrypt PHI at rest
|
|
706
|
+
|
|
707
|
+
```sql
|
|
708
|
+
-- HIPAA: Audit all PHI access
|
|
709
|
+
CREATE TABLE phi_access_log (
|
|
710
|
+
id BIGSERIAL PRIMARY KEY,
|
|
711
|
+
user_id BIGINT NOT NULL,
|
|
712
|
+
patient_id BIGINT NOT NULL,
|
|
713
|
+
access_type VARCHAR(50) NOT NULL, -- VIEW, EDIT, DELETE
|
|
714
|
+
accessed_fields TEXT[],
|
|
715
|
+
ip_address INET,
|
|
716
|
+
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
717
|
+
INDEX idx_phi_patient (patient_id),
|
|
718
|
+
INDEX idx_phi_user (user_id),
|
|
719
|
+
INDEX idx_phi_timestamp (timestamp)
|
|
720
|
+
);
|
|
721
|
+
|
|
722
|
+
-- Trigger to log PHI access
|
|
723
|
+
CREATE OR REPLACE FUNCTION log_phi_access()
|
|
724
|
+
RETURNS TRIGGER AS $$
|
|
725
|
+
BEGIN
|
|
726
|
+
INSERT INTO phi_access_log (user_id, patient_id, access_type, accessed_fields)
|
|
727
|
+
VALUES (
|
|
728
|
+
current_setting('app.user_id')::BIGINT,
|
|
729
|
+
NEW.id,
|
|
730
|
+
TG_OP,
|
|
731
|
+
ARRAY['medical_record_number', 'diagnosis', 'treatment']
|
|
732
|
+
);
|
|
733
|
+
|
|
734
|
+
RETURN NEW;
|
|
735
|
+
END;
|
|
736
|
+
$$ LANGUAGE plpgsql;
|
|
737
|
+
|
|
738
|
+
CREATE TRIGGER log_patient_access
|
|
739
|
+
AFTER SELECT OR UPDATE ON patients
|
|
740
|
+
FOR EACH ROW EXECUTE FUNCTION log_phi_access();
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
### PCI DSS (Payment Card Industry Data Security Standard)
|
|
744
|
+
|
|
745
|
+
**Key Requirements:**
|
|
746
|
+
- ✅ Never store full magnetic stripe, CVV2, or PIN data
|
|
747
|
+
- ✅ Encrypt cardholder data at rest
|
|
748
|
+
- ✅ Encrypt cardholder data in transit
|
|
749
|
+
- ✅ Implement strong access controls
|
|
750
|
+
- ✅ Regularly test security systems
|
|
751
|
+
|
|
752
|
+
```sql
|
|
753
|
+
-- PCI DSS: Store only necessary card data
|
|
754
|
+
CREATE TABLE payment_methods (
|
|
755
|
+
id BIGSERIAL PRIMARY KEY,
|
|
756
|
+
user_id BIGINT NOT NULL,
|
|
757
|
+
card_last_four CHAR(4) NOT NULL, -- Only last 4 digits
|
|
758
|
+
card_brand VARCHAR(20) NOT NULL, -- Visa, Mastercard, etc.
|
|
759
|
+
expiry_month SMALLINT NOT NULL,
|
|
760
|
+
expiry_year SMALLINT NOT NULL,
|
|
761
|
+
billing_zip VARCHAR(10),
|
|
762
|
+
token VARCHAR(255) NOT NULL, -- Payment gateway token
|
|
763
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
764
|
+
-- DO NOT store: full card number, CVV, magnetic stripe data
|
|
765
|
+
INDEX idx_payment_user (user_id)
|
|
766
|
+
);
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
---
|
|
770
|
+
|
|
771
|
+
## Security Best Practices Summary
|
|
772
|
+
|
|
773
|
+
### Input Security
|
|
774
|
+
|
|
775
|
+
✅ **DO:**
|
|
776
|
+
- Use parameterized queries/prepared statements
|
|
777
|
+
- Validate all input (type, format, range)
|
|
778
|
+
- Use whitelist validation for limited options
|
|
779
|
+
- Use ORMs or query builders for dynamic queries
|
|
780
|
+
- Sanitize input before database operations
|
|
781
|
+
|
|
782
|
+
❌ **DON'T:**
|
|
783
|
+
- Concatenate user input into SQL queries
|
|
784
|
+
- Trust user input without validation
|
|
785
|
+
- Use dynamic SQL without parameterization
|
|
786
|
+
- Skip input validation
|
|
787
|
+
|
|
788
|
+
### Access Control
|
|
789
|
+
|
|
790
|
+
✅ **DO:**
|
|
791
|
+
- Implement least privilege access
|
|
792
|
+
- Use role-based access control (RBAC)
|
|
793
|
+
- Enable row-level security for multi-tenant apps
|
|
794
|
+
- Use column-level permissions for sensitive data
|
|
795
|
+
- Regularly audit and review permissions
|
|
796
|
+
|
|
797
|
+
❌ **DON'T:**
|
|
798
|
+
- Use superuser accounts for applications
|
|
799
|
+
- Share credentials between environments
|
|
800
|
+
- Grant excessive permissions
|
|
801
|
+
- Skip access control reviews
|
|
802
|
+
|
|
803
|
+
### Encryption
|
|
804
|
+
|
|
805
|
+
✅ **DO:**
|
|
806
|
+
- Encrypt sensitive data at rest
|
|
807
|
+
- Use SSL/TLS for all connections
|
|
808
|
+
- Store encryption keys in secure key management systems
|
|
809
|
+
- Rotate encryption keys regularly
|
|
810
|
+
- Use strong encryption algorithms (AES-256)
|
|
811
|
+
|
|
812
|
+
❌ **DON'T:**
|
|
813
|
+
- Store encryption keys in code or version control
|
|
814
|
+
- Use weak encryption algorithms
|
|
815
|
+
- Skip encryption for sensitive data
|
|
816
|
+
- Allow unencrypted connections
|
|
817
|
+
|
|
818
|
+
### Audit & Compliance
|
|
819
|
+
|
|
820
|
+
✅ **DO:**
|
|
821
|
+
- Log all access to sensitive data
|
|
822
|
+
- Implement comprehensive audit trails
|
|
823
|
+
- Understand compliance requirements (GDPR, HIPAA, PCI DSS)
|
|
824
|
+
- Regularly review audit logs
|
|
825
|
+
- Implement data retention policies
|
|
826
|
+
|
|
827
|
+
❌ **DON'T:**
|
|
828
|
+
- Skip audit logging for sensitive operations
|
|
829
|
+
- Ignore compliance requirements
|
|
830
|
+
- Store data longer than necessary
|
|
831
|
+
- Fail to implement user data export/deletion
|
|
832
|
+
|
|
833
|
+
### Secrets Management
|
|
834
|
+
|
|
835
|
+
✅ **DO:**
|
|
836
|
+
- Use environment variables for connection strings
|
|
837
|
+
- Use dedicated secrets management systems (AWS Secrets Manager, Vault)
|
|
838
|
+
- Rotate credentials regularly
|
|
839
|
+
- Use different credentials per environment
|
|
840
|
+
- Implement credential rotation
|
|
841
|
+
|
|
842
|
+
❌ **DON'T:**
|
|
843
|
+
- Hardcode credentials in code
|
|
844
|
+
- Commit credentials to version control
|
|
845
|
+
- Share credentials via email or chat
|
|
846
|
+
- Use same credentials across environments
|
|
847
|
+
|
|
848
|
+
---
|
|
849
|
+
|
|
850
|
+
## Common Security Vulnerabilities
|
|
851
|
+
|
|
852
|
+
### SQL Injection
|
|
853
|
+
|
|
854
|
+
**Vulnerability:**
|
|
855
|
+
```javascript
|
|
856
|
+
// ❌ VULNERABLE
|
|
857
|
+
const query = `SELECT * FROM users WHERE email = '${req.body.email}'`;
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
**Attack:**
|
|
861
|
+
```
|
|
862
|
+
email = "' OR '1'='1' --"
|
|
863
|
+
Result: SELECT * FROM users WHERE email = '' OR '1'='1' --'
|
|
864
|
+
```
|
|
865
|
+
|
|
866
|
+
**Fix:**
|
|
867
|
+
```javascript
|
|
868
|
+
// ✅ SECURE
|
|
869
|
+
const query = 'SELECT * FROM users WHERE email = $1';
|
|
870
|
+
const result = await db.query(query, [req.body.email]);
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
### NoSQL Injection
|
|
874
|
+
|
|
875
|
+
**Vulnerability:**
|
|
876
|
+
```javascript
|
|
877
|
+
// ❌ VULNERABLE
|
|
878
|
+
const user = await db.users.findOne({
|
|
879
|
+
email: req.body.email,
|
|
880
|
+
password: req.body.password
|
|
881
|
+
});
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
**Attack:**
|
|
885
|
+
```json
|
|
886
|
+
{
|
|
887
|
+
"email": "admin@example.com",
|
|
888
|
+
"password": { "$ne": null }
|
|
889
|
+
}
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
**Fix:**
|
|
893
|
+
```javascript
|
|
894
|
+
// ✅ SECURE
|
|
895
|
+
const email = String(req.body.email);
|
|
896
|
+
const password = String(req.body.password);
|
|
897
|
+
|
|
898
|
+
const user = await db.users.findOne({ email, password });
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
### Insufficient Access Controls
|
|
902
|
+
|
|
903
|
+
**Vulnerability:**
|
|
904
|
+
```javascript
|
|
905
|
+
// ❌ VULNERABLE: No authorization check
|
|
906
|
+
async function deleteUser(userId) {
|
|
907
|
+
await db.query('DELETE FROM users WHERE id = $1', [userId]);
|
|
908
|
+
}
|
|
909
|
+
```
|
|
910
|
+
|
|
911
|
+
**Fix:**
|
|
912
|
+
```javascript
|
|
913
|
+
// ✅ SECURE: Check authorization
|
|
914
|
+
async function deleteUser(userId, requestingUserId) {
|
|
915
|
+
// Check if requesting user is admin or deleting their own account
|
|
916
|
+
const requestingUser = await getUser(requestingUserId);
|
|
917
|
+
|
|
918
|
+
if (requestingUser.role !== 'admin' && requestingUserId !== userId) {
|
|
919
|
+
throw new Error('Unauthorized');
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
await db.query('DELETE FROM users WHERE id = $1', [userId]);
|
|
923
|
+
}
|
|
924
|
+
```
|
|
925
|
+
|
|
926
|
+
---
|
|
927
|
+
|
|
928
|
+
## Security Checklist
|
|
929
|
+
|
|
930
|
+
### Development
|
|
931
|
+
|
|
932
|
+
- [ ] Use parameterized queries for all database operations
|
|
933
|
+
- [ ] Validate and sanitize all input
|
|
934
|
+
- [ ] Implement least privilege access
|
|
935
|
+
- [ ] Encrypt sensitive data at rest
|
|
936
|
+
- [ ] Use SSL/TLS for all connections
|
|
937
|
+
- [ ] Store secrets in secure management systems
|
|
938
|
+
- [ ] Implement comprehensive audit logging
|
|
939
|
+
- [ ] Follow compliance requirements (GDPR, HIPAA, PCI DSS)
|
|
940
|
+
|
|
941
|
+
### Deployment
|
|
942
|
+
|
|
943
|
+
- [ ] Use different credentials per environment
|
|
944
|
+
- [ ] Enable database firewall rules
|
|
945
|
+
- [ ] Restrict database access to application servers only
|
|
946
|
+
- [ ] Enable SSL/TLS certificate verification
|
|
947
|
+
- [ ] Configure automatic security updates
|
|
948
|
+
- [ ] Set up intrusion detection
|
|
949
|
+
- [ ] Implement rate limiting
|
|
950
|
+
- [ ] Enable query logging for production
|
|
951
|
+
|
|
952
|
+
### Monitoring
|
|
953
|
+
|
|
954
|
+
- [ ] Monitor failed login attempts
|
|
955
|
+
- [ ] Alert on suspicious query patterns
|
|
956
|
+
- [ ] Review audit logs regularly
|
|
957
|
+
- [ ] Track access to sensitive data
|
|
958
|
+
- [ ] Monitor for SQL injection attempts
|
|
959
|
+
- [ ] Set up security incident response procedures
|
|
960
|
+
|
|
961
|
+
---
|
|
962
|
+
|
|
963
|
+
## Summary
|
|
964
|
+
|
|
965
|
+
**Key Security Principles:**
|
|
966
|
+
|
|
967
|
+
1. **Defense in Depth**: Multiple layers of security (input validation, parameterized queries, access controls, encryption)
|
|
968
|
+
2. **Least Privilege**: Grant minimum necessary permissions
|
|
969
|
+
3. **Encryption Everywhere**: Encrypt data at rest and in transit
|
|
970
|
+
4. **Audit Everything**: Log all access to sensitive data
|
|
971
|
+
5. **Compliance First**: Understand and implement regulatory requirements
|
|
972
|
+
|
|
973
|
+
**Critical Rules:**
|
|
974
|
+
- ❌ NEVER concatenate user input into SQL queries
|
|
975
|
+
- ❌ NEVER store credentials in code or version control
|
|
976
|
+
- ❌ NEVER use superuser accounts for applications
|
|
977
|
+
- ❌ NEVER skip input validation
|
|
978
|
+
- ❌ NEVER allow unencrypted connections to production databases
|
|
979
|
+
|
|
980
|
+
|