@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.
- package/AGENTS.md +265 -232
- package/README.md +956 -771
- package/augment-extensions/coding-standards/bash/README.md +196 -196
- package/augment-extensions/coding-standards/bash/module.json +163 -163
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
- package/augment-extensions/coding-standards/css/README.md +40 -40
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/css/module.json +44 -44
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html/README.md +40 -40
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html/module.json +44 -44
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/js/README.md +46 -46
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/js/module.json +49 -49
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/php/README.md +248 -248
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
- package/augment-extensions/coding-standards/php/module.json +166 -166
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
- package/augment-extensions/coding-standards/php/rules/security.md +358 -358
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
- package/augment-extensions/coding-standards/powershell/README.md +154 -154
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
- package/augment-extensions/coding-standards/powershell/module.json +165 -165
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
- package/augment-extensions/coding-standards/python/README.md +48 -48
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
- package/augment-extensions/coding-standards/python/module.json +30 -30
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
- package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
- package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
- package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
- package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
- package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
- package/augment-extensions/coding-standards/react/README.md +45 -45
- package/augment-extensions/coding-standards/react/module.json +27 -27
- package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
- package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
- package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
- package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
- package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
- package/augment-extensions/coding-standards/typescript/README.md +45 -45
- package/augment-extensions/coding-standards/typescript/module.json +27 -27
- package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
- package/augment-extensions/collections/html-css-js/README.md +82 -82
- package/augment-extensions/collections/html-css-js/collection.json +41 -41
- package/augment-extensions/domain-rules/api-design/README.md +41 -41
- package/augment-extensions/domain-rules/api-design/module.json +27 -27
- package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
- package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
- package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
- package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
- package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
- package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
- package/augment-extensions/domain-rules/database/README.md +161 -161
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
- package/augment-extensions/domain-rules/database/module.json +28 -28
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
- package/augment-extensions/domain-rules/mcp/README.md +150 -150
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
- package/augment-extensions/domain-rules/mcp/module.json +49 -49
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
- package/augment-extensions/domain-rules/security/README.md +41 -41
- package/augment-extensions/domain-rules/security/module.json +28 -28
- package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
- package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
- package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
- package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
- package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
- package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
- package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
- package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
- package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
- package/augment-extensions/domain-rules/wordpress/README.md +163 -163
- package/augment-extensions/domain-rules/wordpress/module.json +32 -32
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
- package/augment-extensions/examples/design-patterns/README.md +37 -37
- package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
- package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
- package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
- package/augment-extensions/examples/design-patterns/module.json +27 -27
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
- package/augment-extensions/workflows/beads/README.md +135 -135
- package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
- package/augment-extensions/workflows/beads/module.json +55 -55
- package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
- package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
- package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
- package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
- package/augment-extensions/workflows/beads-integration/README.md +143 -143
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
- package/augment-extensions/workflows/beads-integration/module.json +75 -75
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
- package/augment-extensions/workflows/database/README.md +195 -195
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
- package/augment-extensions/workflows/database/module.json +42 -42
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
- package/augment-extensions/workflows/database/rules/workflow.md +458 -458
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
- package/augment-extensions/writing-standards/screenplay/README.md +339 -300
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
- package/augment-extensions/writing-standards/screenplay/module.json +124 -124
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
- package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
- package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
- package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
- package/cli/MODULES.md +302 -302
- package/cli/dist/cli.js +109 -22
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/gui.d.ts.map +1 -1
- package/cli/dist/commands/gui.js +54 -6
- package/cli/dist/commands/gui.js.map +1 -1
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +76 -23
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/self-remove.d.ts.map +1 -1
- package/cli/dist/commands/self-remove.js +48 -74
- package/cli/dist/commands/self-remove.js.map +1 -1
- package/cli/dist/commands/show.d.ts +11 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +120 -0
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/showCompleted.d.ts +21 -0
- package/cli/dist/commands/showCompleted.d.ts.map +1 -0
- package/cli/dist/commands/showCompleted.js +225 -0
- package/cli/dist/commands/showCompleted.js.map +1 -0
- package/cli/dist/commands/skill.js +88 -88
- package/cli/dist/commands/update.d.ts +2 -0
- package/cli/dist/commands/update.d.ts.map +1 -1
- package/cli/dist/commands/update.js +67 -1
- package/cli/dist/commands/update.js.map +1 -1
- package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
- package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
- package/cli/dist/utils/beadsCompletedChecker.js +198 -0
- package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
- package/cli/dist/utils/catalog-sync.js +13 -13
- package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
- package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
- package/cli/dist/utils/extractCommandHelp.js +250 -0
- package/cli/dist/utils/extractCommandHelp.js.map +1 -0
- package/cli/dist/utils/install-rules.js +55 -55
- package/cli/dist/utils/mcp-integration.js +44 -44
- package/cli/dist/utils/rule-install-hooks.js +8 -8
- package/modules.md +667 -630
- package/package.json +85 -85
|
@@ -1,358 +1,358 @@
|
|
|
1
|
-
# Security Best Practices
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Security is paramount in PHP development. This document defines security standards following OWASP PHP Security Cheat Sheet guidelines.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Input Validation and Sanitization
|
|
10
|
-
|
|
11
|
-
### Validate All Input
|
|
12
|
-
|
|
13
|
-
**Rules:**
|
|
14
|
-
- ALL user input MUST be validated
|
|
15
|
-
- Validate on the server side (never trust client-side validation)
|
|
16
|
-
- Use whitelist validation (allow known good) over blacklist (block known bad)
|
|
17
|
-
- Validate data type, length, format, and range
|
|
18
|
-
|
|
19
|
-
**Examples:**
|
|
20
|
-
```php
|
|
21
|
-
// ✅ Good
|
|
22
|
-
function validateEmail(string $email): bool
|
|
23
|
-
{
|
|
24
|
-
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function validateAge(mixed $age): bool
|
|
28
|
-
{
|
|
29
|
-
return filter_var($age, FILTER_VALIDATE_INT, [
|
|
30
|
-
'options' => ['min_range' => 0, 'max_range' => 150]
|
|
31
|
-
]) !== false;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function processUserInput(array $data): array
|
|
35
|
-
{
|
|
36
|
-
$validated = [];
|
|
37
|
-
|
|
38
|
-
if (!isset($data['email']) || !validateEmail($data['email'])) {
|
|
39
|
-
throw new ValidationException('Invalid email');
|
|
40
|
-
}
|
|
41
|
-
$validated['email'] = $data['email'];
|
|
42
|
-
|
|
43
|
-
if (!isset($data['age']) || !validateAge($data['age'])) {
|
|
44
|
-
throw new ValidationException('Invalid age');
|
|
45
|
-
}
|
|
46
|
-
$validated['age'] = (int)$data['age'];
|
|
47
|
-
|
|
48
|
-
return $validated;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ❌ Bad
|
|
52
|
-
function processUserInput(array $data): array
|
|
53
|
-
{
|
|
54
|
-
return $data; // No validation!
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Sanitize Input
|
|
59
|
-
|
|
60
|
-
**Rules:**
|
|
61
|
-
- Sanitize input after validation
|
|
62
|
-
- Use appropriate sanitization for context
|
|
63
|
-
- Use `filter_var()` with sanitization filters
|
|
64
|
-
|
|
65
|
-
**Examples:**
|
|
66
|
-
```php
|
|
67
|
-
// ✅ Good
|
|
68
|
-
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
|
|
69
|
-
$url = filter_var($_POST['url'], FILTER_SANITIZE_URL);
|
|
70
|
-
$string = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS);
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## SQL Injection Prevention
|
|
76
|
-
|
|
77
|
-
### Use Prepared Statements
|
|
78
|
-
|
|
79
|
-
**Rules:**
|
|
80
|
-
- ALWAYS use prepared statements with parameter binding
|
|
81
|
-
- NEVER concatenate user input into SQL queries
|
|
82
|
-
- Use ORM query builders when available
|
|
83
|
-
|
|
84
|
-
**Examples:**
|
|
85
|
-
```php
|
|
86
|
-
// ✅ Good - PDO prepared statement
|
|
87
|
-
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
|
|
88
|
-
$stmt->execute(['email' => $email]);
|
|
89
|
-
$user = $stmt->fetch();
|
|
90
|
-
|
|
91
|
-
// ✅ Good - ORM query builder
|
|
92
|
-
$user = User::where('email', $email)->first();
|
|
93
|
-
|
|
94
|
-
// ✅ Good - Eloquent with bindings
|
|
95
|
-
$users = DB::select('SELECT * FROM users WHERE status = ?', [$status]);
|
|
96
|
-
|
|
97
|
-
// ❌ CRITICAL VULNERABILITY - SQL Injection
|
|
98
|
-
$query = "SELECT * FROM users WHERE email = '$email'";
|
|
99
|
-
$result = mysqli_query($conn, $query);
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Escape Output in SQL Context
|
|
103
|
-
|
|
104
|
-
**Rules:**
|
|
105
|
-
- When dynamic SQL is unavoidable, escape properly
|
|
106
|
-
- Use database-specific escaping functions
|
|
107
|
-
- Prefer parameterized queries over escaping
|
|
108
|
-
|
|
109
|
-
**Examples:**
|
|
110
|
-
```php
|
|
111
|
-
// ✅ Acceptable (but prepared statements are better)
|
|
112
|
-
$email = $pdo->quote($email);
|
|
113
|
-
$query = "SELECT * FROM users WHERE email = $email";
|
|
114
|
-
|
|
115
|
-
// ❌ Bad
|
|
116
|
-
$email = addslashes($email); // Not sufficient!
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Cross-Site Scripting (XSS) Prevention
|
|
122
|
-
|
|
123
|
-
### Escape Output
|
|
124
|
-
|
|
125
|
-
**Rules:**
|
|
126
|
-
- Escape ALL output to HTML
|
|
127
|
-
- Use context-appropriate escaping
|
|
128
|
-
- Use template engines with auto-escaping
|
|
129
|
-
|
|
130
|
-
**Escaping Functions:**
|
|
131
|
-
- `htmlspecialchars()` - HTML context
|
|
132
|
-
- `htmlentities()` - HTML entities
|
|
133
|
-
- `json_encode()` - JavaScript context
|
|
134
|
-
- `urlencode()` - URL context
|
|
135
|
-
|
|
136
|
-
**Examples:**
|
|
137
|
-
```php
|
|
138
|
-
// ✅ Good - HTML context
|
|
139
|
-
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
|
|
140
|
-
|
|
141
|
-
// ✅ Good - JavaScript context
|
|
142
|
-
echo '<script>var name = ' . json_encode($userName) . ';</script>';
|
|
143
|
-
|
|
144
|
-
// ✅ Good - URL context
|
|
145
|
-
echo '<a href="?search=' . urlencode($searchTerm) . '">Search</a>';
|
|
146
|
-
|
|
147
|
-
// ✅ Good - Template engine (Blade)
|
|
148
|
-
{{ $userInput }} // Auto-escaped
|
|
149
|
-
|
|
150
|
-
// ❌ CRITICAL VULNERABILITY - XSS
|
|
151
|
-
echo $userInput; // Not escaped!
|
|
152
|
-
echo "<div>$userInput</div>"; // Not escaped!
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Content Security Policy
|
|
156
|
-
|
|
157
|
-
**Rules:**
|
|
158
|
-
- Implement Content Security Policy (CSP) headers
|
|
159
|
-
- Restrict script sources
|
|
160
|
-
- Disable inline scripts when possible
|
|
161
|
-
|
|
162
|
-
**Examples:**
|
|
163
|
-
```php
|
|
164
|
-
// ✅ Good
|
|
165
|
-
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com");
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## Cross-Site Request Forgery (CSRF) Prevention
|
|
171
|
-
|
|
172
|
-
### CSRF Tokens
|
|
173
|
-
|
|
174
|
-
**Rules:**
|
|
175
|
-
- Use CSRF tokens for all state-changing requests
|
|
176
|
-
- Validate tokens on the server side
|
|
177
|
-
- Regenerate tokens after authentication
|
|
178
|
-
|
|
179
|
-
**Examples:**
|
|
180
|
-
```php
|
|
181
|
-
// ✅ Good - Generate token
|
|
182
|
-
session_start();
|
|
183
|
-
if (empty($_SESSION['csrf_token'])) {
|
|
184
|
-
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// ✅ Good - Validate token
|
|
188
|
-
function validateCsrfToken(string $token): bool
|
|
189
|
-
{
|
|
190
|
-
return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
194
|
-
if (!validateCsrfToken($_POST['csrf_token'] ?? '')) {
|
|
195
|
-
throw new SecurityException('Invalid CSRF token');
|
|
196
|
-
}
|
|
197
|
-
// Process form
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// HTML form
|
|
201
|
-
echo '<input type="hidden" name="csrf_token" value="' . htmlspecialchars($_SESSION['csrf_token']) . '">';
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
## Session Security
|
|
207
|
-
|
|
208
|
-
### Secure Session Configuration
|
|
209
|
-
|
|
210
|
-
**Rules:**
|
|
211
|
-
- Regenerate session ID after authentication
|
|
212
|
-
- Set secure and httponly flags on cookies
|
|
213
|
-
- Implement session timeout
|
|
214
|
-
- Validate session data on each request
|
|
215
|
-
|
|
216
|
-
**Examples:**
|
|
217
|
-
```php
|
|
218
|
-
// ✅ Good - Secure session configuration
|
|
219
|
-
ini_set('session.cookie_httponly', 1);
|
|
220
|
-
ini_set('session.cookie_secure', 1); // HTTPS only
|
|
221
|
-
ini_set('session.cookie_samesite', 'Strict');
|
|
222
|
-
ini_set('session.use_strict_mode', 1);
|
|
223
|
-
|
|
224
|
-
session_start();
|
|
225
|
-
|
|
226
|
-
// ✅ Good - Regenerate after login
|
|
227
|
-
function loginUser(User $user): void
|
|
228
|
-
{
|
|
229
|
-
session_regenerate_id(true);
|
|
230
|
-
$_SESSION['user_id'] = $user->id;
|
|
231
|
-
$_SESSION['login_time'] = time();
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// ✅ Good - Session timeout
|
|
235
|
-
function validateSession(): bool
|
|
236
|
-
{
|
|
237
|
-
$timeout = 3600; // 1 hour
|
|
238
|
-
|
|
239
|
-
if (isset($_SESSION['login_time']) && (time() - $_SESSION['login_time']) > $timeout) {
|
|
240
|
-
session_destroy();
|
|
241
|
-
return false;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
$_SESSION['login_time'] = time(); // Refresh
|
|
245
|
-
return true;
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
---
|
|
250
|
-
|
|
251
|
-
## Password Security
|
|
252
|
-
|
|
253
|
-
### Password Hashing
|
|
254
|
-
|
|
255
|
-
**Rules:**
|
|
256
|
-
- Use `password_hash()` with bcrypt or argon2
|
|
257
|
-
- NEVER store passwords in plain text
|
|
258
|
-
- Use `password_verify()` for verification
|
|
259
|
-
- Rehash passwords when algorithm changes
|
|
260
|
-
|
|
261
|
-
**Examples:**
|
|
262
|
-
```php
|
|
263
|
-
// ✅ Good - Hash password
|
|
264
|
-
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
|
|
265
|
-
|
|
266
|
-
// ✅ Good - Verify password
|
|
267
|
-
if (password_verify($inputPassword, $user->password)) {
|
|
268
|
-
// Password correct
|
|
269
|
-
|
|
270
|
-
// Rehash if needed
|
|
271
|
-
if (password_needs_rehash($user->password, PASSWORD_ARGON2ID)) {
|
|
272
|
-
$user->password = password_hash($inputPassword, PASSWORD_ARGON2ID);
|
|
273
|
-
$user->save();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// ❌ CRITICAL VULNERABILITY
|
|
278
|
-
$password = md5($password); // Weak hashing!
|
|
279
|
-
$password = sha1($password); // Still weak!
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
---
|
|
283
|
-
|
|
284
|
-
## File Upload Security
|
|
285
|
-
|
|
286
|
-
### Validate Uploads
|
|
287
|
-
|
|
288
|
-
**Rules:**
|
|
289
|
-
- Validate file type (MIME type and extension)
|
|
290
|
-
- Limit file size
|
|
291
|
-
- Store uploads outside web root
|
|
292
|
-
- Generate random filenames
|
|
293
|
-
- Scan for malware when possible
|
|
294
|
-
|
|
295
|
-
**Examples:**
|
|
296
|
-
```php
|
|
297
|
-
// ✅ Good
|
|
298
|
-
function handleFileUpload(array $file): string
|
|
299
|
-
{
|
|
300
|
-
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
|
|
301
|
-
$maxSize = 5 * 1024 * 1024; // 5MB
|
|
302
|
-
|
|
303
|
-
if (!in_array($file['type'], $allowedTypes)) {
|
|
304
|
-
throw new ValidationException('Invalid file type');
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
if ($file['size'] > $maxSize) {
|
|
308
|
-
throw new ValidationException('File too large');
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
|
|
312
|
-
$filename = bin2hex(random_bytes(16)) . '.' . $extension;
|
|
313
|
-
$uploadPath = '/var/uploads/' . $filename; // Outside web root
|
|
314
|
-
|
|
315
|
-
if (!move_uploaded_file($file['tmp_name'], $uploadPath)) {
|
|
316
|
-
throw new RuntimeException('Upload failed');
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
return $filename;
|
|
320
|
-
}
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
|
|
325
|
-
## Authentication and Authorization
|
|
326
|
-
|
|
327
|
-
### Secure Authentication
|
|
328
|
-
|
|
329
|
-
**Rules:**
|
|
330
|
-
- Implement rate limiting for login attempts
|
|
331
|
-
- Use multi-factor authentication when possible
|
|
332
|
-
- Lock accounts after failed attempts
|
|
333
|
-
- Log authentication events
|
|
334
|
-
|
|
335
|
-
**Examples:**
|
|
336
|
-
```php
|
|
337
|
-
// ✅ Good
|
|
338
|
-
function attemptLogin(string $email, string $password): bool
|
|
339
|
-
{
|
|
340
|
-
if ($this->isRateLimited($email)) {
|
|
341
|
-
throw new TooManyAttemptsException('Too many login attempts');
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
$user = User::where('email', $email)->first();
|
|
345
|
-
|
|
346
|
-
if (!$user || !password_verify($password, $user->password)) {
|
|
347
|
-
$this->incrementFailedAttempts($email);
|
|
348
|
-
$this->logger->warning('Failed login attempt', ['email' => $email]);
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
$this->clearFailedAttempts($email);
|
|
353
|
-
$this->logger->info('Successful login', ['user_id' => $user->id]);
|
|
354
|
-
loginUser($user);
|
|
355
|
-
return true;
|
|
356
|
-
}
|
|
357
|
-
```
|
|
358
|
-
|
|
1
|
+
# Security Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Security is paramount in PHP development. This document defines security standards following OWASP PHP Security Cheat Sheet guidelines.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Input Validation and Sanitization
|
|
10
|
+
|
|
11
|
+
### Validate All Input
|
|
12
|
+
|
|
13
|
+
**Rules:**
|
|
14
|
+
- ALL user input MUST be validated
|
|
15
|
+
- Validate on the server side (never trust client-side validation)
|
|
16
|
+
- Use whitelist validation (allow known good) over blacklist (block known bad)
|
|
17
|
+
- Validate data type, length, format, and range
|
|
18
|
+
|
|
19
|
+
**Examples:**
|
|
20
|
+
```php
|
|
21
|
+
// ✅ Good
|
|
22
|
+
function validateEmail(string $email): bool
|
|
23
|
+
{
|
|
24
|
+
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function validateAge(mixed $age): bool
|
|
28
|
+
{
|
|
29
|
+
return filter_var($age, FILTER_VALIDATE_INT, [
|
|
30
|
+
'options' => ['min_range' => 0, 'max_range' => 150]
|
|
31
|
+
]) !== false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function processUserInput(array $data): array
|
|
35
|
+
{
|
|
36
|
+
$validated = [];
|
|
37
|
+
|
|
38
|
+
if (!isset($data['email']) || !validateEmail($data['email'])) {
|
|
39
|
+
throw new ValidationException('Invalid email');
|
|
40
|
+
}
|
|
41
|
+
$validated['email'] = $data['email'];
|
|
42
|
+
|
|
43
|
+
if (!isset($data['age']) || !validateAge($data['age'])) {
|
|
44
|
+
throw new ValidationException('Invalid age');
|
|
45
|
+
}
|
|
46
|
+
$validated['age'] = (int)$data['age'];
|
|
47
|
+
|
|
48
|
+
return $validated;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ❌ Bad
|
|
52
|
+
function processUserInput(array $data): array
|
|
53
|
+
{
|
|
54
|
+
return $data; // No validation!
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Sanitize Input
|
|
59
|
+
|
|
60
|
+
**Rules:**
|
|
61
|
+
- Sanitize input after validation
|
|
62
|
+
- Use appropriate sanitization for context
|
|
63
|
+
- Use `filter_var()` with sanitization filters
|
|
64
|
+
|
|
65
|
+
**Examples:**
|
|
66
|
+
```php
|
|
67
|
+
// ✅ Good
|
|
68
|
+
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
|
|
69
|
+
$url = filter_var($_POST['url'], FILTER_SANITIZE_URL);
|
|
70
|
+
$string = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## SQL Injection Prevention
|
|
76
|
+
|
|
77
|
+
### Use Prepared Statements
|
|
78
|
+
|
|
79
|
+
**Rules:**
|
|
80
|
+
- ALWAYS use prepared statements with parameter binding
|
|
81
|
+
- NEVER concatenate user input into SQL queries
|
|
82
|
+
- Use ORM query builders when available
|
|
83
|
+
|
|
84
|
+
**Examples:**
|
|
85
|
+
```php
|
|
86
|
+
// ✅ Good - PDO prepared statement
|
|
87
|
+
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
|
|
88
|
+
$stmt->execute(['email' => $email]);
|
|
89
|
+
$user = $stmt->fetch();
|
|
90
|
+
|
|
91
|
+
// ✅ Good - ORM query builder
|
|
92
|
+
$user = User::where('email', $email)->first();
|
|
93
|
+
|
|
94
|
+
// ✅ Good - Eloquent with bindings
|
|
95
|
+
$users = DB::select('SELECT * FROM users WHERE status = ?', [$status]);
|
|
96
|
+
|
|
97
|
+
// ❌ CRITICAL VULNERABILITY - SQL Injection
|
|
98
|
+
$query = "SELECT * FROM users WHERE email = '$email'";
|
|
99
|
+
$result = mysqli_query($conn, $query);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Escape Output in SQL Context
|
|
103
|
+
|
|
104
|
+
**Rules:**
|
|
105
|
+
- When dynamic SQL is unavoidable, escape properly
|
|
106
|
+
- Use database-specific escaping functions
|
|
107
|
+
- Prefer parameterized queries over escaping
|
|
108
|
+
|
|
109
|
+
**Examples:**
|
|
110
|
+
```php
|
|
111
|
+
// ✅ Acceptable (but prepared statements are better)
|
|
112
|
+
$email = $pdo->quote($email);
|
|
113
|
+
$query = "SELECT * FROM users WHERE email = $email";
|
|
114
|
+
|
|
115
|
+
// ❌ Bad
|
|
116
|
+
$email = addslashes($email); // Not sufficient!
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Cross-Site Scripting (XSS) Prevention
|
|
122
|
+
|
|
123
|
+
### Escape Output
|
|
124
|
+
|
|
125
|
+
**Rules:**
|
|
126
|
+
- Escape ALL output to HTML
|
|
127
|
+
- Use context-appropriate escaping
|
|
128
|
+
- Use template engines with auto-escaping
|
|
129
|
+
|
|
130
|
+
**Escaping Functions:**
|
|
131
|
+
- `htmlspecialchars()` - HTML context
|
|
132
|
+
- `htmlentities()` - HTML entities
|
|
133
|
+
- `json_encode()` - JavaScript context
|
|
134
|
+
- `urlencode()` - URL context
|
|
135
|
+
|
|
136
|
+
**Examples:**
|
|
137
|
+
```php
|
|
138
|
+
// ✅ Good - HTML context
|
|
139
|
+
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
|
|
140
|
+
|
|
141
|
+
// ✅ Good - JavaScript context
|
|
142
|
+
echo '<script>var name = ' . json_encode($userName) . ';</script>';
|
|
143
|
+
|
|
144
|
+
// ✅ Good - URL context
|
|
145
|
+
echo '<a href="?search=' . urlencode($searchTerm) . '">Search</a>';
|
|
146
|
+
|
|
147
|
+
// ✅ Good - Template engine (Blade)
|
|
148
|
+
{{ $userInput }} // Auto-escaped
|
|
149
|
+
|
|
150
|
+
// ❌ CRITICAL VULNERABILITY - XSS
|
|
151
|
+
echo $userInput; // Not escaped!
|
|
152
|
+
echo "<div>$userInput</div>"; // Not escaped!
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Content Security Policy
|
|
156
|
+
|
|
157
|
+
**Rules:**
|
|
158
|
+
- Implement Content Security Policy (CSP) headers
|
|
159
|
+
- Restrict script sources
|
|
160
|
+
- Disable inline scripts when possible
|
|
161
|
+
|
|
162
|
+
**Examples:**
|
|
163
|
+
```php
|
|
164
|
+
// ✅ Good
|
|
165
|
+
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com");
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Cross-Site Request Forgery (CSRF) Prevention
|
|
171
|
+
|
|
172
|
+
### CSRF Tokens
|
|
173
|
+
|
|
174
|
+
**Rules:**
|
|
175
|
+
- Use CSRF tokens for all state-changing requests
|
|
176
|
+
- Validate tokens on the server side
|
|
177
|
+
- Regenerate tokens after authentication
|
|
178
|
+
|
|
179
|
+
**Examples:**
|
|
180
|
+
```php
|
|
181
|
+
// ✅ Good - Generate token
|
|
182
|
+
session_start();
|
|
183
|
+
if (empty($_SESSION['csrf_token'])) {
|
|
184
|
+
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ✅ Good - Validate token
|
|
188
|
+
function validateCsrfToken(string $token): bool
|
|
189
|
+
{
|
|
190
|
+
return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
194
|
+
if (!validateCsrfToken($_POST['csrf_token'] ?? '')) {
|
|
195
|
+
throw new SecurityException('Invalid CSRF token');
|
|
196
|
+
}
|
|
197
|
+
// Process form
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// HTML form
|
|
201
|
+
echo '<input type="hidden" name="csrf_token" value="' . htmlspecialchars($_SESSION['csrf_token']) . '">';
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Session Security
|
|
207
|
+
|
|
208
|
+
### Secure Session Configuration
|
|
209
|
+
|
|
210
|
+
**Rules:**
|
|
211
|
+
- Regenerate session ID after authentication
|
|
212
|
+
- Set secure and httponly flags on cookies
|
|
213
|
+
- Implement session timeout
|
|
214
|
+
- Validate session data on each request
|
|
215
|
+
|
|
216
|
+
**Examples:**
|
|
217
|
+
```php
|
|
218
|
+
// ✅ Good - Secure session configuration
|
|
219
|
+
ini_set('session.cookie_httponly', 1);
|
|
220
|
+
ini_set('session.cookie_secure', 1); // HTTPS only
|
|
221
|
+
ini_set('session.cookie_samesite', 'Strict');
|
|
222
|
+
ini_set('session.use_strict_mode', 1);
|
|
223
|
+
|
|
224
|
+
session_start();
|
|
225
|
+
|
|
226
|
+
// ✅ Good - Regenerate after login
|
|
227
|
+
function loginUser(User $user): void
|
|
228
|
+
{
|
|
229
|
+
session_regenerate_id(true);
|
|
230
|
+
$_SESSION['user_id'] = $user->id;
|
|
231
|
+
$_SESSION['login_time'] = time();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ✅ Good - Session timeout
|
|
235
|
+
function validateSession(): bool
|
|
236
|
+
{
|
|
237
|
+
$timeout = 3600; // 1 hour
|
|
238
|
+
|
|
239
|
+
if (isset($_SESSION['login_time']) && (time() - $_SESSION['login_time']) > $timeout) {
|
|
240
|
+
session_destroy();
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
$_SESSION['login_time'] = time(); // Refresh
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Password Security
|
|
252
|
+
|
|
253
|
+
### Password Hashing
|
|
254
|
+
|
|
255
|
+
**Rules:**
|
|
256
|
+
- Use `password_hash()` with bcrypt or argon2
|
|
257
|
+
- NEVER store passwords in plain text
|
|
258
|
+
- Use `password_verify()` for verification
|
|
259
|
+
- Rehash passwords when algorithm changes
|
|
260
|
+
|
|
261
|
+
**Examples:**
|
|
262
|
+
```php
|
|
263
|
+
// ✅ Good - Hash password
|
|
264
|
+
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
|
|
265
|
+
|
|
266
|
+
// ✅ Good - Verify password
|
|
267
|
+
if (password_verify($inputPassword, $user->password)) {
|
|
268
|
+
// Password correct
|
|
269
|
+
|
|
270
|
+
// Rehash if needed
|
|
271
|
+
if (password_needs_rehash($user->password, PASSWORD_ARGON2ID)) {
|
|
272
|
+
$user->password = password_hash($inputPassword, PASSWORD_ARGON2ID);
|
|
273
|
+
$user->save();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ❌ CRITICAL VULNERABILITY
|
|
278
|
+
$password = md5($password); // Weak hashing!
|
|
279
|
+
$password = sha1($password); // Still weak!
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## File Upload Security
|
|
285
|
+
|
|
286
|
+
### Validate Uploads
|
|
287
|
+
|
|
288
|
+
**Rules:**
|
|
289
|
+
- Validate file type (MIME type and extension)
|
|
290
|
+
- Limit file size
|
|
291
|
+
- Store uploads outside web root
|
|
292
|
+
- Generate random filenames
|
|
293
|
+
- Scan for malware when possible
|
|
294
|
+
|
|
295
|
+
**Examples:**
|
|
296
|
+
```php
|
|
297
|
+
// ✅ Good
|
|
298
|
+
function handleFileUpload(array $file): string
|
|
299
|
+
{
|
|
300
|
+
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
|
|
301
|
+
$maxSize = 5 * 1024 * 1024; // 5MB
|
|
302
|
+
|
|
303
|
+
if (!in_array($file['type'], $allowedTypes)) {
|
|
304
|
+
throw new ValidationException('Invalid file type');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if ($file['size'] > $maxSize) {
|
|
308
|
+
throw new ValidationException('File too large');
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
|
|
312
|
+
$filename = bin2hex(random_bytes(16)) . '.' . $extension;
|
|
313
|
+
$uploadPath = '/var/uploads/' . $filename; // Outside web root
|
|
314
|
+
|
|
315
|
+
if (!move_uploaded_file($file['tmp_name'], $uploadPath)) {
|
|
316
|
+
throw new RuntimeException('Upload failed');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return $filename;
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Authentication and Authorization
|
|
326
|
+
|
|
327
|
+
### Secure Authentication
|
|
328
|
+
|
|
329
|
+
**Rules:**
|
|
330
|
+
- Implement rate limiting for login attempts
|
|
331
|
+
- Use multi-factor authentication when possible
|
|
332
|
+
- Lock accounts after failed attempts
|
|
333
|
+
- Log authentication events
|
|
334
|
+
|
|
335
|
+
**Examples:**
|
|
336
|
+
```php
|
|
337
|
+
// ✅ Good
|
|
338
|
+
function attemptLogin(string $email, string $password): bool
|
|
339
|
+
{
|
|
340
|
+
if ($this->isRateLimited($email)) {
|
|
341
|
+
throw new TooManyAttemptsException('Too many login attempts');
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
$user = User::where('email', $email)->first();
|
|
345
|
+
|
|
346
|
+
if (!$user || !password_verify($password, $user->password)) {
|
|
347
|
+
$this->incrementFailedAttempts($email);
|
|
348
|
+
$this->logger->warning('Failed login attempt', ['email' => $email]);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
$this->clearFailedAttempts($email);
|
|
353
|
+
$this->logger->info('Successful login', ['user_id' => $user->id]);
|
|
354
|
+
loginUser($user);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|