@sun-asterisk/sunlint 1.3.39 → 1.3.41

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 (488) hide show
  1. package/config/rules/rules-registry-generated.json +134 -108
  2. package/core/rule-selection-service.js +11 -0
  3. package/docs/GENERATED_FILES_QUICK_REFERENCE.md +96 -0
  4. package/docs/GENERATED_FILE_HANDLING_SUMMARY.md +152 -0
  5. package/docs/skills/CREATE_NEW_DART_RULE.md +161 -14
  6. package/origin-rules/dart-en.md +151 -163
  7. package/package.json +2 -1
  8. package/rules/dart/D002_dispose_resources/config.json +25 -0
  9. package/rules/dart/D003_prefer_widgets_over_methods/config.json +14 -0
  10. package/rules/dart/D004_avoid_shrinkwrap_listview/config.json +13 -0
  11. package/rules/dart/D005_limit_widget_nesting/config.json +13 -0
  12. package/rules/dart/D006_prefer_extracting_large_callbacks/config.json +25 -0
  13. package/rules/dart/D007_prefer_init_first_dispose_last/config.json +10 -0
  14. package/rules/dart/D008_avoid_long_functions/config.json +12 -0
  15. package/rules/dart/D009_limit_function_parameters/config.json +13 -0
  16. package/rules/dart/D010_limit_cyclomatic_complexity/config.json +12 -0
  17. package/rules/dart/D011_prefer_named_parameters/config.json +12 -0
  18. package/rules/dart/D012_prefer_named_boolean_parameters/config.json +9 -0
  19. package/rules/dart/D013_single_public_class/config.json +10 -0
  20. package/rules/dart/D014_unsafe_collection_access/config.json +10 -0
  21. package/rules/dart/D015_copywith_all_parameters/config.json +9 -0
  22. package/rules/dart/D016_project_should_have_tests/config.json +24 -0
  23. package/rules/dart/D017_pubspec_dependencies_review/config.json +23 -0
  24. package/rules/dart/D018_remove_commented_code/config.json +13 -0
  25. package/rules/dart/D019_avoid_single_child_multi_child_widget/config.json +21 -0
  26. package/rules/dart/D020_limit_if_else_branches/config.json +12 -0
  27. package/rules/dart/D021_avoid_negated_boolean_checks/config.json +14 -0
  28. package/rules/dart/D022_use_setstate_correctly/config.json +14 -0
  29. package/rules/dart/D023_avoid_unnecessary_method_overrides/config.json +13 -0
  30. package/rules/dart/D024_avoid_unnecessary_stateful_widget/config.json +9 -0
  31. package/rules/dart/D025_avoid_nested_conditional_expressions/config.json +9 -0
  32. package/skill-assets/sunlint-code-quality/AGENTS.md +80 -0
  33. package/skill-assets/sunlint-code-quality/SKILL.md +176 -0
  34. package/skill-assets/sunlint-code-quality/rules/csharp/C006-verb-noun-functions.md +36 -0
  35. package/skill-assets/sunlint-code-quality/rules/csharp/C013-no-dead-code.md +38 -0
  36. package/skill-assets/sunlint-code-quality/rules/csharp/C014-dependency-injection.md +45 -0
  37. package/skill-assets/sunlint-code-quality/rules/csharp/C017-no-constructor-logic.md +46 -0
  38. package/skill-assets/sunlint-code-quality/rules/csharp/C018-generic-errors.md +38 -0
  39. package/skill-assets/sunlint-code-quality/rules/csharp/C019-error-log-level.md +29 -0
  40. package/skill-assets/sunlint-code-quality/rules/csharp/C020-no-unused-imports.md +30 -0
  41. package/skill-assets/sunlint-code-quality/rules/csharp/C022-no-unused-variables.md +33 -0
  42. package/skill-assets/sunlint-code-quality/rules/csharp/C023-no-duplicate-names.md +36 -0
  43. package/skill-assets/sunlint-code-quality/rules/csharp/C024-centralize-constants.md +33 -0
  44. package/skill-assets/sunlint-code-quality/rules/csharp/C029-catch-log-root-cause.md +40 -0
  45. package/skill-assets/sunlint-code-quality/rules/csharp/C030-custom-error-classes.md +38 -0
  46. package/skill-assets/sunlint-code-quality/rules/csharp/C033-separate-data-access.md +53 -0
  47. package/skill-assets/sunlint-code-quality/rules/csharp/C035-error-context-logging.md +31 -0
  48. package/skill-assets/sunlint-code-quality/rules/csharp/C041-no-hardcoded-secrets.md +25 -0
  49. package/skill-assets/sunlint-code-quality/rules/csharp/C042-boolean-naming.md +27 -0
  50. package/skill-assets/sunlint-code-quality/rules/csharp/C052-controller-parsing.md +41 -0
  51. package/skill-assets/sunlint-code-quality/rules/csharp/C060-superclass-logic.md +33 -0
  52. package/skill-assets/sunlint-code-quality/rules/csharp/C067-no-hardcoded-config.md +24 -0
  53. package/skill-assets/sunlint-code-quality/rules/csharp/S003-open-redirect.md +47 -0
  54. package/skill-assets/sunlint-code-quality/rules/csharp/S004-no-log-credentials.md +28 -0
  55. package/skill-assets/sunlint-code-quality/rules/csharp/S005-server-authorization.md +51 -0
  56. package/skill-assets/sunlint-code-quality/rules/csharp/S006-default-credentials.md +42 -0
  57. package/skill-assets/sunlint-code-quality/rules/csharp/S007-output-encoding.md +36 -0
  58. package/skill-assets/sunlint-code-quality/rules/csharp/S009-approved-crypto.md +37 -0
  59. package/skill-assets/sunlint-code-quality/rules/csharp/S010-csprng.md +32 -0
  60. package/skill-assets/sunlint-code-quality/rules/csharp/S011-encrypted-client-hello.md +36 -0
  61. package/skill-assets/sunlint-code-quality/rules/csharp/S012-secrets-management.md +35 -0
  62. package/skill-assets/sunlint-code-quality/rules/csharp/S013-tls-connections.md +36 -0
  63. package/skill-assets/sunlint-code-quality/rules/csharp/S016-no-sensitive-query-string.md +39 -0
  64. package/skill-assets/sunlint-code-quality/rules/csharp/S017-parameterized-queries.md +47 -0
  65. package/skill-assets/sunlint-code-quality/rules/csharp/S019-email-input-sanitization.md +35 -0
  66. package/skill-assets/sunlint-code-quality/rules/csharp/S020-eval-code-execution.md +56 -0
  67. package/skill-assets/sunlint-code-quality/rules/csharp/S022-context-escaping.md +50 -0
  68. package/skill-assets/sunlint-code-quality/rules/csharp/S023-dynamic-js-encoding.md +34 -0
  69. package/skill-assets/sunlint-code-quality/rules/csharp/S025-server-validation.md +56 -0
  70. package/skill-assets/sunlint-code-quality/rules/csharp/S026-tls-encryption.md +28 -0
  71. package/skill-assets/sunlint-code-quality/rules/csharp/S027-mtls-validation.md +40 -0
  72. package/skill-assets/sunlint-code-quality/rules/csharp/S028-upload-limits.md +50 -0
  73. package/skill-assets/sunlint-code-quality/rules/csharp/S029-csrf-protection.md +42 -0
  74. package/skill-assets/sunlint-code-quality/rules/csharp/S030-directory-browsing.md +26 -0
  75. package/skill-assets/sunlint-code-quality/rules/csharp/S031-secure-cookie-flag.md +35 -0
  76. package/skill-assets/sunlint-code-quality/rules/csharp/S032-httponly-cookie.md +31 -0
  77. package/skill-assets/sunlint-code-quality/rules/csharp/S033-samesite-cookie.md +36 -0
  78. package/skill-assets/sunlint-code-quality/rules/csharp/S034-host-prefix-cookie.md +31 -0
  79. package/skill-assets/sunlint-code-quality/rules/csharp/S035-app-hostnames.md +26 -0
  80. package/skill-assets/sunlint-code-quality/rules/csharp/S036-internal-file-paths.md +36 -0
  81. package/skill-assets/sunlint-code-quality/rules/csharp/S037-anti-cache-headers.md +33 -0
  82. package/skill-assets/sunlint-code-quality/rules/csharp/S039-tls-certificate-validation.md +41 -0
  83. package/skill-assets/sunlint-code-quality/rules/csharp/S041-logout-invalidation.md +36 -0
  84. package/skill-assets/sunlint-code-quality/rules/csharp/S042-long-lived-sessions.md +47 -0
  85. package/skill-assets/sunlint-code-quality/rules/csharp/S044-critical-changes-reauth.md +45 -0
  86. package/skill-assets/sunlint-code-quality/rules/csharp/S045-brute-force-protection.md +48 -0
  87. package/skill-assets/sunlint-code-quality/rules/csharp/S047-oauth-csrf-protection.md +53 -0
  88. package/skill-assets/sunlint-code-quality/rules/csharp/S048-oauth-redirect-validation.md +37 -0
  89. package/skill-assets/sunlint-code-quality/rules/csharp/S049-auth-code-expiry.md +33 -0
  90. package/skill-assets/sunlint-code-quality/rules/csharp/S050-token-entropy.md +33 -0
  91. package/skill-assets/sunlint-code-quality/rules/csharp/S051-password-length.md +35 -0
  92. package/skill-assets/sunlint-code-quality/rules/csharp/S052-otp-entropy.md +26 -0
  93. package/skill-assets/sunlint-code-quality/rules/csharp/S053-generic-error-messages.md +32 -0
  94. package/skill-assets/sunlint-code-quality/rules/csharp/S054-no-default-admin.md +31 -0
  95. package/skill-assets/sunlint-code-quality/rules/csharp/S055-content-type-validation.md +44 -0
  96. package/skill-assets/sunlint-code-quality/rules/csharp/S056-log-injection.md +33 -0
  97. package/skill-assets/sunlint-code-quality/rules/csharp/S057-synchronized-time.md +27 -0
  98. package/skill-assets/sunlint-code-quality/rules/csharp/S058-ssrf-protection.md +54 -0
  99. package/skill-assets/sunlint-code-quality/rules/go/C006-verb-noun-functions.md +45 -0
  100. package/skill-assets/sunlint-code-quality/rules/go/C013-no-dead-code.md +48 -0
  101. package/skill-assets/sunlint-code-quality/rules/go/C014-dependency-injection.md +85 -0
  102. package/skill-assets/sunlint-code-quality/rules/go/C017-no-constructor-logic.md +67 -0
  103. package/skill-assets/sunlint-code-quality/rules/go/C018-generic-errors.md +63 -0
  104. package/skill-assets/sunlint-code-quality/rules/go/C019-error-log-level.md +50 -0
  105. package/skill-assets/sunlint-code-quality/rules/go/C020-no-unused-imports.md +45 -0
  106. package/skill-assets/sunlint-code-quality/rules/go/C022-no-unused-variables.md +34 -0
  107. package/skill-assets/sunlint-code-quality/rules/go/C023-no-duplicate-names.md +41 -0
  108. package/skill-assets/sunlint-code-quality/rules/go/C024-centralize-constants.md +55 -0
  109. package/skill-assets/sunlint-code-quality/rules/go/C029-catch-log-root-cause.md +56 -0
  110. package/skill-assets/sunlint-code-quality/rules/go/C030-custom-error-classes.md +69 -0
  111. package/skill-assets/sunlint-code-quality/rules/go/C033-separate-data-access.md +68 -0
  112. package/skill-assets/sunlint-code-quality/rules/go/C035-error-context-logging.md +48 -0
  113. package/skill-assets/sunlint-code-quality/rules/go/C041-no-hardcoded-secrets.md +45 -0
  114. package/skill-assets/sunlint-code-quality/rules/go/C042-boolean-naming.md +42 -0
  115. package/skill-assets/sunlint-code-quality/rules/go/C052-controller-parsing.md +62 -0
  116. package/skill-assets/sunlint-code-quality/rules/go/C060-superclass-logic.md +60 -0
  117. package/skill-assets/sunlint-code-quality/rules/go/C067-no-hardcoded-config.md +51 -0
  118. package/skill-assets/sunlint-code-quality/rules/go/S003-open-redirect.md +80 -0
  119. package/skill-assets/sunlint-code-quality/rules/go/S004-no-log-credentials.md +66 -0
  120. package/skill-assets/sunlint-code-quality/rules/go/S005-server-authorization.md +55 -0
  121. package/skill-assets/sunlint-code-quality/rules/go/S006-default-credentials.md +47 -0
  122. package/skill-assets/sunlint-code-quality/rules/go/S007-output-encoding.md +50 -0
  123. package/skill-assets/sunlint-code-quality/rules/go/S009-approved-crypto.md +63 -0
  124. package/skill-assets/sunlint-code-quality/rules/go/S010-csprng.md +53 -0
  125. package/skill-assets/sunlint-code-quality/rules/go/S011-encrypted-client-hello.md +34 -0
  126. package/skill-assets/sunlint-code-quality/rules/go/S012-secrets-management.md +49 -0
  127. package/skill-assets/sunlint-code-quality/rules/go/S013-tls-connections.md +61 -0
  128. package/skill-assets/sunlint-code-quality/rules/go/S016-no-sensitive-query-string.md +42 -0
  129. package/skill-assets/sunlint-code-quality/rules/go/S017-parameterized-queries.md +36 -0
  130. package/skill-assets/sunlint-code-quality/rules/go/S019-email-input-sanitization.md +44 -0
  131. package/skill-assets/sunlint-code-quality/rules/go/S020-eval-code-execution.md +47 -0
  132. package/skill-assets/sunlint-code-quality/rules/go/S022-context-escaping.md +49 -0
  133. package/skill-assets/sunlint-code-quality/rules/go/S023-dynamic-js-encoding.md +51 -0
  134. package/skill-assets/sunlint-code-quality/rules/go/S025-server-validation.md +57 -0
  135. package/skill-assets/sunlint-code-quality/rules/go/S026-tls-encryption.md +46 -0
  136. package/skill-assets/sunlint-code-quality/rules/go/S027-mtls-validation.md +52 -0
  137. package/skill-assets/sunlint-code-quality/rules/go/S028-upload-limits.md +58 -0
  138. package/skill-assets/sunlint-code-quality/rules/go/S029-csrf-protection.md +53 -0
  139. package/skill-assets/sunlint-code-quality/rules/go/S030-directory-browsing.md +53 -0
  140. package/skill-assets/sunlint-code-quality/rules/go/S031-secure-cookie-flag.md +48 -0
  141. package/skill-assets/sunlint-code-quality/rules/go/S032-httponly-cookie.md +42 -0
  142. package/skill-assets/sunlint-code-quality/rules/go/S033-samesite-cookie.md +49 -0
  143. package/skill-assets/sunlint-code-quality/rules/go/S034-host-prefix-cookie.md +44 -0
  144. package/skill-assets/sunlint-code-quality/rules/go/S035-app-hostnames.md +50 -0
  145. package/skill-assets/sunlint-code-quality/rules/go/S036-internal-file-paths.md +56 -0
  146. package/skill-assets/sunlint-code-quality/rules/go/S037-anti-cache-headers.md +43 -0
  147. package/skill-assets/sunlint-code-quality/rules/go/S039-tls-certificate-validation.md +41 -0
  148. package/skill-assets/sunlint-code-quality/rules/go/S041-logout-invalidation.md +46 -0
  149. package/skill-assets/sunlint-code-quality/rules/go/S042-long-lived-sessions.md +58 -0
  150. package/skill-assets/sunlint-code-quality/rules/go/S044-critical-changes-reauth.md +53 -0
  151. package/skill-assets/sunlint-code-quality/rules/go/S045-brute-force-protection.md +55 -0
  152. package/skill-assets/sunlint-code-quality/rules/go/S047-oauth-csrf-protection.md +51 -0
  153. package/skill-assets/sunlint-code-quality/rules/go/S048-oauth-redirect-validation.md +58 -0
  154. package/skill-assets/sunlint-code-quality/rules/go/S049-auth-code-expiry.md +52 -0
  155. package/skill-assets/sunlint-code-quality/rules/go/S050-token-entropy.md +53 -0
  156. package/skill-assets/sunlint-code-quality/rules/go/S051-password-length.md +49 -0
  157. package/skill-assets/sunlint-code-quality/rules/go/S052-otp-entropy.md +48 -0
  158. package/skill-assets/sunlint-code-quality/rules/go/S053-generic-error-messages.md +51 -0
  159. package/skill-assets/sunlint-code-quality/rules/go/S054-no-default-admin.md +43 -0
  160. package/skill-assets/sunlint-code-quality/rules/go/S055-content-type-validation.md +52 -0
  161. package/skill-assets/sunlint-code-quality/rules/go/S056-log-injection.md +40 -0
  162. package/skill-assets/sunlint-code-quality/rules/go/S057-synchronized-time.md +40 -0
  163. package/skill-assets/sunlint-code-quality/rules/go/S058-ssrf-protection.md +70 -0
  164. package/skill-assets/sunlint-code-quality/rules/java/C006-verb-noun-functions.md +36 -0
  165. package/skill-assets/sunlint-code-quality/rules/java/C013-no-dead-code.md +175 -0
  166. package/skill-assets/sunlint-code-quality/rules/java/C014-dependency-injection.md +42 -0
  167. package/skill-assets/sunlint-code-quality/rules/java/C017-no-constructor-logic.md +39 -0
  168. package/skill-assets/sunlint-code-quality/rules/java/C018-generic-errors.md +28 -0
  169. package/skill-assets/sunlint-code-quality/rules/java/C019-error-log-level.md +34 -0
  170. package/skill-assets/sunlint-code-quality/rules/java/C020-no-unused-imports.md +34 -0
  171. package/skill-assets/sunlint-code-quality/rules/java/C022-no-unused-variables.md +31 -0
  172. package/skill-assets/sunlint-code-quality/rules/java/C023-no-duplicate-names.md +37 -0
  173. package/skill-assets/sunlint-code-quality/rules/java/C024-centralize-constants.md +36 -0
  174. package/skill-assets/sunlint-code-quality/rules/java/C029-catch-log-root-cause.md +42 -0
  175. package/skill-assets/sunlint-code-quality/rules/java/C030-custom-error-classes.md +50 -0
  176. package/skill-assets/sunlint-code-quality/rules/java/C033-separate-data-access.md +46 -0
  177. package/skill-assets/sunlint-code-quality/rules/java/C035-error-context-logging.md +38 -0
  178. package/skill-assets/sunlint-code-quality/rules/java/C041-no-hardcoded-secrets.md +34 -0
  179. package/skill-assets/sunlint-code-quality/rules/java/C042-boolean-naming.md +27 -0
  180. package/skill-assets/sunlint-code-quality/rules/java/C052-controller-parsing.md +39 -0
  181. package/skill-assets/sunlint-code-quality/rules/java/C060-superclass-logic.md +32 -0
  182. package/skill-assets/sunlint-code-quality/rules/java/C067-no-hardcoded-config.md +31 -0
  183. package/skill-assets/sunlint-code-quality/rules/java/S003-open-redirect.md +38 -0
  184. package/skill-assets/sunlint-code-quality/rules/java/S004-no-log-credentials.md +36 -0
  185. package/skill-assets/sunlint-code-quality/rules/java/S005-server-authorization.md +53 -0
  186. package/skill-assets/sunlint-code-quality/rules/java/S006-default-credentials.md +39 -0
  187. package/skill-assets/sunlint-code-quality/rules/java/S007-output-encoding.md +49 -0
  188. package/skill-assets/sunlint-code-quality/rules/java/S009-approved-crypto.md +40 -0
  189. package/skill-assets/sunlint-code-quality/rules/java/S010-csprng.md +36 -0
  190. package/skill-assets/sunlint-code-quality/rules/java/S011-encrypted-client-hello.md +27 -0
  191. package/skill-assets/sunlint-code-quality/rules/java/S012-secrets-management.md +34 -0
  192. package/skill-assets/sunlint-code-quality/rules/java/S013-tls-connections.md +40 -0
  193. package/skill-assets/sunlint-code-quality/rules/java/S016-no-sensitive-query-string.md +36 -0
  194. package/skill-assets/sunlint-code-quality/rules/java/S017-parameterized-queries.md +47 -0
  195. package/skill-assets/sunlint-code-quality/rules/java/S019-email-input-sanitization.md +32 -0
  196. package/skill-assets/sunlint-code-quality/rules/java/S020-eval-code-execution.md +45 -0
  197. package/skill-assets/sunlint-code-quality/rules/java/S022-context-escaping.md +28 -0
  198. package/skill-assets/sunlint-code-quality/rules/java/S023-dynamic-js-encoding.md +28 -0
  199. package/skill-assets/sunlint-code-quality/rules/java/S025-server-validation.md +58 -0
  200. package/skill-assets/sunlint-code-quality/rules/java/S026-tls-encryption.md +57 -0
  201. package/skill-assets/sunlint-code-quality/rules/java/S027-mtls-validation.md +26 -0
  202. package/skill-assets/sunlint-code-quality/rules/java/S028-upload-limits.md +35 -0
  203. package/skill-assets/sunlint-code-quality/rules/java/S029-csrf-protection.md +35 -0
  204. package/skill-assets/sunlint-code-quality/rules/java/S030-directory-browsing.md +38 -0
  205. package/skill-assets/sunlint-code-quality/rules/java/S031-secure-cookie-flag.md +38 -0
  206. package/skill-assets/sunlint-code-quality/rules/java/S032-httponly-cookie.md +31 -0
  207. package/skill-assets/sunlint-code-quality/rules/java/S033-samesite-cookie.md +42 -0
  208. package/skill-assets/sunlint-code-quality/rules/java/S034-host-prefix-cookie.md +35 -0
  209. package/skill-assets/sunlint-code-quality/rules/java/S035-app-hostnames.md +23 -0
  210. package/skill-assets/sunlint-code-quality/rules/java/S036-internal-file-paths.md +39 -0
  211. package/skill-assets/sunlint-code-quality/rules/java/S037-anti-cache-headers.md +37 -0
  212. package/skill-assets/sunlint-code-quality/rules/java/S039-tls-certificate-validation.md +43 -0
  213. package/skill-assets/sunlint-code-quality/rules/java/S041-logout-invalidation.md +53 -0
  214. package/skill-assets/sunlint-code-quality/rules/java/S042-long-lived-sessions.md +36 -0
  215. package/skill-assets/sunlint-code-quality/rules/java/S044-critical-changes-reauth.md +28 -0
  216. package/skill-assets/sunlint-code-quality/rules/java/S045-brute-force-protection.md +38 -0
  217. package/skill-assets/sunlint-code-quality/rules/java/S047-oauth-csrf-protection.md +33 -0
  218. package/skill-assets/sunlint-code-quality/rules/java/S048-oauth-redirect-validation.md +25 -0
  219. package/skill-assets/sunlint-code-quality/rules/java/S049-auth-code-expiry.md +23 -0
  220. package/skill-assets/sunlint-code-quality/rules/java/S050-token-entropy.md +20 -0
  221. package/skill-assets/sunlint-code-quality/rules/java/S051-password-length.md +20 -0
  222. package/skill-assets/sunlint-code-quality/rules/java/S052-otp-entropy.md +23 -0
  223. package/skill-assets/sunlint-code-quality/rules/java/S053-generic-error-messages.md +21 -0
  224. package/skill-assets/sunlint-code-quality/rules/java/S054-no-default-admin.md +16 -0
  225. package/skill-assets/sunlint-code-quality/rules/java/S055-content-type-validation.md +36 -0
  226. package/skill-assets/sunlint-code-quality/rules/java/S056-log-injection.md +38 -0
  227. package/skill-assets/sunlint-code-quality/rules/java/S057-synchronized-time.md +35 -0
  228. package/skill-assets/sunlint-code-quality/rules/java/S058-ssrf-protection.md +56 -0
  229. package/skill-assets/sunlint-code-quality/rules/kotlin/C006-verb-noun-functions.md +45 -0
  230. package/skill-assets/sunlint-code-quality/rules/kotlin/C013-no-dead-code.md +49 -0
  231. package/skill-assets/sunlint-code-quality/rules/kotlin/C014-dependency-injection.md +64 -0
  232. package/skill-assets/sunlint-code-quality/rules/kotlin/C017-no-constructor-logic.md +68 -0
  233. package/skill-assets/sunlint-code-quality/rules/kotlin/C018-generic-errors.md +46 -0
  234. package/skill-assets/sunlint-code-quality/rules/kotlin/C019-error-log-level.md +50 -0
  235. package/skill-assets/sunlint-code-quality/rules/kotlin/C020-no-unused-imports.md +44 -0
  236. package/skill-assets/sunlint-code-quality/rules/kotlin/C022-no-unused-variables.md +39 -0
  237. package/skill-assets/sunlint-code-quality/rules/kotlin/C023-no-duplicate-names.md +47 -0
  238. package/skill-assets/sunlint-code-quality/rules/kotlin/C024-centralize-constants.md +58 -0
  239. package/skill-assets/sunlint-code-quality/rules/kotlin/C029-catch-log-root-cause.md +50 -0
  240. package/skill-assets/sunlint-code-quality/rules/kotlin/C030-custom-error-classes.md +72 -0
  241. package/skill-assets/sunlint-code-quality/rules/kotlin/C033-separate-data-access.md +69 -0
  242. package/skill-assets/sunlint-code-quality/rules/kotlin/C035-error-context-logging.md +47 -0
  243. package/skill-assets/sunlint-code-quality/rules/kotlin/C041-no-hardcoded-secrets.md +47 -0
  244. package/skill-assets/sunlint-code-quality/rules/kotlin/C042-boolean-naming.md +42 -0
  245. package/skill-assets/sunlint-code-quality/rules/kotlin/C052-controller-parsing.md +71 -0
  246. package/skill-assets/sunlint-code-quality/rules/kotlin/C060-superclass-logic.md +60 -0
  247. package/skill-assets/sunlint-code-quality/rules/kotlin/C067-no-hardcoded-config.md +51 -0
  248. package/skill-assets/sunlint-code-quality/rules/kotlin/S003-open-redirect.md +66 -0
  249. package/skill-assets/sunlint-code-quality/rules/kotlin/S004-no-log-credentials.md +59 -0
  250. package/skill-assets/sunlint-code-quality/rules/kotlin/S005-server-authorization.md +75 -0
  251. package/skill-assets/sunlint-code-quality/rules/kotlin/S006-default-credentials.md +49 -0
  252. package/skill-assets/sunlint-code-quality/rules/kotlin/S007-output-encoding.md +62 -0
  253. package/skill-assets/sunlint-code-quality/rules/kotlin/S009-approved-crypto.md +51 -0
  254. package/skill-assets/sunlint-code-quality/rules/kotlin/S010-csprng.md +61 -0
  255. package/skill-assets/sunlint-code-quality/rules/kotlin/S011-encrypted-client-hello.md +48 -0
  256. package/skill-assets/sunlint-code-quality/rules/kotlin/S012-secrets-management.md +53 -0
  257. package/skill-assets/sunlint-code-quality/rules/kotlin/S013-tls-connections.md +61 -0
  258. package/skill-assets/sunlint-code-quality/rules/kotlin/S016-no-sensitive-query-string.md +51 -0
  259. package/skill-assets/sunlint-code-quality/rules/kotlin/S017-parameterized-queries.md +41 -0
  260. package/skill-assets/sunlint-code-quality/rules/kotlin/S019-email-input-sanitization.md +50 -0
  261. package/skill-assets/sunlint-code-quality/rules/kotlin/S020-eval-code-execution.md +57 -0
  262. package/skill-assets/sunlint-code-quality/rules/kotlin/S022-context-escaping.md +58 -0
  263. package/skill-assets/sunlint-code-quality/rules/kotlin/S023-dynamic-js-encoding.md +57 -0
  264. package/skill-assets/sunlint-code-quality/rules/kotlin/S025-server-validation.md +59 -0
  265. package/skill-assets/sunlint-code-quality/rules/kotlin/S026-tls-encryption.md +50 -0
  266. package/skill-assets/sunlint-code-quality/rules/kotlin/S027-mtls-validation.md +60 -0
  267. package/skill-assets/sunlint-code-quality/rules/kotlin/S028-upload-limits.md +67 -0
  268. package/skill-assets/sunlint-code-quality/rules/kotlin/S029-csrf-protection.md +57 -0
  269. package/skill-assets/sunlint-code-quality/rules/kotlin/S030-directory-browsing.md +50 -0
  270. package/skill-assets/sunlint-code-quality/rules/kotlin/S031-secure-cookie-flag.md +51 -0
  271. package/skill-assets/sunlint-code-quality/rules/kotlin/S032-httponly-cookie.md +49 -0
  272. package/skill-assets/sunlint-code-quality/rules/kotlin/S033-samesite-cookie.md +54 -0
  273. package/skill-assets/sunlint-code-quality/rules/kotlin/S034-host-prefix-cookie.md +50 -0
  274. package/skill-assets/sunlint-code-quality/rules/kotlin/S035-app-hostnames.md +59 -0
  275. package/skill-assets/sunlint-code-quality/rules/kotlin/S036-internal-file-paths.md +61 -0
  276. package/skill-assets/sunlint-code-quality/rules/kotlin/S037-anti-cache-headers.md +58 -0
  277. package/skill-assets/sunlint-code-quality/rules/kotlin/S039-tls-certificate-validation.md +62 -0
  278. package/skill-assets/sunlint-code-quality/rules/kotlin/S041-logout-invalidation.md +71 -0
  279. package/skill-assets/sunlint-code-quality/rules/kotlin/S042-long-lived-sessions.md +57 -0
  280. package/skill-assets/sunlint-code-quality/rules/kotlin/S044-critical-changes-reauth.md +64 -0
  281. package/skill-assets/sunlint-code-quality/rules/kotlin/S045-brute-force-protection.md +64 -0
  282. package/skill-assets/sunlint-code-quality/rules/kotlin/S047-oauth-csrf-protection.md +74 -0
  283. package/skill-assets/sunlint-code-quality/rules/kotlin/S048-oauth-redirect-validation.md +61 -0
  284. package/skill-assets/sunlint-code-quality/rules/kotlin/S049-auth-code-expiry.md +70 -0
  285. package/skill-assets/sunlint-code-quality/rules/kotlin/S050-token-entropy.md +65 -0
  286. package/skill-assets/sunlint-code-quality/rules/kotlin/S051-password-length.md +52 -0
  287. package/skill-assets/sunlint-code-quality/rules/kotlin/S052-otp-entropy.md +55 -0
  288. package/skill-assets/sunlint-code-quality/rules/kotlin/S053-generic-error-messages.md +66 -0
  289. package/skill-assets/sunlint-code-quality/rules/kotlin/S054-no-default-admin.md +57 -0
  290. package/skill-assets/sunlint-code-quality/rules/kotlin/S055-content-type-validation.md +58 -0
  291. package/skill-assets/sunlint-code-quality/rules/kotlin/S056-log-injection.md +47 -0
  292. package/skill-assets/sunlint-code-quality/rules/kotlin/S057-synchronized-time.md +49 -0
  293. package/skill-assets/sunlint-code-quality/rules/kotlin/S058-ssrf-protection.md +69 -0
  294. package/skill-assets/sunlint-code-quality/rules/php/C006-verb-noun-functions.md +46 -0
  295. package/skill-assets/sunlint-code-quality/rules/php/C013-no-dead-code.md +53 -0
  296. package/skill-assets/sunlint-code-quality/rules/php/C014-dependency-injection.md +71 -0
  297. package/skill-assets/sunlint-code-quality/rules/php/C017-no-constructor-logic.md +68 -0
  298. package/skill-assets/sunlint-code-quality/rules/php/C018-generic-errors.md +50 -0
  299. package/skill-assets/sunlint-code-quality/rules/php/C019-error-log-level.md +54 -0
  300. package/skill-assets/sunlint-code-quality/rules/php/C020-no-unused-imports.md +55 -0
  301. package/skill-assets/sunlint-code-quality/rules/php/C022-no-unused-variables.md +51 -0
  302. package/skill-assets/sunlint-code-quality/rules/php/C023-no-duplicate-names.md +61 -0
  303. package/skill-assets/sunlint-code-quality/rules/php/C024-centralize-constants.md +60 -0
  304. package/skill-assets/sunlint-code-quality/rules/php/C029-catch-log-root-cause.md +57 -0
  305. package/skill-assets/sunlint-code-quality/rules/php/C030-custom-error-classes.md +62 -0
  306. package/skill-assets/sunlint-code-quality/rules/php/C033-separate-data-access.md +79 -0
  307. package/skill-assets/sunlint-code-quality/rules/php/C035-error-context-logging.md +54 -0
  308. package/skill-assets/sunlint-code-quality/rules/php/C041-no-hardcoded-secrets.md +59 -0
  309. package/skill-assets/sunlint-code-quality/rules/php/C042-boolean-naming.md +52 -0
  310. package/skill-assets/sunlint-code-quality/rules/php/C052-controller-parsing.md +66 -0
  311. package/skill-assets/sunlint-code-quality/rules/php/C060-superclass-logic.md +54 -0
  312. package/skill-assets/sunlint-code-quality/rules/php/C067-no-hardcoded-config.md +55 -0
  313. package/skill-assets/sunlint-code-quality/rules/php/S003-open-redirect.md +60 -0
  314. package/skill-assets/sunlint-code-quality/rules/php/S004-no-log-credentials.md +67 -0
  315. package/skill-assets/sunlint-code-quality/rules/php/S005-server-authorization.md +57 -0
  316. package/skill-assets/sunlint-code-quality/rules/php/S006-default-credentials.md +61 -0
  317. package/skill-assets/sunlint-code-quality/rules/php/S007-output-encoding.md +61 -0
  318. package/skill-assets/sunlint-code-quality/rules/php/S009-approved-crypto.md +53 -0
  319. package/skill-assets/sunlint-code-quality/rules/php/S010-csprng.md +47 -0
  320. package/skill-assets/sunlint-code-quality/rules/php/S011-encrypted-client-hello.md +41 -0
  321. package/skill-assets/sunlint-code-quality/rules/php/S012-secrets-management.md +60 -0
  322. package/skill-assets/sunlint-code-quality/rules/php/S013-tls-connections.md +67 -0
  323. package/skill-assets/sunlint-code-quality/rules/php/S016-no-sensitive-query-string.md +61 -0
  324. package/skill-assets/sunlint-code-quality/rules/php/S017-parameterized-queries.md +44 -0
  325. package/skill-assets/sunlint-code-quality/rules/php/S019-email-input-sanitization.md +54 -0
  326. package/skill-assets/sunlint-code-quality/rules/php/S020-eval-code-execution.md +57 -0
  327. package/skill-assets/sunlint-code-quality/rules/php/S022-context-escaping.md +58 -0
  328. package/skill-assets/sunlint-code-quality/rules/php/S023-dynamic-js-encoding.md +62 -0
  329. package/skill-assets/sunlint-code-quality/rules/php/S025-server-validation.md +63 -0
  330. package/skill-assets/sunlint-code-quality/rules/php/S026-tls-encryption.md +48 -0
  331. package/skill-assets/sunlint-code-quality/rules/php/S027-mtls-validation.md +62 -0
  332. package/skill-assets/sunlint-code-quality/rules/php/S028-upload-limits.md +60 -0
  333. package/skill-assets/sunlint-code-quality/rules/php/S029-csrf-protection.md +65 -0
  334. package/skill-assets/sunlint-code-quality/rules/php/S030-directory-browsing.md +40 -0
  335. package/skill-assets/sunlint-code-quality/rules/php/S031-secure-cookie-flag.md +55 -0
  336. package/skill-assets/sunlint-code-quality/rules/php/S032-httponly-cookie.md +54 -0
  337. package/skill-assets/sunlint-code-quality/rules/php/S033-samesite-cookie.md +52 -0
  338. package/skill-assets/sunlint-code-quality/rules/php/S034-host-prefix-cookie.md +49 -0
  339. package/skill-assets/sunlint-code-quality/rules/php/S035-app-hostnames.md +49 -0
  340. package/skill-assets/sunlint-code-quality/rules/php/S036-internal-file-paths.md +56 -0
  341. package/skill-assets/sunlint-code-quality/rules/php/S037-anti-cache-headers.md +56 -0
  342. package/skill-assets/sunlint-code-quality/rules/php/S039-tls-certificate-validation.md +54 -0
  343. package/skill-assets/sunlint-code-quality/rules/php/S041-logout-invalidation.md +63 -0
  344. package/skill-assets/sunlint-code-quality/rules/php/S042-long-lived-sessions.md +57 -0
  345. package/skill-assets/sunlint-code-quality/rules/php/S044-critical-changes-reauth.md +71 -0
  346. package/skill-assets/sunlint-code-quality/rules/php/S045-brute-force-protection.md +67 -0
  347. package/skill-assets/sunlint-code-quality/rules/php/S047-oauth-csrf-protection.md +72 -0
  348. package/skill-assets/sunlint-code-quality/rules/php/S048-oauth-redirect-validation.md +54 -0
  349. package/skill-assets/sunlint-code-quality/rules/php/S049-auth-code-expiry.md +71 -0
  350. package/skill-assets/sunlint-code-quality/rules/php/S050-token-entropy.md +58 -0
  351. package/skill-assets/sunlint-code-quality/rules/php/S051-password-length.md +59 -0
  352. package/skill-assets/sunlint-code-quality/rules/php/S052-otp-entropy.md +45 -0
  353. package/skill-assets/sunlint-code-quality/rules/php/S053-generic-error-messages.md +59 -0
  354. package/skill-assets/sunlint-code-quality/rules/php/S054-no-default-admin.md +62 -0
  355. package/skill-assets/sunlint-code-quality/rules/php/S055-content-type-validation.md +58 -0
  356. package/skill-assets/sunlint-code-quality/rules/php/S056-log-injection.md +48 -0
  357. package/skill-assets/sunlint-code-quality/rules/php/S057-synchronized-time.md +52 -0
  358. package/skill-assets/sunlint-code-quality/rules/php/S058-ssrf-protection.md +65 -0
  359. package/skill-assets/sunlint-code-quality/rules/python/C006-verb-noun-functions.md +30 -0
  360. package/skill-assets/sunlint-code-quality/rules/python/C013-no-dead-code.md +24 -0
  361. package/skill-assets/sunlint-code-quality/rules/python/C014-dependency-injection.md +68 -0
  362. package/skill-assets/sunlint-code-quality/rules/python/C017-no-constructor-logic.md +30 -0
  363. package/skill-assets/sunlint-code-quality/rules/python/C018-generic-errors.md +25 -0
  364. package/skill-assets/sunlint-code-quality/rules/python/C019-error-log-level.md +26 -0
  365. package/skill-assets/sunlint-code-quality/rules/python/C020-no-unused-imports.md +28 -0
  366. package/skill-assets/sunlint-code-quality/rules/python/C022-no-unused-variables.md +24 -0
  367. package/skill-assets/sunlint-code-quality/rules/python/C023-no-duplicate-names.md +27 -0
  368. package/skill-assets/sunlint-code-quality/rules/python/C024-centralize-constants.md +27 -0
  369. package/skill-assets/sunlint-code-quality/rules/python/C029-catch-log-root-cause.md +61 -0
  370. package/skill-assets/sunlint-code-quality/rules/python/C030-custom-error-classes.md +28 -0
  371. package/skill-assets/sunlint-code-quality/rules/python/C033-separate-data-access.md +53 -0
  372. package/skill-assets/sunlint-code-quality/rules/python/C035-error-context-logging.md +26 -0
  373. package/skill-assets/sunlint-code-quality/rules/python/C041-no-hardcoded-secrets.md +23 -0
  374. package/skill-assets/sunlint-code-quality/rules/python/C042-boolean-naming.md +24 -0
  375. package/skill-assets/sunlint-code-quality/rules/python/C052-controller-parsing.md +34 -0
  376. package/skill-assets/sunlint-code-quality/rules/python/C060-superclass-logic.md +26 -0
  377. package/skill-assets/sunlint-code-quality/rules/python/C067-no-hardcoded-config.md +22 -0
  378. package/skill-assets/sunlint-code-quality/rules/python/S003-open-redirect.md +16 -0
  379. package/skill-assets/sunlint-code-quality/rules/python/S004-no-log-credentials.md +16 -0
  380. package/skill-assets/sunlint-code-quality/rules/python/S005-server-authorization.md +16 -0
  381. package/skill-assets/sunlint-code-quality/rules/python/S006-default-credentials.md +16 -0
  382. package/skill-assets/sunlint-code-quality/rules/python/S007-output-encoding.md +16 -0
  383. package/skill-assets/sunlint-code-quality/rules/python/S009-approved-crypto.md +16 -0
  384. package/skill-assets/sunlint-code-quality/rules/python/S010-csprng.md +16 -0
  385. package/skill-assets/sunlint-code-quality/rules/python/S011-encrypted-client-hello.md +16 -0
  386. package/skill-assets/sunlint-code-quality/rules/python/S012-secrets-management.md +16 -0
  387. package/skill-assets/sunlint-code-quality/rules/python/S013-tls-connections.md +16 -0
  388. package/skill-assets/sunlint-code-quality/rules/python/S016-no-sensitive-query-string.md +16 -0
  389. package/skill-assets/sunlint-code-quality/rules/python/S017-parameterized-queries.md +51 -0
  390. package/skill-assets/sunlint-code-quality/rules/python/S019-email-input-sanitization.md +16 -0
  391. package/skill-assets/sunlint-code-quality/rules/python/S020-eval-code-execution.md +51 -0
  392. package/skill-assets/sunlint-code-quality/rules/python/S022-context-escaping.md +16 -0
  393. package/skill-assets/sunlint-code-quality/rules/python/S023-dynamic-js-encoding.md +16 -0
  394. package/skill-assets/sunlint-code-quality/rules/python/S025-server-validation.md +16 -0
  395. package/skill-assets/sunlint-code-quality/rules/python/S026-tls-encryption.md +16 -0
  396. package/skill-assets/sunlint-code-quality/rules/python/S027-mtls-validation.md +16 -0
  397. package/skill-assets/sunlint-code-quality/rules/python/S028-upload-limits.md +16 -0
  398. package/skill-assets/sunlint-code-quality/rules/python/S029-csrf-protection.md +16 -0
  399. package/skill-assets/sunlint-code-quality/rules/python/S030-directory-browsing.md +16 -0
  400. package/skill-assets/sunlint-code-quality/rules/python/S031-secure-cookie-flag.md +16 -0
  401. package/skill-assets/sunlint-code-quality/rules/python/S032-httponly-cookie.md +16 -0
  402. package/skill-assets/sunlint-code-quality/rules/python/S033-samesite-cookie.md +16 -0
  403. package/skill-assets/sunlint-code-quality/rules/python/S034-host-prefix-cookie.md +16 -0
  404. package/skill-assets/sunlint-code-quality/rules/python/S035-app-hostnames.md +16 -0
  405. package/skill-assets/sunlint-code-quality/rules/python/S036-internal-file-paths.md +50 -0
  406. package/skill-assets/sunlint-code-quality/rules/python/S037-anti-cache-headers.md +16 -0
  407. package/skill-assets/sunlint-code-quality/rules/python/S039-tls-certificate-validation.md +16 -0
  408. package/skill-assets/sunlint-code-quality/rules/python/S041-logout-invalidation.md +16 -0
  409. package/skill-assets/sunlint-code-quality/rules/python/S042-long-lived-sessions.md +16 -0
  410. package/skill-assets/sunlint-code-quality/rules/python/S044-critical-changes-reauth.md +16 -0
  411. package/skill-assets/sunlint-code-quality/rules/python/S045-brute-force-protection.md +16 -0
  412. package/skill-assets/sunlint-code-quality/rules/python/S047-oauth-csrf-protection.md +16 -0
  413. package/skill-assets/sunlint-code-quality/rules/python/S048-oauth-redirect-validation.md +16 -0
  414. package/skill-assets/sunlint-code-quality/rules/python/S049-auth-code-expiry.md +16 -0
  415. package/skill-assets/sunlint-code-quality/rules/python/S050-token-entropy.md +16 -0
  416. package/skill-assets/sunlint-code-quality/rules/python/S051-password-length.md +16 -0
  417. package/skill-assets/sunlint-code-quality/rules/python/S052-otp-entropy.md +16 -0
  418. package/skill-assets/sunlint-code-quality/rules/python/S053-generic-error-messages.md +16 -0
  419. package/skill-assets/sunlint-code-quality/rules/python/S054-no-default-admin.md +16 -0
  420. package/skill-assets/sunlint-code-quality/rules/python/S055-content-type-validation.md +16 -0
  421. package/skill-assets/sunlint-code-quality/rules/python/S056-log-injection.md +16 -0
  422. package/skill-assets/sunlint-code-quality/rules/python/S057-synchronized-time.md +16 -0
  423. package/skill-assets/sunlint-code-quality/rules/python/S058-ssrf-protection.md +57 -0
  424. package/skill-assets/sunlint-code-quality/rules/typescript/C006-verb-noun-functions.md +45 -0
  425. package/skill-assets/sunlint-code-quality/rules/typescript/C013-no-dead-code.md +51 -0
  426. package/skill-assets/sunlint-code-quality/rules/typescript/C014-dependency-injection.md +69 -0
  427. package/skill-assets/sunlint-code-quality/rules/typescript/C017-no-constructor-logic.md +60 -0
  428. package/skill-assets/sunlint-code-quality/rules/typescript/C018-generic-errors.md +47 -0
  429. package/skill-assets/sunlint-code-quality/rules/typescript/C019-error-log-level.md +50 -0
  430. package/skill-assets/sunlint-code-quality/rules/typescript/C020-no-unused-imports.md +55 -0
  431. package/skill-assets/sunlint-code-quality/rules/typescript/C022-no-unused-variables.md +59 -0
  432. package/skill-assets/sunlint-code-quality/rules/typescript/C023-no-duplicate-names.md +58 -0
  433. package/skill-assets/sunlint-code-quality/rules/typescript/C024-centralize-constants.md +56 -0
  434. package/skill-assets/sunlint-code-quality/rules/typescript/C029-catch-log-root-cause.md +53 -0
  435. package/skill-assets/sunlint-code-quality/rules/typescript/C030-custom-error-classes.md +60 -0
  436. package/skill-assets/sunlint-code-quality/rules/typescript/C033-separate-data-access.md +69 -0
  437. package/skill-assets/sunlint-code-quality/rules/typescript/C035-error-context-logging.md +50 -0
  438. package/skill-assets/sunlint-code-quality/rules/typescript/C041-no-hardcoded-secrets.md +47 -0
  439. package/skill-assets/sunlint-code-quality/rules/typescript/C042-boolean-naming.md +42 -0
  440. package/skill-assets/sunlint-code-quality/rules/typescript/C052-controller-parsing.md +64 -0
  441. package/skill-assets/sunlint-code-quality/rules/typescript/C060-superclass-logic.md +67 -0
  442. package/skill-assets/sunlint-code-quality/rules/typescript/C067-no-hardcoded-config.md +52 -0
  443. package/skill-assets/sunlint-code-quality/rules/typescript/S003-open-redirect.md +76 -0
  444. package/skill-assets/sunlint-code-quality/rules/typescript/S004-no-log-credentials.md +71 -0
  445. package/skill-assets/sunlint-code-quality/rules/typescript/S005-server-authorization.md +68 -0
  446. package/skill-assets/sunlint-code-quality/rules/typescript/S006-default-credentials.md +69 -0
  447. package/skill-assets/sunlint-code-quality/rules/typescript/S007-output-encoding.md +60 -0
  448. package/skill-assets/sunlint-code-quality/rules/typescript/S009-approved-crypto.md +53 -0
  449. package/skill-assets/sunlint-code-quality/rules/typescript/S010-csprng.md +53 -0
  450. package/skill-assets/sunlint-code-quality/rules/typescript/S011-encrypted-client-hello.md +45 -0
  451. package/skill-assets/sunlint-code-quality/rules/typescript/S012-secrets-management.md +47 -0
  452. package/skill-assets/sunlint-code-quality/rules/typescript/S013-tls-connections.md +70 -0
  453. package/skill-assets/sunlint-code-quality/rules/typescript/S016-no-sensitive-query-string.md +53 -0
  454. package/skill-assets/sunlint-code-quality/rules/typescript/S017-parameterized-queries.md +55 -0
  455. package/skill-assets/sunlint-code-quality/rules/typescript/S019-email-input-sanitization.md +56 -0
  456. package/skill-assets/sunlint-code-quality/rules/typescript/S020-eval-code-execution.md +58 -0
  457. package/skill-assets/sunlint-code-quality/rules/typescript/S022-context-escaping.md +48 -0
  458. package/skill-assets/sunlint-code-quality/rules/typescript/S023-dynamic-js-encoding.md +52 -0
  459. package/skill-assets/sunlint-code-quality/rules/typescript/S025-server-validation.md +62 -0
  460. package/skill-assets/sunlint-code-quality/rules/typescript/S026-tls-encryption.md +47 -0
  461. package/skill-assets/sunlint-code-quality/rules/typescript/S027-mtls-validation.md +50 -0
  462. package/skill-assets/sunlint-code-quality/rules/typescript/S028-upload-limits.md +65 -0
  463. package/skill-assets/sunlint-code-quality/rules/typescript/S029-csrf-protection.md +62 -0
  464. package/skill-assets/sunlint-code-quality/rules/typescript/S030-directory-browsing.md +52 -0
  465. package/skill-assets/sunlint-code-quality/rules/typescript/S031-secure-cookie-flag.md +48 -0
  466. package/skill-assets/sunlint-code-quality/rules/typescript/S032-httponly-cookie.md +36 -0
  467. package/skill-assets/sunlint-code-quality/rules/typescript/S033-samesite-cookie.md +46 -0
  468. package/skill-assets/sunlint-code-quality/rules/typescript/S034-host-prefix-cookie.md +50 -0
  469. package/skill-assets/sunlint-code-quality/rules/typescript/S035-app-hostnames.md +49 -0
  470. package/skill-assets/sunlint-code-quality/rules/typescript/S036-internal-file-paths.md +53 -0
  471. package/skill-assets/sunlint-code-quality/rules/typescript/S037-anti-cache-headers.md +52 -0
  472. package/skill-assets/sunlint-code-quality/rules/typescript/S039-tls-certificate-validation.md +51 -0
  473. package/skill-assets/sunlint-code-quality/rules/typescript/S041-logout-invalidation.md +58 -0
  474. package/skill-assets/sunlint-code-quality/rules/typescript/S042-long-lived-sessions.md +55 -0
  475. package/skill-assets/sunlint-code-quality/rules/typescript/S044-critical-changes-reauth.md +69 -0
  476. package/skill-assets/sunlint-code-quality/rules/typescript/S045-brute-force-protection.md +59 -0
  477. package/skill-assets/sunlint-code-quality/rules/typescript/S047-oauth-csrf-protection.md +60 -0
  478. package/skill-assets/sunlint-code-quality/rules/typescript/S048-oauth-redirect-validation.md +59 -0
  479. package/skill-assets/sunlint-code-quality/rules/typescript/S049-auth-code-expiry.md +73 -0
  480. package/skill-assets/sunlint-code-quality/rules/typescript/S050-token-entropy.md +48 -0
  481. package/skill-assets/sunlint-code-quality/rules/typescript/S051-password-length.md +60 -0
  482. package/skill-assets/sunlint-code-quality/rules/typescript/S052-otp-entropy.md +49 -0
  483. package/skill-assets/sunlint-code-quality/rules/typescript/S053-generic-error-messages.md +61 -0
  484. package/skill-assets/sunlint-code-quality/rules/typescript/S054-no-default-admin.md +64 -0
  485. package/skill-assets/sunlint-code-quality/rules/typescript/S055-content-type-validation.md +64 -0
  486. package/skill-assets/sunlint-code-quality/rules/typescript/S056-log-injection.md +48 -0
  487. package/skill-assets/sunlint-code-quality/rules/typescript/S057-synchronized-time.md +57 -0
  488. package/skill-assets/sunlint-code-quality/rules/typescript/S058-ssrf-protection.md +63 -0
@@ -0,0 +1,57 @@
1
+ ---
2
+ title: Avoid Eval Or Dynamic Code Execution
3
+ impact: CRITICAL
4
+ impactDescription: prevents Remote Code Execution (RCE) vulnerabilities
5
+ tags: eval, code-execution, rce, injection, security, kotlin
6
+ ---
7
+
8
+ ## Avoid Eval Or Dynamic Code Execution
9
+
10
+ Executing code dynamically based on user input (e.g., using Script Engines or Reflection) is extremely dangerous. It allows attackers to execute arbitrary commands on the host system, leading to full server compromise.
11
+
12
+ **Incorrect (dynamic code execution):**
13
+
14
+ ```kotlin
15
+ // Using JavaScript engine with user input
16
+ val engine = ScriptEngineManager().getEngineByName("javascript")
17
+ val userInput = request.getParameter("formula")
18
+ val result = engine.eval(userInput) // RCE vulnerability!
19
+
20
+ // Reflection with user-provided class names
21
+ val className = request.getParameter("type")
22
+ val instance = Class.forName(className).getDeclaredConstructor().newInstance()
23
+ // Attacker can pass "java.lang.ProcessBuilder"
24
+ ```
25
+
26
+ **Correct (safe alternatives):**
27
+
28
+ ```kotlin
29
+ // Use a specialized safe expression parser (e.g., exp4j)
30
+ val expression = ExpressionBuilder(userInput)
31
+ .variables("x")
32
+ .build()
33
+ val result = expression.setVariable("x", 10.0).evaluate()
34
+
35
+ // Use a predefined map for dynamic behavior
36
+ val operations = mapOf<String, (Int, Int) -> Int>(
37
+ "add" to { a, b -> a + b },
38
+ "subtract" to { a, b -> a - b }
39
+ )
40
+ val operation = operations[userInput] ?: throw IllegalArgumentException("Invalid operation")
41
+ val result = operation(10, 5)
42
+
43
+ // For mapping types, use a factory with an allowlist
44
+ fun createService(type: String): Service = when(type) {
45
+ "email" -> EmailService()
46
+ "sms" -> SmsService()
47
+ else -> throw IllegalArgumentException("Unsupported type")
48
+ }
49
+ ```
50
+
51
+ **Never use with user input:**
52
+ - `ScriptEngine.eval()`
53
+ - `Runtime.getRuntime().exec()` without extreme sanitization (prefer `ProcessBuilder`)
54
+ - `Class.forName(userInput)`
55
+ - SpEL (Spring Expression Language) with untrusted input
56
+
57
+ **Tools:** SonarQube (S1523), Semgrep, detekt, Manual Security Audit
@@ -0,0 +1,58 @@
1
+ ---
2
+ title: Escape Data By Output Context
3
+ impact: MEDIUM
4
+ impactDescription: ensures data is safely encoded for its specific target environment (HTML, JavaScript, URL, etc.)
5
+ tags: xss, escaping, context, encoding, security, kotlin
6
+ ---
7
+
8
+ ## Escape Data By Output Context
9
+
10
+ Using the wrong escaping strategy is as dangerous as not escaping at all. For example, HTML entity encoding (like `&lt;`) in a JavaScript string context will not prevent an attacker from breaking out of the string.
11
+
12
+ **Incorrect (wrong encoding for context):**
13
+
14
+ ```kotlin
15
+ // WRONG: Using HTML escaping for a JavaScript variable
16
+ val escaped = HtmlUtils.htmlEscape(userInput)
17
+ val responseHtml = "<script>var name = '$escaped';</script>"
18
+ // Still vulnerable to breaking out of the quote if userInput contains ' or \
19
+
20
+ // WRONG: No header sanitization
21
+ response.setHeader("X-User-Note", userInput)
22
+ // Potential HTTP Header Injection (CRLF injection)
23
+ ```
24
+
25
+ **Correct (context-appropriate encoding):**
26
+
27
+ ```kotlin
28
+ import org.owasp.encoder.Encode
29
+ import java.net.URLEncoder
30
+
31
+ // 1. HTML Content Context (Normal text inside tags)
32
+ val safeHtml = Encode.forHtml(userInput)
33
+ val pTag = "<p>$safeHtml</p>"
34
+
35
+ // 2. JavaScript Context (User data inside a script tag)
36
+ val safeJsValue = Encode.forJavaScript(userInput)
37
+ val script = "<script>var username = '$safeJsValue';</script>"
38
+
39
+ // 3. URL Parameter Context (Used in a query string)
40
+ val safeUrlParam = URLEncoder.encode(userInput, "UTF-8")
41
+ val redirectUrl = "/search?q=$safeUrlParam"
42
+
43
+ // 4. HTTP Header Context (Preventing CRLF injection)
44
+ val safeHeader = userInput.replace("[\r\n]".toRegex(), "")
45
+ response.setHeader("X-Custom-Data", safeHeader)
46
+
47
+ // 5. Email Header Context
48
+ val safeSubject = emailSubject.replace("[\r\n]".toRegex(), "")
49
+ ```
50
+
51
+ **Context Rules:**
52
+ - **Inside HTML body:** Use HTML Entity encoding.
53
+ - **Inside HTML attribute:** Use HTML Attribute encoding.
54
+ - **Inside `<script>` tags:** Use JavaScript literal encoding or JSON stringification.
55
+ - **Inside CSS:** Use CSS hex escaping.
56
+ - **Inside URL:** Use URL encoding (percent-encoding).
57
+
58
+ **Tools:** OWASP Java Encoder (Recommended), Spring `HtmlUtils`, Ktor `encodeURLQueryComponent`, SonarQube (S2245)
@@ -0,0 +1,57 @@
1
+ ---
2
+ title: Output Encoding For Dynamic JS/JSON
3
+ impact: HIGH
4
+ impactDescription: prevents code injection when transferring data from backend to frontend scripts
5
+ tags: xss, javascript, json, encoding, security, kotlin
6
+ ---
7
+
8
+ ## Output Encoding For Dynamic JS/JSON
9
+
10
+ When Kotlin backends generate HTML that includes inline JavaScript or JSON data blocks, user-controlled data must be properly encoded to prevent attackers from injecting malicious scripts.
11
+
12
+ **Incorrect (unescaped data in inline JS):**
13
+
14
+ ```kotlin
15
+ // VULNERABLE: Direct string interpolation in JS
16
+ val username = request.getParameter("name") // Input: admin"; alert('xss'); "
17
+ val html = """
18
+ <script>
19
+ var currentUser = "$username";
20
+ </script>
21
+ """
22
+ call.respondText(html, ContentType.Text.Html)
23
+ ```
24
+
25
+ **Correct (proper JSON or JS encoding):**
26
+
27
+ ```kotlin
28
+ import com.fasterxml.jackson.databind.ObjectMapper
29
+ import org.owasp.encoder.Encode
30
+
31
+ // 1. Using Jackson for safe JSON serialization (Best for objects)
32
+ val mapper = ObjectMapper()
33
+ val userData = mapOf("name" to username, "id" to userId)
34
+ val safeJson = mapper.writeValueAsString(userData)
35
+
36
+ val html = """
37
+ <script>
38
+ var userData = $safeJson; // safeJson is wrapped in quotes if it's a string, or is an object
39
+ </script>
40
+ """
41
+
42
+ // 2. Using OWASP Encoder for specific JS literal strings
43
+ val safeJsString = Encode.forJavaScript(username)
44
+ val htmlLiteral = "<script>var name = '$safeJsString';</script>"
45
+
46
+ // 3. Recommended: Use HTML Data Attributes instead of inline JS
47
+ val htmlDataAttr = """
48
+ <div id="user-context" data-user-info='${Encode.forHtmlAttribute(safeJson)}'></div>
49
+ """
50
+ ```
51
+
52
+ **Key Strategies:**
53
+ - **Prefer Data Attributes:** Instead of inline `<script>`, put your data in `data-*` attributes of HTML elements and read them from your external JS file.
54
+ - **Use JSON Parsers:** Use `Jackson` or `Kotlinx.Serialization` to convert objects to JSON. They handle most escaping issues, but you still need to be careful about the `</script>` tag inside strings.
55
+ - **Escape `</script>`:** Even inside a quoted JS string, the browser might interpret `</script>` as the end of the script block. Secure encoders will escape the `/` or use unicode sequences.
56
+
57
+ **Tools:** Jackson, Kotlinx.Serialization, OWASP Java Encoder, Manual Review
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: Always Validate Client Data Server-side
3
+ impact: CRITICAL
4
+ impactDescription: ensures input validation cannot be bypassed by attackers
5
+ tags: validation, server-side, input, sanitization, security, kotlin
6
+ ---
7
+
8
+ ## Always Validate Client Data Server-side
9
+
10
+ Client-side validation (browser or mobile apps) is for User Experience (UX) only. It can be easily bypassed using tools like Proxy, cURL, or Postman. All data entering the server must be strictly validated server-side.
11
+
12
+ **Incorrect (trusting client validation):**
13
+
14
+ ```kotlin
15
+ // No server validation - trusting the mobile app
16
+ @PostMapping("/api/transfer")
17
+ fun transfer(@RequestBody data: TransferRequest): ResponseEntity<Any> {
18
+ // amount could be negative or extremely large!
19
+ transferService.execute(data.fromAccount, data.toAccount, data.amount)
20
+ return ResponseEntity.ok(SuccessResponse())
21
+ }
22
+ ```
23
+
24
+ **Correct (comprehensive server validation):**
25
+
26
+ ```kotlin
27
+ import jakarta.validation.constraints.*
28
+
29
+ data class TransferRequest(
30
+ @get:NotBlank val toAccount: String,
31
+ @get:Positive @get:Max(1000000) val amount: Double
32
+ )
33
+
34
+ @PostMapping("/api/transfer")
35
+ fun transfer(@Valid @RequestBody data: TransferRequest): ResponseEntity<Any> {
36
+ // 1. Data Format/Constraint validation (handled by @Valid)
37
+
38
+ // 2. Business logic validation
39
+ if (!accountService.exists(data.toAccount)) {
40
+ throw AccountNotFoundException(data.toAccount)
41
+ }
42
+
43
+ // 3. Authorization validation
44
+ if (!authService.canTransferFrom(currentUserId, data.fromAccount)) {
45
+ throw AccessDeniedException("Unauthorized account access")
46
+ }
47
+
48
+ transferService.execute(data.fromAccount, data.toAccount, data.amount)
49
+ return ResponseEntity.ok(SuccessResponse())
50
+ }
51
+ ```
52
+
53
+ **Validation Strategies:**
54
+ - **JSR-303 / Bean Validation:** Use annotations like `@NotNull`, `@Size`, `@Pattern`, `@Min`, `@Max`.
55
+ - **Schema Validation:** Use libraries like `Konform` or `Kvalidation` if not using Spring.
56
+ - **Fail Fast:** Reject invalid data as early as possible in the request lifecycle.
57
+ - **Sanitization:** Strip dangerous characters (e.g., HTML tags if not expected) to prevent XSS.
58
+
59
+ **Tools:** Hibernate Validator, Konform (for Kotlin focus), SonarQube, Manual Security Audit
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: TLS Encryption For All Connections
3
+ impact: CRITICAL
4
+ impactDescription: protects data in transit from interception and tampering
5
+ tags: tls, encryption, https, transport, security, kotlin
6
+ ---
7
+
8
+ ## TLS Encryption For All Connections
9
+
10
+ All network communications, whether between the client and server or between internal services, must be encrypted using TLS. Unencrypted connections (HTTP, raw JDBC) allow attackers to perform Man-in-the-Middle (MitM) attacks to steal sensitive data.
11
+
12
+ **Incorrect (unencrypted connections):**
13
+
14
+ ```kotlin
15
+ // VULNERABLE: Using HTTP instead of HTTPS
16
+ val client = HttpClient(CIO)
17
+ client.get("http://api.production.sun-asterisk.vn/data")
18
+
19
+ // VULNERABLE: Unencrypted database connection
20
+ val url = "jdbc:postgresql://db.sun-asterisk.vn:5432/mydb"
21
+ ```
22
+
23
+ **Correct (TLS everywhere):**
24
+
25
+ ```kotlin
26
+ // 1. HTTPS for all external API calls
27
+ client.get("https://api.production.sun-asterisk.vn/data")
28
+
29
+ // 2. TLS for Database connections
30
+ val url = "jdbc:postgresql://db.sun-asterisk.vn:5432/mydb?ssl=true"
31
+
32
+ // 3. Enabling HSTS to force browsers to use HTTPS
33
+ // In Ktor:
34
+ install(HSTS) {
35
+ maxAgeInSeconds = 31536000 // 1 year
36
+ includeSubDomains = true
37
+ }
38
+
39
+ // 4. Redirecting HTTP to HTTPS
40
+ // In Spring Security:
41
+ // http.requiresChannel().anyRequest().requiresSecure()
42
+ ```
43
+
44
+ **Requirements:**
45
+ - All endpoints must strictly use HTTPS.
46
+ - Plain HTTP requests must be redirected to HTTPS.
47
+ - Use HSTS (`Strict-Transport-Security`) headers to prevent protocol downgrade attacks.
48
+ - Ensure internal service-to-service communication is also encrypted (e.g., using a Service Mesh or internal CAs).
49
+
50
+ **Tools:** OWASP ZAP, SSLyze, Qualys SSL Labs, Manual Review
@@ -0,0 +1,60 @@
1
+ ---
2
+ title: Validate mTLS Certificates Before Auth
3
+ impact: CRITICAL
4
+ impactDescription: ensures mutual authentication between services, preventing unauthorized service impersonation
5
+ tags: mtls, certificates, authentication, service-mesh, security, kotlin
6
+ ---
7
+
8
+ ## Validate mTLS Certificates Before Auth
9
+
10
+ In a microservices architecture, Mutual TLS (mTLS) ensures that both the client and the server verify each other's certificates. This prevents unauthorized services from connecting to internal APIs even if they are within the same network.
11
+
12
+ **Incorrect (not enforcing client certificates):**
13
+
14
+ ```kotlin
15
+ // Server accepts any connection without requiring a valid client certificate
16
+ // or doesn't validate the client's identity.
17
+ val server = Netty.createServer(8443) {
18
+ ssl {
19
+ // Only server-side SSL configured
20
+ keyStore = myKeyStore
21
+ }
22
+ }
23
+ ```
24
+
25
+ **Correct (proper mTLS configuration and validation):**
26
+
27
+ ```kotlin
28
+ // 1. Ktor/Netty configuration for mTLS
29
+ install(HttpsRedirect)
30
+ val server = embeddedServer(Netty, port = 8443) {
31
+ install(Authentication) {
32
+ // Some frameworks support X509 authentication directly
33
+ }
34
+ }
35
+
36
+ // 2. Manual certificate validation in an Interceptor/Filter
37
+ fun validateClientCert(request: HttpServletRequest) {
38
+ val certs = request.getAttribute("javax.servlet.request.X509Certificate") as? Array<X509Certificate>
39
+
40
+ if (certs == null || certs.isEmpty()) {
41
+ throw BadCredentialsException("Client certificate required")
42
+ }
43
+
44
+ val clientCert = certs[0]
45
+ val subjectDN = clientCert.subjectX500Principal.name
46
+
47
+ // Validate the Subject Common Name (CN) against an authorized list
48
+ val authorizedServices = listOf("CN=payment-service", "CN=order-service")
49
+ if (!authorizedServices.any { subjectDN.contains(it) }) {
50
+ throw AccessDeniedException("Service $subjectDN is not authorized")
51
+ }
52
+ }
53
+ ```
54
+
55
+ **Implementation Steps:**
56
+ - **Trust Store:** Configure your server with a trust store containing the CA certificates that are allowed to sign client certificates.
57
+ - **Client Auth Mode:** Set SSL engine to `REQUIRE` client authentication (not just `WANT`).
58
+ - **Authorization:** Certificate validation (the "m" in mTLS) only handles *authentication*. You still need to *authorize* based on the certificate's subject (e.g., matching the CN to a known service name).
59
+
60
+ **Tools:** Istio/Linkerd (Service Mesh), OpenSSL, Spring Security X.509, Cloudflare mTLS
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: Limit Upload File Size And Count
3
+ impact: MEDIUM
4
+ impactDescription: prevents Denial of Service (DoS) attacks via disk or memory exhaustion
5
+ tags: upload, file-size, dos, limits, security, kotlin
6
+ ---
7
+
8
+ ## Limit Upload File Size And Count
9
+
10
+ Allowing unlimited file uploads can quickly lead to server instability or crashes by exhausting disk space, memory, or CPU (during processing). All file upload endpoints must have strict limits on file size, number of files, and file types.
11
+
12
+ **Incorrect (no limits):**
13
+
14
+ ```kotlin
15
+ // Ktor: No multi-part configuration
16
+ @PostMapping("/upload")
17
+ fun upload(@RequestParam("file") file: MultipartFile) {
18
+ // No check on file.size or file.contentType
19
+ save(file)
20
+ }
21
+ ```
22
+
23
+ **Correct (explicit limits):**
24
+
25
+ ```kotlin
26
+ // Ktor Configuration
27
+ install(ContentNegotiation) {
28
+ // Limits can be enforced at the server level
29
+ }
30
+
31
+ // Spring Boot application.properties
32
+ // spring.servlet.multipart.max-file-size=5MB
33
+ // spring.servlet.multipart.max-request-size=10MB
34
+
35
+ // Manual validation in Controller
36
+ @PostMapping("/upload")
37
+ fun handleUpload(@RequestParam("files") files: Array<MultipartFile>): ResponseEntity<Any> {
38
+ // 1. Limit File Count
39
+ if (files.size > 5) {
40
+ return ResponseEntity.badRequest().body("Max 5 files allowed")
41
+ }
42
+
43
+ files.forEach { file ->
44
+ // 2. Limit File Size
45
+ if (file.size > 5 * 1024 * 1024) { // 5MB
46
+ return ResponseEntity.status(413).body("File ${file.originalFilename} is too large")
47
+ }
48
+
49
+ // 3. Limit Content Type
50
+ val allowedTypes = listOf("image/jpeg", "image/png", "application/pdf")
51
+ if (!allowedTypes.contains(file.contentType)) {
52
+ return ResponseEntity.badRequest().body("Unsupported file type: ${file.contentType}")
53
+ }
54
+ }
55
+
56
+ // Process files...
57
+ return ResponseEntity.ok("Success")
58
+ }
59
+ ```
60
+
61
+ **Attack Vectors Prevented:**
62
+ - **Disk Exhaustion:** Filling up server storage with massive files.
63
+ - **Memory Exhaustion:** Trying to buffer large files in RAM.
64
+ - **Zip Bomb:** Uploading small compressed files that expand to petabytes (if unzipping on server).
65
+ - **Remote Code Execution:** Restricted via file-type whitelisting (preventing `.php`, `.jsp`, `.sh` uploads).
66
+
67
+ **Tools:** Spring Multipart Config, Ktor MultiPartData, NGINX `client_max_body_size`, Manual Audit
@@ -0,0 +1,57 @@
1
+ ---
2
+ title: Apply CSRF Protection
3
+ impact: HIGH
4
+ impactDescription: prevents Cross-Site Request Forgery (CSRF) attacks by ensuring requests originate from the intended application
5
+ tags: csrf, tokens, forms, security, kotlin
6
+ ---
7
+
8
+ ## Apply CSRF Protection
9
+
10
+ CSRF attacks force an authenticated user to execute unwanted actions on a web application in which they're currently authenticated (like changing passwords or transferring funds). Modern web frameworks provide built-in protection that must be enabled and properly configured.
11
+
12
+ **Incorrect (no CSRF protection):**
13
+
14
+ ```kotlin
15
+ // Spring Security - disabling CSRF without a valid reason
16
+ override fun configure(http: HttpSecurity) {
17
+ http.csrf().disable() // VULNERABLE if using Cookie-based auth
18
+ }
19
+
20
+ // Raw HTML form without token
21
+ // <form action="/api/transfer" method="POST"> ... </form>
22
+ ```
23
+
24
+ **Correct (CSRF protection enabled):**
25
+
26
+ ```kotlin
27
+ // Spring Security (enabled by default)
28
+ @Configuration
29
+ @EnableWebSecurity
30
+ class SecurityConfig : WebSecurityConfigurerAdapter() {
31
+ override fun configure(http: HttpSecurity) {
32
+ http
33
+ .csrf()
34
+ .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
35
+ }
36
+ }
37
+
38
+ // In Template (Thymeleaf example)
39
+ // <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
40
+
41
+ // Ktor CSRF Protection
42
+ install(Sessions) {
43
+ cookie<UserSession>("user_session")
44
+ }
45
+ install(CSRF) {
46
+ // Validate that a specific header is present
47
+ checkHeader("X-CSRF-TOKEN")
48
+ }
49
+ ```
50
+
51
+ **CSRF Defense Strategies:**
52
+ 1. **Anti-CSRF Tokens:** Include a unique, secret, and unpredictable token in all state-changing requests (POST, PUT, DELETE).
53
+ 2. **SameSite Cookies:** Set `SameSite=Strict` or `Lax` on all session cookies.
54
+ 3. **Custom Request Headers:** For APIs, requiring a custom header (like `X-Requested-With`) can block requests from standard `<form>` submissions.
55
+ 4. **Verification of Origin:** Validate `Origin` and `Referer` headers on the server.
56
+
57
+ **Tools:** Spring Security CSRF, OWASP ZAP, Burp Suite, Browser DevTools
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: Disable Directory Browsing
3
+ impact: MEDIUM
4
+ impactDescription: prevents unauthorized file enumeration and system reconnaissance
5
+ tags: directory, listing, file-exposure, security, kotlin
6
+ ---
7
+
8
+ ## Disable Directory Browsing
9
+
10
+ Directory listing (auto-indexing) allows users to see all files in a directory if an index file is missing. This can expose sensitive configuration files, source code backups, or private user data.
11
+
12
+ **Incorrect (directory listing enabled):**
13
+
14
+ ```kotlin
15
+ // Ktor: Configuring static files without disabling auto-index (if plugin allows it)
16
+
17
+ // NGINX configuration (if serving static files for your app)
18
+ location /static/ {
19
+ autoindex on; // INSECURE: Shows list of files
20
+ }
21
+ ```
22
+
23
+ **Correct (directory listing disabled):**
24
+
25
+ ```kotlin
26
+ // Ktor: Static content doesn't list directories by default
27
+ routing {
28
+ static("/static") {
29
+ resources("static")
30
+ // No auto-indexing here
31
+ }
32
+ }
33
+
34
+ // Spring Boot (Disabled by default in embedded Tomcat)
35
+ // Ensure no custom configuration enables directory listing.
36
+
37
+ // NGINX (Secure configuration)
38
+ location /static/ {
39
+ autoindex off;
40
+ try_files $uri $uri/ =404;
41
+ }
42
+
43
+ // Use an index file to prevent listing
44
+ // Create an empty index.html in every static directory.
45
+ ```
46
+
47
+ **Why it matters:**
48
+ Exposing a directory structure tells an attacker which files exist, which libraries you use (if `node_modules` or `jar` files are visible), and might reveal "hidden" files like `.env.bak` or `.git/`.
49
+
50
+ **Tools:** Web server configuration (NGINX/Apache), OWASP ZAP, Nikto, Manual Review
@@ -0,0 +1,51 @@
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, kotlin
6
+ ---
7
+
8
+ ## Set Secure Flag On Session Cookies
9
+
10
+ Without the `Secure` flag, browser cookies can be transmitted over unencrypted HTTP connections, where they can be easily intercepted by attackers (Man-in-the-Middle).
11
+
12
+ **Incorrect (no Secure flag):**
13
+
14
+ ```kotlin
15
+ // Raw Ktor response
16
+ call.response.cookies.append("session", token) // No flags set!
17
+
18
+ // Spring Boot / Servlet
19
+ val cookie = Cookie("session", token)
20
+ response.addCookie(cookie) // Secure flag defaults to false
21
+ ```
22
+
23
+ **Correct (Secure flag set):**
24
+
25
+ ```kotlin
26
+ // Ktor
27
+ call.response.cookies.append(
28
+ name = "session",
29
+ value = token,
30
+ secure = true, // HTTPS only
31
+ httpOnly = true,
32
+ extensions = mapOf("SameSite" to "Strict")
33
+ )
34
+
35
+ // Spring Boot / Servlet
36
+ val cookie = Cookie("session", token).apply {
37
+ isSecure = true // HTTPS only
38
+ isHttpOnly = true
39
+ path = "/"
40
+ }
41
+ response.addCookie(cookie)
42
+
43
+ // Spring Boot Application Configuration (application.properties)
44
+ // server.servlet.session.cookie.secure=true
45
+ ```
46
+
47
+ **Validation:**
48
+ - In production, always ensure `secure = true`.
49
+ - For local development without HTTPS, this may need to be configurable but must be enabled by default for all deployed environments.
50
+
51
+ **Tools:** OWASP ZAP, SonarQube, Manual Security Audit, Browser DevTools
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Set HttpOnly On Session Cookies
3
+ impact: HIGH
4
+ impactDescription: prevents session cookie theft via Cross-Site Scripting (XSS)
5
+ tags: cookies, httponly, xss, session, security, kotlin
6
+ ---
7
+
8
+ ## Set HttpOnly On Session Cookies
9
+
10
+ Without the `HttpOnly` flag, the `document.cookie` API can be used to access sensitive session cookies from JavaScript. This allows an attacker to steal active sessions using a Cross-Site Scripting (XSS) vulnerability.
11
+
12
+ **Incorrect (no HttpOnly flag):**
13
+
14
+ ```kotlin
15
+ // Ktor
16
+ call.response.cookies.append("session", token) // No HttpOnly!
17
+
18
+ // Spring Boot / Servlet
19
+ val cookie = Cookie("session", token)
20
+ response.addCookie(cookie) // HttpOnly defaults to false
21
+ ```
22
+
23
+ **Correct (HttpOnly set):**
24
+
25
+ ```kotlin
26
+ // Ktor
27
+ call.response.cookies.append(
28
+ name = "session",
29
+ value = token,
30
+ httpOnly = true, // Prevents JS access
31
+ secure = true,
32
+ extensions = mapOf("SameSite" to "Strict")
33
+ )
34
+
35
+ // Spring Boot / Servlet
36
+ val cookie = Cookie("session", token).apply {
37
+ isHttpOnly = true // Prevents JS access
38
+ isSecure = true
39
+ }
40
+ response.addCookie(cookie)
41
+
42
+ // Spring Boot Application Configuration (application.properties)
43
+ // server.servlet.session.cookie.http-only=true
44
+ ```
45
+
46
+ **Security Impact:**
47
+ Even if your application has an XSS vulnerability, the `HttpOnly` flag prevents the attacker from immediately stealing the session identifier, buying time for detection and defense.
48
+
49
+ **Tools:** OWASP ZAP, Burp Suite, Browser DevTools (Verify "HttpOnly" column checked)
@@ -0,0 +1,54 @@
1
+ ---
2
+ title: Set SameSite On Session Cookies
3
+ impact: MEDIUM
4
+ impactDescription: provides fundamental Cross-Site Request Forgery (CSRF) protection
5
+ tags: cookies, samesite, csrf, session, security, kotlin
6
+ ---
7
+
8
+ ## Set SameSite On Session Cookies
9
+
10
+ The `SameSite` attribute tells the browser whether to send cookies in cross-site requests. Setting this to `Strict` or `Lax` provides a strong baseline defense against CSRF attacks.
11
+
12
+ **Incorrect (no SameSite attribute):**
13
+
14
+ ```kotlin
15
+ // Ktor
16
+ call.response.cookies.append("session", token) // SameSite not specified
17
+
18
+ // Servlet / Spring Boot (Old versions or manual Cookie setting)
19
+ val cookie = Cookie("session", token)
20
+ response.addCookie(cookie) // No native SameSite setter in standard Servlet API < 6.0
21
+ ```
22
+
23
+ **Correct (SameSite set):**
24
+
25
+ ```kotlin
26
+ // Ktor
27
+ import io.ktor.http.*
28
+ call.response.cookies.append(
29
+ name = "session",
30
+ value = token,
31
+ httpOnly = true,
32
+ secure = true,
33
+ extensions = mapOf("SameSite" to "Strict") // or "Lax"
34
+ )
35
+
36
+ // Spring Boot / Spring Security (Recommended approach)
37
+ // Configure in application.properties/yml
38
+ // server.servlet.session.cookie.same-site=strict
39
+
40
+ // Manual Header (if using raw Response and older Servlet API)
41
+ response.setHeader("Set-Cookie", "session=$token; Path=/; HttpOnly; Secure; SameSite=Strict")
42
+ ```
43
+
44
+ **SameSite Options:**
45
+
46
+ | Value | Behavior |
47
+ |-------|----------|
48
+ | `Strict` | Cookie is only sent if the request originates from the same site. Most secure. |
49
+ | `Lax` | Sent on same-site requests and top-level GET navigations (clicking links). |
50
+ | `None` | Always sent. Requires the `Secure` flag to be set. Use with caution. |
51
+
52
+ **Recommended:** Use `Strict` for all authentication and session handling cookies. Use `Lax` for user-experience-related cookies where cross-site links might need to maintain state.
53
+
54
+ **Tools:** Browser DevTools (Application tab -> Cookies), OWASP ZAP, Manual review