eslint-plugin-secure-coding 2.3.2 → 2.3.3

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 (361) hide show
  1. package/README.md +1 -0
  2. package/package.json +3 -10
  3. package/src/index.ts +605 -0
  4. package/src/rules/__tests__/integration-demo.test.ts +290 -0
  5. package/src/rules/__tests__/integration-llm.test.ts +89 -0
  6. package/src/rules/database-injection/database-injection.test.ts +456 -0
  7. package/src/rules/database-injection/index.ts +488 -0
  8. package/src/rules/detect-child-process/detect-child-process.test.ts +207 -0
  9. package/src/rules/detect-child-process/index.ts +634 -0
  10. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +416 -0
  11. package/src/rules/detect-eval-with-expression/index.ts +463 -0
  12. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +28 -0
  13. package/src/rules/detect-mixed-content/index.ts +52 -0
  14. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +269 -0
  15. package/src/rules/detect-non-literal-fs-filename/index.ts +551 -0
  16. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +189 -0
  17. package/src/rules/detect-non-literal-regexp/index.ts +490 -0
  18. package/src/rules/detect-object-injection/detect-object-injection.test.ts +440 -0
  19. package/src/rules/detect-object-injection/index.ts +674 -0
  20. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +32 -0
  21. package/src/rules/detect-suspicious-dependencies/index.ts +84 -0
  22. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +31 -0
  23. package/src/rules/detect-weak-password-validation/index.ts +68 -0
  24. package/src/rules/no-allow-arbitrary-loads/index.ts +54 -0
  25. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +28 -0
  26. package/src/rules/no-arbitrary-file-access/index.ts +238 -0
  27. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +119 -0
  28. package/src/rules/no-buffer-overread/index.ts +724 -0
  29. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +313 -0
  30. package/src/rules/no-clickjacking/index.ts +481 -0
  31. package/src/rules/no-clickjacking/no-clickjacking.test.ts +253 -0
  32. package/src/rules/no-client-side-auth-logic/index.ts +81 -0
  33. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +33 -0
  34. package/src/rules/no-credentials-in-query-params/index.ts +69 -0
  35. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +33 -0
  36. package/src/rules/no-credentials-in-storage-api/index.ts +64 -0
  37. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +31 -0
  38. package/src/rules/no-data-in-temp-storage/index.ts +75 -0
  39. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +33 -0
  40. package/src/rules/no-debug-code-in-production/index.ts +59 -0
  41. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +26 -0
  42. package/src/rules/no-directive-injection/index.ts +551 -0
  43. package/src/rules/no-directive-injection/no-directive-injection.test.ts +305 -0
  44. package/src/rules/no-disabled-certificate-validation/index.ts +72 -0
  45. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +33 -0
  46. package/src/rules/no-document-cookie/index.ts +113 -0
  47. package/src/rules/no-document-cookie/no-document-cookie.test.ts +382 -0
  48. package/src/rules/no-dynamic-dependency-loading/index.ts +60 -0
  49. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +27 -0
  50. package/src/rules/no-electron-security-issues/index.ts +504 -0
  51. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +324 -0
  52. package/src/rules/no-exposed-debug-endpoints/index.ts +73 -0
  53. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +40 -0
  54. package/src/rules/no-exposed-sensitive-data/index.ts +428 -0
  55. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +75 -0
  56. package/src/rules/no-format-string-injection/index.ts +801 -0
  57. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +437 -0
  58. package/src/rules/no-graphql-injection/index.ts +508 -0
  59. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +371 -0
  60. package/src/rules/no-hardcoded-credentials/index.ts +478 -0
  61. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +639 -0
  62. package/src/rules/no-hardcoded-session-tokens/index.ts +69 -0
  63. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +42 -0
  64. package/src/rules/no-http-urls/index.ts +131 -0
  65. package/src/rules/no-http-urls/no-http-urls.test.ts +60 -0
  66. package/src/rules/no-improper-sanitization/index.ts +502 -0
  67. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +156 -0
  68. package/src/rules/no-improper-type-validation/index.ts +572 -0
  69. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +372 -0
  70. package/src/rules/no-insecure-comparison/index.ts +232 -0
  71. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +218 -0
  72. package/src/rules/no-insecure-cookie-settings/index.ts +391 -0
  73. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +409 -0
  74. package/src/rules/no-insecure-jwt/index.ts +467 -0
  75. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +259 -0
  76. package/src/rules/no-insecure-redirects/index.ts +267 -0
  77. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +108 -0
  78. package/src/rules/no-insecure-websocket/index.ts +72 -0
  79. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +42 -0
  80. package/src/rules/no-insufficient-postmessage-validation/index.ts +497 -0
  81. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +360 -0
  82. package/src/rules/no-insufficient-random/index.ts +288 -0
  83. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +246 -0
  84. package/src/rules/no-ldap-injection/index.ts +547 -0
  85. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +317 -0
  86. package/src/rules/no-missing-authentication/index.ts +408 -0
  87. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +350 -0
  88. package/src/rules/no-missing-cors-check/index.ts +453 -0
  89. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +392 -0
  90. package/src/rules/no-missing-csrf-protection/index.ts +229 -0
  91. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +222 -0
  92. package/src/rules/no-missing-security-headers/index.ts +266 -0
  93. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +98 -0
  94. package/src/rules/no-password-in-url/index.ts +64 -0
  95. package/src/rules/no-password-in-url/no-password-in-url.test.ts +27 -0
  96. package/src/rules/no-permissive-cors/index.ts +78 -0
  97. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +28 -0
  98. package/src/rules/no-pii-in-logs/index.ts +83 -0
  99. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +26 -0
  100. package/src/rules/no-postmessage-origin-wildcard/index.ts +67 -0
  101. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +27 -0
  102. package/src/rules/no-privilege-escalation/index.ts +403 -0
  103. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +306 -0
  104. package/src/rules/no-redos-vulnerable-regex/index.ts +379 -0
  105. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +83 -0
  106. package/src/rules/no-sensitive-data-exposure/index.ts +294 -0
  107. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +262 -0
  108. package/src/rules/no-sensitive-data-in-analytics/index.ts +73 -0
  109. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +42 -0
  110. package/src/rules/no-sensitive-data-in-cache/index.ts +59 -0
  111. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +32 -0
  112. package/src/rules/no-sql-injection/index.ts +424 -0
  113. package/src/rules/no-sql-injection/no-sql-injection.test.ts +303 -0
  114. package/src/rules/no-timing-attack/index.ts +552 -0
  115. package/src/rules/no-timing-attack/no-timing-attack.test.ts +348 -0
  116. package/src/rules/no-toctou-vulnerability/index.ts +250 -0
  117. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +60 -0
  118. package/src/rules/no-tracking-without-consent/index.ts +78 -0
  119. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +34 -0
  120. package/src/rules/no-unchecked-loop-condition/index.ts +781 -0
  121. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +459 -0
  122. package/src/rules/no-unencrypted-local-storage/index.ts +73 -0
  123. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +41 -0
  124. package/src/rules/no-unencrypted-transmission/index.ts +296 -0
  125. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +287 -0
  126. package/src/rules/no-unescaped-url-parameter/index.ts +424 -0
  127. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +263 -0
  128. package/src/rules/no-unlimited-resource-allocation/index.ts +767 -0
  129. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +544 -0
  130. package/src/rules/no-unsafe-deserialization/index.ts +593 -0
  131. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +310 -0
  132. package/src/rules/no-unsafe-dynamic-require/index.ts +125 -0
  133. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +151 -0
  134. package/src/rules/no-unsafe-regex-construction/index.ts +370 -0
  135. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +181 -0
  136. package/src/rules/no-unsanitized-html/index.ts +400 -0
  137. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +488 -0
  138. package/src/rules/no-unvalidated-deeplinks/index.ts +73 -0
  139. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +29 -0
  140. package/src/rules/no-unvalidated-user-input/index.ts +498 -0
  141. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +463 -0
  142. package/src/rules/no-verbose-error-messages/index.ts +83 -0
  143. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +34 -0
  144. package/src/rules/no-weak-crypto/index.ts +447 -0
  145. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +297 -0
  146. package/src/rules/no-weak-password-recovery/index.ts +509 -0
  147. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +184 -0
  148. package/src/rules/no-xpath-injection/index.ts +596 -0
  149. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +405 -0
  150. package/src/rules/no-xxe-injection/index.ts +342 -0
  151. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +122 -0
  152. package/src/rules/no-zip-slip/index.ts +526 -0
  153. package/src/rules/no-zip-slip/no-zip-slip.test.ts +305 -0
  154. package/src/rules/require-backend-authorization/index.ts +71 -0
  155. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +31 -0
  156. package/src/rules/require-code-minification/index.ts +54 -0
  157. package/src/rules/require-code-minification/require-code-minification.test.ts +30 -0
  158. package/src/rules/require-csp-headers/index.ts +74 -0
  159. package/src/rules/require-csp-headers/require-csp-headers.test.ts +34 -0
  160. package/src/rules/require-data-minimization/index.ts +65 -0
  161. package/src/rules/require-data-minimization/require-data-minimization.test.ts +31 -0
  162. package/src/rules/require-dependency-integrity/index.ts +78 -0
  163. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +44 -0
  164. package/src/rules/require-https-only/index.ts +75 -0
  165. package/src/rules/require-https-only/require-https-only.test.ts +26 -0
  166. package/src/rules/require-mime-type-validation/index.ts +77 -0
  167. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +32 -0
  168. package/src/rules/require-network-timeout/index.ts +58 -0
  169. package/src/rules/require-network-timeout/require-network-timeout.test.ts +26 -0
  170. package/src/rules/require-package-lock/index.ts +75 -0
  171. package/src/rules/require-package-lock/require-package-lock.test.ts +27 -0
  172. package/src/rules/require-secure-credential-storage/index.ts +60 -0
  173. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +26 -0
  174. package/src/rules/require-secure-defaults/index.ts +54 -0
  175. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +26 -0
  176. package/src/rules/require-secure-deletion/index.ts +52 -0
  177. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +29 -0
  178. package/src/rules/require-storage-encryption/index.ts +60 -0
  179. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +26 -0
  180. package/src/rules/require-url-validation/index.ts +85 -0
  181. package/src/rules/require-url-validation/require-url-validation.test.ts +32 -0
  182. package/src/types/{index.d.ts → index.ts} +157 -53
  183. package/src/index.d.ts +0 -32
  184. package/src/index.js +0 -465
  185. package/src/rules/database-injection/index.d.ts +0 -13
  186. package/src/rules/database-injection/index.js +0 -406
  187. package/src/rules/detect-child-process/index.d.ts +0 -11
  188. package/src/rules/detect-child-process/index.js +0 -529
  189. package/src/rules/detect-eval-with-expression/index.d.ts +0 -9
  190. package/src/rules/detect-eval-with-expression/index.js +0 -392
  191. package/src/rules/detect-mixed-content/index.d.ts +0 -8
  192. package/src/rules/detect-mixed-content/index.js +0 -44
  193. package/src/rules/detect-non-literal-fs-filename/index.d.ts +0 -7
  194. package/src/rules/detect-non-literal-fs-filename/index.js +0 -454
  195. package/src/rules/detect-non-literal-regexp/index.d.ts +0 -9
  196. package/src/rules/detect-non-literal-regexp/index.js +0 -403
  197. package/src/rules/detect-object-injection/index.d.ts +0 -11
  198. package/src/rules/detect-object-injection/index.js +0 -560
  199. package/src/rules/detect-suspicious-dependencies/index.d.ts +0 -8
  200. package/src/rules/detect-suspicious-dependencies/index.js +0 -71
  201. package/src/rules/detect-weak-password-validation/index.d.ts +0 -6
  202. package/src/rules/detect-weak-password-validation/index.js +0 -58
  203. package/src/rules/no-allow-arbitrary-loads/index.d.ts +0 -8
  204. package/src/rules/no-allow-arbitrary-loads/index.js +0 -47
  205. package/src/rules/no-arbitrary-file-access/index.d.ts +0 -13
  206. package/src/rules/no-arbitrary-file-access/index.js +0 -195
  207. package/src/rules/no-buffer-overread/index.d.ts +0 -29
  208. package/src/rules/no-buffer-overread/index.js +0 -606
  209. package/src/rules/no-clickjacking/index.d.ts +0 -10
  210. package/src/rules/no-clickjacking/index.js +0 -396
  211. package/src/rules/no-client-side-auth-logic/index.d.ts +0 -6
  212. package/src/rules/no-client-side-auth-logic/index.js +0 -69
  213. package/src/rules/no-credentials-in-query-params/index.d.ts +0 -8
  214. package/src/rules/no-credentials-in-query-params/index.js +0 -57
  215. package/src/rules/no-credentials-in-storage-api/index.d.ts +0 -6
  216. package/src/rules/no-credentials-in-storage-api/index.js +0 -54
  217. package/src/rules/no-data-in-temp-storage/index.d.ts +0 -6
  218. package/src/rules/no-data-in-temp-storage/index.js +0 -64
  219. package/src/rules/no-debug-code-in-production/index.d.ts +0 -8
  220. package/src/rules/no-debug-code-in-production/index.js +0 -51
  221. package/src/rules/no-directive-injection/index.d.ts +0 -12
  222. package/src/rules/no-directive-injection/index.js +0 -457
  223. package/src/rules/no-disabled-certificate-validation/index.d.ts +0 -6
  224. package/src/rules/no-disabled-certificate-validation/index.js +0 -61
  225. package/src/rules/no-document-cookie/index.d.ts +0 -5
  226. package/src/rules/no-document-cookie/index.js +0 -89
  227. package/src/rules/no-dynamic-dependency-loading/index.d.ts +0 -8
  228. package/src/rules/no-dynamic-dependency-loading/index.js +0 -51
  229. package/src/rules/no-electron-security-issues/index.d.ts +0 -10
  230. package/src/rules/no-electron-security-issues/index.js +0 -423
  231. package/src/rules/no-exposed-debug-endpoints/index.d.ts +0 -6
  232. package/src/rules/no-exposed-debug-endpoints/index.js +0 -62
  233. package/src/rules/no-exposed-sensitive-data/index.d.ts +0 -11
  234. package/src/rules/no-exposed-sensitive-data/index.js +0 -340
  235. package/src/rules/no-format-string-injection/index.d.ts +0 -17
  236. package/src/rules/no-format-string-injection/index.js +0 -660
  237. package/src/rules/no-graphql-injection/index.d.ts +0 -12
  238. package/src/rules/no-graphql-injection/index.js +0 -411
  239. package/src/rules/no-hardcoded-credentials/index.d.ts +0 -26
  240. package/src/rules/no-hardcoded-credentials/index.js +0 -376
  241. package/src/rules/no-hardcoded-session-tokens/index.d.ts +0 -6
  242. package/src/rules/no-hardcoded-session-tokens/index.js +0 -59
  243. package/src/rules/no-http-urls/index.d.ts +0 -12
  244. package/src/rules/no-http-urls/index.js +0 -114
  245. package/src/rules/no-improper-sanitization/index.d.ts +0 -12
  246. package/src/rules/no-improper-sanitization/index.js +0 -411
  247. package/src/rules/no-improper-type-validation/index.d.ts +0 -10
  248. package/src/rules/no-improper-type-validation/index.js +0 -475
  249. package/src/rules/no-insecure-comparison/index.d.ts +0 -7
  250. package/src/rules/no-insecure-comparison/index.js +0 -193
  251. package/src/rules/no-insecure-cookie-settings/index.d.ts +0 -9
  252. package/src/rules/no-insecure-cookie-settings/index.js +0 -306
  253. package/src/rules/no-insecure-jwt/index.d.ts +0 -10
  254. package/src/rules/no-insecure-jwt/index.js +0 -380
  255. package/src/rules/no-insecure-redirects/index.d.ts +0 -7
  256. package/src/rules/no-insecure-redirects/index.js +0 -216
  257. package/src/rules/no-insecure-websocket/index.d.ts +0 -6
  258. package/src/rules/no-insecure-websocket/index.js +0 -61
  259. package/src/rules/no-insufficient-postmessage-validation/index.d.ts +0 -14
  260. package/src/rules/no-insufficient-postmessage-validation/index.js +0 -392
  261. package/src/rules/no-insufficient-random/index.d.ts +0 -9
  262. package/src/rules/no-insufficient-random/index.js +0 -208
  263. package/src/rules/no-ldap-injection/index.d.ts +0 -10
  264. package/src/rules/no-ldap-injection/index.js +0 -455
  265. package/src/rules/no-missing-authentication/index.d.ts +0 -13
  266. package/src/rules/no-missing-authentication/index.js +0 -333
  267. package/src/rules/no-missing-cors-check/index.d.ts +0 -9
  268. package/src/rules/no-missing-cors-check/index.js +0 -399
  269. package/src/rules/no-missing-csrf-protection/index.d.ts +0 -11
  270. package/src/rules/no-missing-csrf-protection/index.js +0 -180
  271. package/src/rules/no-missing-security-headers/index.d.ts +0 -7
  272. package/src/rules/no-missing-security-headers/index.js +0 -218
  273. package/src/rules/no-password-in-url/index.d.ts +0 -8
  274. package/src/rules/no-password-in-url/index.js +0 -54
  275. package/src/rules/no-permissive-cors/index.d.ts +0 -8
  276. package/src/rules/no-permissive-cors/index.js +0 -65
  277. package/src/rules/no-pii-in-logs/index.d.ts +0 -8
  278. package/src/rules/no-pii-in-logs/index.js +0 -70
  279. package/src/rules/no-postmessage-origin-wildcard/index.d.ts +0 -8
  280. package/src/rules/no-postmessage-origin-wildcard/index.js +0 -56
  281. package/src/rules/no-privilege-escalation/index.d.ts +0 -13
  282. package/src/rules/no-privilege-escalation/index.js +0 -321
  283. package/src/rules/no-redos-vulnerable-regex/index.d.ts +0 -7
  284. package/src/rules/no-redos-vulnerable-regex/index.js +0 -306
  285. package/src/rules/no-sensitive-data-exposure/index.d.ts +0 -11
  286. package/src/rules/no-sensitive-data-exposure/index.js +0 -250
  287. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +0 -8
  288. package/src/rules/no-sensitive-data-in-analytics/index.js +0 -62
  289. package/src/rules/no-sensitive-data-in-cache/index.d.ts +0 -8
  290. package/src/rules/no-sensitive-data-in-cache/index.js +0 -52
  291. package/src/rules/no-sql-injection/index.d.ts +0 -10
  292. package/src/rules/no-sql-injection/index.js +0 -335
  293. package/src/rules/no-timing-attack/index.d.ts +0 -10
  294. package/src/rules/no-timing-attack/index.js +0 -447
  295. package/src/rules/no-toctou-vulnerability/index.d.ts +0 -7
  296. package/src/rules/no-toctou-vulnerability/index.js +0 -208
  297. package/src/rules/no-tracking-without-consent/index.d.ts +0 -6
  298. package/src/rules/no-tracking-without-consent/index.js +0 -67
  299. package/src/rules/no-unchecked-loop-condition/index.d.ts +0 -12
  300. package/src/rules/no-unchecked-loop-condition/index.js +0 -646
  301. package/src/rules/no-unencrypted-local-storage/index.d.ts +0 -8
  302. package/src/rules/no-unencrypted-local-storage/index.js +0 -61
  303. package/src/rules/no-unencrypted-transmission/index.d.ts +0 -11
  304. package/src/rules/no-unencrypted-transmission/index.js +0 -236
  305. package/src/rules/no-unescaped-url-parameter/index.d.ts +0 -9
  306. package/src/rules/no-unescaped-url-parameter/index.js +0 -355
  307. package/src/rules/no-unlimited-resource-allocation/index.d.ts +0 -12
  308. package/src/rules/no-unlimited-resource-allocation/index.js +0 -643
  309. package/src/rules/no-unsafe-deserialization/index.d.ts +0 -10
  310. package/src/rules/no-unsafe-deserialization/index.js +0 -491
  311. package/src/rules/no-unsafe-dynamic-require/index.d.ts +0 -5
  312. package/src/rules/no-unsafe-dynamic-require/index.js +0 -106
  313. package/src/rules/no-unsafe-regex-construction/index.d.ts +0 -9
  314. package/src/rules/no-unsafe-regex-construction/index.js +0 -291
  315. package/src/rules/no-unsanitized-html/index.d.ts +0 -9
  316. package/src/rules/no-unsanitized-html/index.js +0 -335
  317. package/src/rules/no-unvalidated-deeplinks/index.d.ts +0 -6
  318. package/src/rules/no-unvalidated-deeplinks/index.js +0 -62
  319. package/src/rules/no-unvalidated-user-input/index.d.ts +0 -9
  320. package/src/rules/no-unvalidated-user-input/index.js +0 -420
  321. package/src/rules/no-verbose-error-messages/index.d.ts +0 -8
  322. package/src/rules/no-verbose-error-messages/index.js +0 -68
  323. package/src/rules/no-weak-crypto/index.d.ts +0 -11
  324. package/src/rules/no-weak-crypto/index.js +0 -351
  325. package/src/rules/no-weak-password-recovery/index.d.ts +0 -12
  326. package/src/rules/no-weak-password-recovery/index.js +0 -424
  327. package/src/rules/no-xpath-injection/index.d.ts +0 -10
  328. package/src/rules/no-xpath-injection/index.js +0 -487
  329. package/src/rules/no-xxe-injection/index.d.ts +0 -7
  330. package/src/rules/no-xxe-injection/index.js +0 -266
  331. package/src/rules/no-zip-slip/index.d.ts +0 -9
  332. package/src/rules/no-zip-slip/index.js +0 -445
  333. package/src/rules/require-backend-authorization/index.d.ts +0 -6
  334. package/src/rules/require-backend-authorization/index.js +0 -60
  335. package/src/rules/require-code-minification/index.d.ts +0 -8
  336. package/src/rules/require-code-minification/index.js +0 -47
  337. package/src/rules/require-csp-headers/index.d.ts +0 -6
  338. package/src/rules/require-csp-headers/index.js +0 -64
  339. package/src/rules/require-data-minimization/index.d.ts +0 -8
  340. package/src/rules/require-data-minimization/index.js +0 -53
  341. package/src/rules/require-dependency-integrity/index.d.ts +0 -6
  342. package/src/rules/require-dependency-integrity/index.js +0 -64
  343. package/src/rules/require-https-only/index.d.ts +0 -8
  344. package/src/rules/require-https-only/index.js +0 -62
  345. package/src/rules/require-mime-type-validation/index.d.ts +0 -6
  346. package/src/rules/require-mime-type-validation/index.js +0 -66
  347. package/src/rules/require-network-timeout/index.d.ts +0 -8
  348. package/src/rules/require-network-timeout/index.js +0 -50
  349. package/src/rules/require-package-lock/index.d.ts +0 -8
  350. package/src/rules/require-package-lock/index.js +0 -63
  351. package/src/rules/require-secure-credential-storage/index.d.ts +0 -8
  352. package/src/rules/require-secure-credential-storage/index.js +0 -50
  353. package/src/rules/require-secure-defaults/index.d.ts +0 -8
  354. package/src/rules/require-secure-defaults/index.js +0 -47
  355. package/src/rules/require-secure-deletion/index.d.ts +0 -8
  356. package/src/rules/require-secure-deletion/index.js +0 -44
  357. package/src/rules/require-storage-encryption/index.d.ts +0 -8
  358. package/src/rules/require-storage-encryption/index.js +0 -50
  359. package/src/rules/require-url-validation/index.d.ts +0 -6
  360. package/src/rules/require-url-validation/index.js +0 -72
  361. package/src/types/index.js +0 -17
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Comprehensive tests for database-injection rule
3
+ * Security: CWE-89 (SQL Injection), CWE-943 (NoSQL Injection)
4
+ */
5
+ import { RuleTester } from '@typescript-eslint/rule-tester';
6
+ import { describe, it, afterAll } from 'vitest';
7
+ import parser from '@typescript-eslint/parser';
8
+ import { databaseInjection } from './index';
9
+
10
+ // Configure RuleTester for Vitest
11
+ RuleTester.afterAll = afterAll;
12
+ RuleTester.it = it;
13
+ RuleTester.itOnly = it.only;
14
+ RuleTester.describe = describe;
15
+
16
+ // Use Flat Config format (ESLint 9+)
17
+ const ruleTester = new RuleTester({
18
+ languageOptions: {
19
+ parser,
20
+ ecmaVersion: 2022,
21
+ sourceType: 'module',
22
+ },
23
+ });
24
+
25
+ describe('database-injection', () => {
26
+ describe('Valid Code', () => {
27
+ ruleTester.run('valid - safe database queries', databaseInjection, {
28
+ valid: [
29
+ // Use case: Safe SQL query using parameterized placeholders (?) instead of string interpolation
30
+ // This prevents SQL injection by separating query structure from user data
31
+ {
32
+ code: 'db.query("SELECT * FROM users WHERE id = ?", [userId]);',
33
+ },
34
+ // Use case: Safe parameterized INSERT query with multiple placeholders
35
+ // User input is passed as an array, ensuring proper escaping and validation
36
+ {
37
+ code: 'db.query("INSERT INTO users (name, email) VALUES (?, ?)", [name, email]);',
38
+ },
39
+ // Use case: Safe ORM query using Prisma's query builder
40
+ // ORMs handle parameterization internally, preventing injection attacks
41
+ {
42
+ code: 'prisma.user.findUnique({ where: { id: userId } });',
43
+ },
44
+ // Use case: Safe ORM query using Sequelize or similar ORM
45
+ // Object-based query API prevents SQL injection through proper escaping
46
+ {
47
+ code: 'User.findOne({ where: { id: userId } });',
48
+ },
49
+ // Use case: Safe NoSQL query using MongoDB's object-based query syntax
50
+ // MongoDB driver handles input sanitization when using object notation
51
+ {
52
+ code: 'db.collection("users").find({ id: userId });',
53
+ },
54
+ // Use case: Safe MongoDB query with ObjectId conversion
55
+ // Using proper MongoDB methods prevents NoSQL injection
56
+ {
57
+ code: 'MongoClient.db.collection("users").findOne({ _id: ObjectId(userId) });',
58
+ },
59
+ // Use case: Harmless string literal without SQL keywords
60
+ // Not a database query, so no injection risk
61
+ {
62
+ code: 'const text = "This is not a query";',
63
+ },
64
+ ],
65
+ invalid: [],
66
+ });
67
+ });
68
+
69
+ describe('Invalid Code - SQL Injection', () => {
70
+ ruleTester.run('invalid - SQL injection patterns', databaseInjection, {
71
+ valid: [],
72
+ invalid: [
73
+ // Use case: SQL injection via template literal with unsanitized request.body data
74
+ // Attacker can manipulate req.body.id to inject malicious SQL (e.g., "1 OR 1=1")
75
+ {
76
+ code: 'db.query(`SELECT * FROM users WHERE id = ${req.body.id}`);',
77
+ errors: [{ messageId: 'databaseInjection' }],
78
+ },
79
+ // Use case: SQL injection via template literal with untrusted variable
80
+ // Variable userId could contain malicious SQL if not properly validated
81
+ {
82
+ code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
83
+ errors: [{ messageId: 'databaseInjection' }],
84
+ },
85
+ // Use case: SQL injection in INSERT statement via template literal
86
+ // Attacker can inject SQL through the name variable to manipulate the INSERT query
87
+ {
88
+ code: 'db.query(`INSERT INTO users (name) VALUES (${name})`);',
89
+ errors: [{ messageId: 'databaseInjection' }],
90
+ },
91
+ // Use case: SQL injection in UPDATE statement with multiple interpolated variables
92
+ // Both name and id variables can be exploited to modify the query logic
93
+ {
94
+ code: 'db.query(`UPDATE users SET name = ${name} WHERE id = ${id}`);',
95
+ errors: [{ messageId: 'databaseInjection' }],
96
+ },
97
+ // Use case: SQL injection via string concatenation with request.body data
98
+ // Attacker can break out of the quoted string in req.body.name (e.g., "' OR '1'='1")
99
+ // Note: Multiple concatenations may report multiple errors
100
+ {
101
+ code: 'const query = "SELECT * FROM users WHERE name = \'" + req.body.name + "\'";',
102
+ errors: [
103
+ { messageId: 'databaseInjection' },
104
+ { messageId: 'databaseInjection' }
105
+ ],
106
+ },
107
+ // Use case: SQL injection via string concatenation with untrusted variable
108
+ // userName variable could contain SQL escape sequences to break query logic
109
+ {
110
+ code: 'const query = "SELECT * FROM users WHERE name = \'" + userName + "\'";',
111
+ errors: [{ messageId: 'databaseInjection' }],
112
+ },
113
+ // Use case: SQL injection via string concatenation in direct query execution
114
+ // req.params.id is concatenated directly, allowing SQL injection attacks
115
+ {
116
+ code: 'db.query("SELECT * FROM users WHERE id = " + req.params.id);',
117
+ errors: [{ messageId: 'databaseInjection' }],
118
+ },
119
+ ],
120
+ });
121
+ });
122
+
123
+ describe('Invalid Code - NoSQL Injection', () => {
124
+ ruleTester.run('invalid - NoSQL injection patterns', databaseInjection, {
125
+ valid: [],
126
+ invalid: [
127
+ // Use case: NoSQL injection via MongoDB $where operator with request.body data
128
+ // Attacker can inject JavaScript code through req.body.name to execute arbitrary queries
129
+ // Example: req.body.name = '"; return true; //'
130
+ {
131
+ code: 'const query = `this.name === "${req.body.name}"`;',
132
+ errors: [{ messageId: 'databaseInjection' }],
133
+ },
134
+ // Use case: NoSQL injection via MongoDB JavaScript query with untrusted variable
135
+ // userName could contain malicious JavaScript to break query logic
136
+ {
137
+ code: 'const query = `this.name === "${userName}"`;',
138
+ errors: [{ messageId: 'databaseInjection' }],
139
+ },
140
+ // Use case: NoSQL injection using inequality operator with request.query data
141
+ // Attacker can inject JavaScript through req.query.email to bypass authentication
142
+ {
143
+ code: 'const query = `this.email != "${req.query.email}"`;',
144
+ errors: [{ messageId: 'databaseInjection' }],
145
+ },
146
+ // Use case: NoSQL injection via MongoDB $where operator with URL parameters
147
+ // The $where operator allows arbitrary JavaScript execution, making it highly dangerous
148
+ {
149
+ code: 'const query = `$where === "${req.params.filter}"`;',
150
+ errors: [{ messageId: 'databaseInjection' }],
151
+ },
152
+ ],
153
+ });
154
+ });
155
+
156
+ describe('Suggestions', () => {
157
+ ruleTester.run('suggestions for fixes', databaseInjection, {
158
+ valid: [],
159
+ invalid: [
160
+ // Use case: Verify that the rule provides helpful suggestions for fixing SQL injection
161
+ // This tests the suggestion mechanism, which should recommend parameterized queries or ORMs
162
+ {
163
+ code: 'const query = `SELECT * FROM users WHERE id = ${userId}`;',
164
+ errors: [
165
+ {
166
+ messageId: 'databaseInjection',
167
+ // Note: Rule may not provide suggestions in all cases
168
+ },
169
+ ],
170
+ },
171
+ ],
172
+ });
173
+ });
174
+
175
+ describe('Options', () => {
176
+ ruleTester.run('options testing', databaseInjection, {
177
+ valid: [
178
+ // Use case: When detectNoSQL option is disabled, NoSQL queries should not be flagged
179
+ // This allows teams to focus only on SQL injection if they don't use NoSQL databases
180
+ {
181
+ code: 'db.collection("users").find({ name: userName });',
182
+ options: [{ detectNoSQL: false }],
183
+ },
184
+ // Use case: Variables in trustedSources list are considered safe
185
+ // This allows whitelisting specific variables that are known to be sanitized
186
+ {
187
+ code: 'db.query(`SELECT * FROM users WHERE id = ${trustedId}`);',
188
+ options: [{ trustedSources: ['trustedId'] }],
189
+ },
190
+ // Use case: Constants (all uppercase identifiers) are assumed safe
191
+ // Constants typically hold configuration values, not user input
192
+ {
193
+ code: 'db.query(`SELECT * FROM users WHERE status = ${ACTIVE_STATUS}`);',
194
+ },
195
+ ],
196
+ invalid: [
197
+ // Use case: Verify that detectNoSQL option doesn't disable SQL injection detection
198
+ // What's wrong: userId is interpolated into a SQL query (potential injection)
199
+ // What this tests: Setting detectNoSQL=false only disables NoSQL checks, SQL checks remain active
200
+ {
201
+ code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
202
+ options: [{ detectNoSQL: false }],
203
+ errors: [{ messageId: 'databaseInjection' }],
204
+ },
205
+ // Use case: Verify that high-risk taint sources cannot be whitelisted
206
+ // What's wrong: req.body.id comes directly from user request (untrusted input in SQL query)
207
+ // What this tests: Even with req.body.id in trustedSources, the rule still flags it as dangerous
208
+ // Why: Request data (req.body/query/params) is ALWAYS considered tainted for security
209
+ {
210
+ code: 'db.query(`SELECT * FROM users WHERE id = ${req.body.id}`);',
211
+ options: [{ trustedSources: ['req.body.id'] }],
212
+ errors: [{ messageId: 'databaseInjection' }],
213
+ },
214
+ ],
215
+ });
216
+ });
217
+
218
+ describe('Edge Cases', () => {
219
+ ruleTester.run('edge cases', databaseInjection, {
220
+ valid: [
221
+ // Use case: Static SQL query without any dynamic values
222
+ // Safe because there's no user input interpolated into the query
223
+ {
224
+ code: 'db.query(`SELECT * FROM users`);',
225
+ },
226
+ // Use case: String concatenation without SQL keywords
227
+ // Not a database query, just regular string manipulation
228
+ {
229
+ code: 'const result = "hello" + userInput;',
230
+ },
231
+ // Use case: NoSQL query with literal values only
232
+ // Safe because the query uses hardcoded string, not user input
233
+ {
234
+ code: 'db.collection("users").find({ status: "active" });',
235
+ },
236
+ // Use case: Template literal with NoSQL patterns but only static strings
237
+ // No dynamic expressions, so no injection risk despite NoSQL syntax
238
+ {
239
+ code: 'const query = `this.name === "safeValue"`;',
240
+ },
241
+ // Use case: Template literal in non-database context
242
+ // Just a greeting message, not a database query despite having expressions
243
+ {
244
+ code: 'const message = `Hello ${userName}!`;',
245
+ },
246
+ // Use case: NoSQL pattern with constant (uppercase) value
247
+ // Constants are assumed safe as they're configuration values, not user input
248
+ {
249
+ code: 'const query = `this.name === "${ACTIVE_STATUS}"`;',
250
+ },
251
+ ],
252
+ invalid: [
253
+ // Use case: SQL injection when query function is destructured from module
254
+ // Tests that the rule detects vulnerable patterns even with complex object destructuring
255
+ {
256
+ code: 'const { query } = require("db"); query(`SELECT * FROM users WHERE id = ${userId}`);',
257
+ errors: [{ messageId: 'databaseInjection' }],
258
+ },
259
+ ],
260
+ });
261
+ });
262
+
263
+ describe('Uncovered Lines', () => {
264
+ // Lines 175, 181: High and medium confidence taint sources
265
+ ruleTester.run('line 175 - high confidence taint sources', databaseInjection, {
266
+ valid: [],
267
+ invalid: [
268
+ // Use case: SQL injection from HTTP request body (Express.js pattern)
269
+ // req.body is the most common source of untrusted user input in web applications
270
+ {
271
+ code: 'db.query(`SELECT * FROM users WHERE name = ${req.body.name}`);',
272
+ errors: [{ messageId: 'databaseInjection' }],
273
+ },
274
+ // Use case: SQL injection from URL query parameters
275
+ // req.query contains URL parameters (e.g., ?email=...), fully controlled by attacker
276
+ {
277
+ code: 'db.query(`SELECT * FROM users WHERE email = ${req.query.email}`);',
278
+ errors: [{ messageId: 'databaseInjection' }],
279
+ },
280
+ // Use case: SQL injection from URL path parameters
281
+ // req.params contains route parameters (e.g., /users/:id), can be manipulated
282
+ {
283
+ code: 'db.query(`SELECT * FROM users WHERE id = ${req.params.id}`);',
284
+ errors: [{ messageId: 'databaseInjection' }],
285
+ },
286
+ // Use case: SQL injection from request.body (alternative naming)
287
+ // Some frameworks use 'request' instead of 'req', same high risk
288
+ {
289
+ code: 'db.query(`SELECT * FROM users WHERE name = ${request.body.name}`);',
290
+ errors: [{ messageId: 'databaseInjection' }],
291
+ },
292
+ // Use case: SQL injection from standalone params object
293
+ // Shorthand for request parameters, equally dangerous
294
+ {
295
+ code: 'db.query(`SELECT * FROM users WHERE id = ${params.id}`);',
296
+ errors: [{ messageId: 'databaseInjection' }],
297
+ },
298
+ // Use case: SQL injection from standalone query object
299
+ // Shorthand for query parameters, common in destructured handlers
300
+ {
301
+ code: 'db.query(`SELECT * FROM users WHERE email = ${query.email}`);',
302
+ errors: [{ messageId: 'databaseInjection' }],
303
+ },
304
+ // Use case: SQL injection from standalone body object
305
+ // Destructured request body, still contains untrusted user input
306
+ {
307
+ code: 'db.query(`SELECT * FROM users WHERE name = ${body.name}`);',
308
+ errors: [{ messageId: 'databaseInjection' }],
309
+ },
310
+ // Use case: SQL injection from generic input object
311
+ // Common naming pattern for user-provided data
312
+ {
313
+ code: 'db.query(`SELECT * FROM users WHERE id = ${input.id}`);',
314
+ errors: [{ messageId: 'databaseInjection' }],
315
+ },
316
+ // Use case: SQL injection from variable named userInput
317
+ // Explicitly indicates untrusted user data by naming convention
318
+ {
319
+ code: 'db.query(`SELECT * FROM users WHERE name = ${userInput}`);',
320
+ errors: [{ messageId: 'databaseInjection' }],
321
+ },
322
+ ],
323
+ });
324
+
325
+ // Line 181: Medium confidence taint sources
326
+ ruleTester.run('line 181 - medium confidence taint sources', databaseInjection, {
327
+ valid: [],
328
+ invalid: [
329
+ // Use case: SQL injection from React/UI component props
330
+ // Props can be controlled by parent components, potentially from user input
331
+ {
332
+ code: 'db.query(`SELECT * FROM users WHERE name = ${props.name}`);',
333
+ errors: [{ messageId: 'databaseInjection' }],
334
+ },
335
+ // Use case: SQL injection from application state
336
+ // State may be populated from user actions or external sources
337
+ {
338
+ code: 'db.query(`SELECT * FROM users WHERE id = ${state.id}`);',
339
+ errors: [{ messageId: 'databaseInjection' }],
340
+ },
341
+ // Use case: SQL injection from context object
342
+ // Context often carries user session data or preferences
343
+ {
344
+ code: 'db.query(`SELECT * FROM users WHERE email = ${context.email}`);',
345
+ errors: [{ messageId: 'databaseInjection' }],
346
+ },
347
+ // Use case: SQL injection from event data
348
+ // Event handlers receive data from user interactions (clicks, inputs, etc.)
349
+ {
350
+ code: 'db.query(`SELECT * FROM users WHERE name = ${event.name}`);',
351
+ errors: [{ messageId: 'databaseInjection' }],
352
+ },
353
+ // Use case: SQL injection from generic data object
354
+ // Generic 'data' objects often contain user-provided or external information
355
+ {
356
+ code: 'db.query(`SELECT * FROM users WHERE id = ${data.id}`);',
357
+ errors: [{ messageId: 'databaseInjection' }],
358
+ },
359
+ ],
360
+ });
361
+
362
+ // Lines 287-289: NoSQL operation detection
363
+ ruleTester.run('line 287-289 - NoSQL operation with tainted args', databaseInjection, {
364
+ valid: [],
365
+ invalid: [
366
+ // Use case: NoSQL injection via MongoDB find() with untrusted request data
367
+ // What's wrong: req.body.name can contain MongoDB operators like {$ne: null} to bypass filters
368
+ {
369
+ code: 'db.collection("users").find({ name: req.body.name });',
370
+ errors: [{ messageId: 'databaseInjection' }],
371
+ },
372
+ // Use case: NoSQL injection via MongoDB findOne() with URL parameters
373
+ // What's wrong: Attacker can inject MongoDB query operators through req.params.id
374
+ {
375
+ code: 'MongoClient.db.collection("users").findOne({ _id: req.params.id });',
376
+ errors: [{ messageId: 'databaseInjection' }],
377
+ },
378
+ // Use case: NoSQL injection via MongoDB updateOne() with tainted query filter
379
+ // What's wrong: The query filter contains req.query.name, allowing operator injection
380
+ // Note: Even though the update operation is benign, the filter is vulnerable
381
+ {
382
+ code: 'db.collection("users").updateOne({ name: req.query.name }, { $set: { status: "active" } });',
383
+ errors: [{ messageId: 'databaseInjection' }],
384
+ },
385
+ ],
386
+ });
387
+ });
388
+
389
+ describe('Strategy Options', () => {
390
+ ruleTester.run('strategy parameterize', databaseInjection, {
391
+ valid: [],
392
+ invalid: [
393
+ // Use case: Test that 'parameterize' strategy provides specific fix guidance
394
+ // What this tests: With strategy='parameterize', rule suggests using parameterized queries
395
+ // Expected: Two messages - one for the vulnerability, one for the specific fix strategy
396
+ {
397
+ code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
398
+ options: [{ strategy: 'parameterize' }],
399
+ errors: [
400
+ { messageId: 'databaseInjection' },
401
+ { messageId: 'strategyParameterize' }
402
+ ],
403
+ },
404
+ ],
405
+ });
406
+
407
+ ruleTester.run('strategy orm', databaseInjection, {
408
+ valid: [],
409
+ invalid: [
410
+ // Use case: Test that 'orm' strategy provides ORM-specific fix guidance
411
+ // What this tests: With strategy='orm', rule suggests using ORM query builders
412
+ // Expected: Two messages - vulnerability detection and ORM recommendation
413
+ {
414
+ code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
415
+ options: [{ strategy: 'orm' }],
416
+ errors: [
417
+ { messageId: 'databaseInjection' },
418
+ { messageId: 'strategyORM' }
419
+ ],
420
+ },
421
+ ],
422
+ });
423
+
424
+ ruleTester.run('strategy sanitize', databaseInjection, {
425
+ valid: [],
426
+ invalid: [
427
+ // Use case: Test that 'sanitize' strategy provides input sanitization guidance
428
+ // What this tests: With strategy='sanitize', rule suggests input validation/escaping
429
+ // Expected: Two messages - vulnerability detection and sanitization recommendation
430
+ {
431
+ code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
432
+ options: [{ strategy: 'sanitize' }],
433
+ errors: [
434
+ { messageId: 'databaseInjection' },
435
+ { messageId: 'strategySanitize' }
436
+ ],
437
+ },
438
+ ],
439
+ });
440
+
441
+ ruleTester.run('strategy auto (default)', databaseInjection, {
442
+ valid: [],
443
+ invalid: [
444
+ // Use case: Test that 'auto' strategy provides generic fix guidance
445
+ // What this tests: With strategy='auto' (default), rule detects but doesn't prescribe specific fix
446
+ // Expected: Only one message for the vulnerability, no strategy-specific guidance
447
+ {
448
+ code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
449
+ options: [{ strategy: 'auto' }],
450
+ errors: [{ messageId: 'databaseInjection' }],
451
+ },
452
+ ],
453
+ });
454
+ });
455
+ });
456
+