@mytechtoday/augment-extensions 0.7.0 → 1.2.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.
Files changed (483) hide show
  1. package/AGENTS.md +265 -232
  2. package/README.md +956 -771
  3. package/augment-extensions/coding-standards/bash/README.md +196 -196
  4. package/augment-extensions/coding-standards/bash/module.json +163 -163
  5. package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
  6. package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
  7. package/augment-extensions/coding-standards/css/README.md +40 -40
  8. package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
  9. package/augment-extensions/coding-standards/css/module.json +44 -44
  10. package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
  11. package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
  12. package/augment-extensions/coding-standards/html/README.md +40 -40
  13. package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
  14. package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
  15. package/augment-extensions/coding-standards/html/module.json +44 -44
  16. package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
  17. package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
  18. package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
  19. package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
  20. package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
  21. package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
  22. package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
  23. package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
  24. package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
  25. package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
  26. package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
  27. package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
  28. package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
  29. package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
  30. package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
  31. package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
  32. package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
  33. package/augment-extensions/coding-standards/js/README.md +46 -46
  34. package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
  35. package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
  36. package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
  37. package/augment-extensions/coding-standards/js/module.json +49 -49
  38. package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
  39. package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
  40. package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
  41. package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
  42. package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
  43. package/augment-extensions/coding-standards/php/README.md +248 -248
  44. package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
  45. package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
  46. package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
  47. package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
  48. package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
  49. package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
  50. package/augment-extensions/coding-standards/php/module.json +166 -166
  51. package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
  52. package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
  53. package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
  54. package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
  55. package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
  56. package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
  57. package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
  58. package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
  59. package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
  60. package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
  61. package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
  62. package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
  63. package/augment-extensions/coding-standards/php/rules/security.md +358 -358
  64. package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
  65. package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
  66. package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
  67. package/augment-extensions/coding-standards/powershell/README.md +154 -154
  68. package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
  69. package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
  70. package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
  71. package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
  72. package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
  73. package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
  74. package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
  75. package/augment-extensions/coding-standards/powershell/module.json +165 -165
  76. package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
  77. package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
  78. package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
  79. package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
  80. package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
  81. package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
  82. package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
  83. package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
  84. package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
  85. package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
  86. package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
  87. package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
  88. package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
  89. package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
  90. package/augment-extensions/coding-standards/python/README.md +48 -48
  91. package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
  92. package/augment-extensions/coding-standards/python/module.json +30 -30
  93. package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
  94. package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
  95. package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
  96. package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
  97. package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
  98. package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
  99. package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
  100. package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
  101. package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
  102. package/augment-extensions/coding-standards/react/README.md +45 -45
  103. package/augment-extensions/coding-standards/react/module.json +27 -27
  104. package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
  105. package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
  106. package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
  107. package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
  108. package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
  109. package/augment-extensions/coding-standards/typescript/README.md +45 -45
  110. package/augment-extensions/coding-standards/typescript/module.json +27 -27
  111. package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
  112. package/augment-extensions/collections/html-css-js/README.md +82 -82
  113. package/augment-extensions/collections/html-css-js/collection.json +41 -41
  114. package/augment-extensions/domain-rules/api-design/README.md +41 -41
  115. package/augment-extensions/domain-rules/api-design/module.json +27 -27
  116. package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
  117. package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
  118. package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
  119. package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
  120. package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
  121. package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
  122. package/augment-extensions/domain-rules/database/README.md +161 -161
  123. package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
  124. package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
  125. package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
  126. package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
  127. package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
  128. package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
  129. package/augment-extensions/domain-rules/database/module.json +28 -28
  130. package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
  131. package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
  132. package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
  133. package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
  134. package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
  135. package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
  136. package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
  137. package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
  138. package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
  139. package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
  140. package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
  141. package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
  142. package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
  143. package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
  144. package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
  145. package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
  146. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
  147. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
  148. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
  149. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
  150. package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
  151. package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
  152. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
  153. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
  154. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
  155. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
  156. package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
  157. package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
  158. package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
  159. package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
  160. package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
  161. package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
  162. package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
  163. package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
  164. package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
  165. package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
  166. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
  167. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
  168. package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
  169. package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
  170. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
  171. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
  172. package/augment-extensions/domain-rules/mcp/README.md +150 -150
  173. package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
  174. package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
  175. package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
  176. package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
  177. package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
  178. package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
  179. package/augment-extensions/domain-rules/mcp/module.json +49 -49
  180. package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
  181. package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
  182. package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
  183. package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
  184. package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
  185. package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
  186. package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
  187. package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
  188. package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
  189. package/augment-extensions/domain-rules/security/README.md +41 -41
  190. package/augment-extensions/domain-rules/security/module.json +28 -28
  191. package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
  192. package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
  193. package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
  194. package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
  195. package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
  196. package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
  197. package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
  198. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
  199. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
  200. package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
  201. package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
  202. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
  203. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
  204. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
  205. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
  206. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
  207. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
  208. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
  209. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
  210. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
  211. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
  212. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
  213. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
  214. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
  215. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
  216. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
  217. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
  218. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
  219. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
  220. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
  221. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
  222. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
  223. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
  224. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
  225. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
  226. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
  227. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
  228. package/augment-extensions/domain-rules/wordpress/README.md +163 -163
  229. package/augment-extensions/domain-rules/wordpress/module.json +32 -32
  230. package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
  231. package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
  232. package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
  233. package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
  234. package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
  235. package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
  236. package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
  237. package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
  238. package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
  239. package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
  240. package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
  241. package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
  242. package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
  243. package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
  244. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
  245. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
  246. package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
  247. package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
  248. package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
  249. package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
  250. package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
  251. package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
  252. package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
  253. package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
  254. package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
  255. package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
  256. package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
  257. package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
  258. package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
  259. package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
  260. package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
  261. package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
  262. package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
  263. package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
  264. package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
  265. package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
  266. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
  267. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
  268. package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
  269. package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
  270. package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
  271. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
  272. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
  273. package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
  274. package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
  275. package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
  276. package/augment-extensions/examples/design-patterns/README.md +37 -37
  277. package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
  278. package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
  279. package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
  280. package/augment-extensions/examples/design-patterns/module.json +27 -27
  281. package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
  282. package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
  283. package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
  284. package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
  285. package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
  286. package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
  287. package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
  288. package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
  289. package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
  290. package/augment-extensions/workflows/beads/README.md +135 -135
  291. package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
  292. package/augment-extensions/workflows/beads/module.json +55 -55
  293. package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
  294. package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
  295. package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
  296. package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
  297. package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
  298. package/augment-extensions/workflows/beads-integration/README.md +143 -143
  299. package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
  300. package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
  301. package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
  302. package/augment-extensions/workflows/beads-integration/module.json +75 -75
  303. package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
  304. package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
  305. package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
  306. package/augment-extensions/workflows/database/README.md +195 -195
  307. package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
  308. package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
  309. package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
  310. package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
  311. package/augment-extensions/workflows/database/module.json +42 -42
  312. package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
  313. package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
  314. package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
  315. package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
  316. package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
  317. package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
  318. package/augment-extensions/workflows/database/rules/workflow.md +458 -458
  319. package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
  320. package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
  321. package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
  322. package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
  323. package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
  324. package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
  325. package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
  326. package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
  327. package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
  328. package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
  329. package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
  330. package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
  331. package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
  332. package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
  333. package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
  334. package/augment-extensions/writing-standards/screenplay/README.md +339 -300
  335. package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
  336. package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
  337. package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
  338. package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
  339. package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
  340. package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
  341. package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
  342. package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
  343. package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
  344. package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
  345. package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
  346. package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
  347. package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
  348. package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
  349. package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
  350. package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
  351. package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
  352. package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
  353. package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
  354. package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
  355. package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
  356. package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
  357. package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
  358. package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
  359. package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
  360. package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
  361. package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
  362. package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
  363. package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
  364. package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
  365. package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
  366. package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
  367. package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
  368. package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
  369. package/augment-extensions/writing-standards/screenplay/module.json +124 -124
  370. package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
  371. package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
  372. package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
  373. package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
  374. package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
  375. package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
  376. package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
  377. package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
  378. package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
  379. package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
  380. package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
  381. package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
  382. package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
  383. package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
  384. package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
  385. package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
  386. package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
  387. package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
  388. package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
  389. package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
  390. package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
  391. package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
  392. package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
  393. package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
  394. package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
  395. package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
  396. package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
  397. package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
  398. package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
  399. package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
  400. package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
  401. package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
  402. package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
  403. package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
  404. package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
  405. package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
  406. package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
  407. package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
  408. package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
  409. package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
  410. package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
  411. package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
  412. package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
  413. package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
  414. package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
  415. package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
  416. package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
  417. package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
  418. package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
  419. package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
  420. package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
  421. package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
  422. package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
  423. package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
  424. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
  425. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
  426. package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
  427. package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
  428. package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
  429. package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
  430. package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
  431. package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
  432. package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
  433. package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
  434. package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
  435. package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
  436. package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
  437. package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
  438. package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
  439. package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
  440. package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
  441. package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
  442. package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
  443. package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
  444. package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
  445. package/cli/MODULES.md +302 -302
  446. package/cli/dist/cli.js +109 -22
  447. package/cli/dist/cli.js.map +1 -1
  448. package/cli/dist/commands/gui.d.ts.map +1 -1
  449. package/cli/dist/commands/gui.js +54 -6
  450. package/cli/dist/commands/gui.js.map +1 -1
  451. package/cli/dist/commands/init.d.ts.map +1 -1
  452. package/cli/dist/commands/init.js +76 -23
  453. package/cli/dist/commands/init.js.map +1 -1
  454. package/cli/dist/commands/self-remove.d.ts.map +1 -1
  455. package/cli/dist/commands/self-remove.js +48 -74
  456. package/cli/dist/commands/self-remove.js.map +1 -1
  457. package/cli/dist/commands/show.d.ts +11 -0
  458. package/cli/dist/commands/show.d.ts.map +1 -1
  459. package/cli/dist/commands/show.js +120 -0
  460. package/cli/dist/commands/show.js.map +1 -1
  461. package/cli/dist/commands/showCompleted.d.ts +21 -0
  462. package/cli/dist/commands/showCompleted.d.ts.map +1 -0
  463. package/cli/dist/commands/showCompleted.js +225 -0
  464. package/cli/dist/commands/showCompleted.js.map +1 -0
  465. package/cli/dist/commands/skill.js +88 -88
  466. package/cli/dist/commands/update.d.ts +2 -0
  467. package/cli/dist/commands/update.d.ts.map +1 -1
  468. package/cli/dist/commands/update.js +67 -1
  469. package/cli/dist/commands/update.js.map +1 -1
  470. package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
  471. package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
  472. package/cli/dist/utils/beadsCompletedChecker.js +198 -0
  473. package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
  474. package/cli/dist/utils/catalog-sync.js +13 -13
  475. package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
  476. package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
  477. package/cli/dist/utils/extractCommandHelp.js +250 -0
  478. package/cli/dist/utils/extractCommandHelp.js.map +1 -0
  479. package/cli/dist/utils/install-rules.js +55 -55
  480. package/cli/dist/utils/mcp-integration.js +44 -44
  481. package/cli/dist/utils/rule-install-hooks.js +8 -8
  482. package/modules.md +667 -630
  483. package/package.json +85 -85
@@ -1,980 +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
-
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
+