eslint-plugin-secure-coding 2.3.3 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +2 -2
  3. package/package.json +1 -1
  4. package/src/index.d.ts +32 -0
  5. package/src/index.js +416 -0
  6. package/src/rules/detect-child-process/index.d.ts +11 -0
  7. package/src/rules/detect-child-process/index.js +529 -0
  8. package/src/rules/detect-eval-with-expression/index.d.ts +9 -0
  9. package/src/rules/detect-eval-with-expression/index.js +392 -0
  10. package/src/rules/detect-mixed-content/index.d.ts +8 -0
  11. package/src/rules/detect-mixed-content/index.js +44 -0
  12. package/src/rules/detect-non-literal-fs-filename/index.d.ts +7 -0
  13. package/src/rules/detect-non-literal-fs-filename/index.js +454 -0
  14. package/src/rules/detect-non-literal-regexp/index.d.ts +9 -0
  15. package/src/rules/detect-non-literal-regexp/index.js +403 -0
  16. package/src/rules/detect-object-injection/index.d.ts +11 -0
  17. package/src/rules/detect-object-injection/index.js +560 -0
  18. package/src/rules/detect-suspicious-dependencies/index.d.ts +8 -0
  19. package/src/rules/detect-suspicious-dependencies/index.js +71 -0
  20. package/src/rules/detect-weak-password-validation/index.d.ts +6 -0
  21. package/src/rules/detect-weak-password-validation/index.js +58 -0
  22. package/src/rules/no-allow-arbitrary-loads/index.d.ts +8 -0
  23. package/src/rules/no-allow-arbitrary-loads/index.js +47 -0
  24. package/src/rules/no-arbitrary-file-access/index.d.ts +13 -0
  25. package/src/rules/no-arbitrary-file-access/index.js +195 -0
  26. package/src/rules/no-buffer-overread/index.d.ts +29 -0
  27. package/src/rules/no-buffer-overread/index.js +606 -0
  28. package/src/rules/no-clickjacking/index.d.ts +10 -0
  29. package/src/rules/no-clickjacking/index.js +396 -0
  30. package/src/rules/no-client-side-auth-logic/index.d.ts +6 -0
  31. package/src/rules/no-client-side-auth-logic/index.js +69 -0
  32. package/src/rules/no-credentials-in-query-params/index.d.ts +8 -0
  33. package/src/rules/no-credentials-in-query-params/index.js +57 -0
  34. package/src/rules/no-data-in-temp-storage/index.d.ts +6 -0
  35. package/src/rules/no-data-in-temp-storage/index.js +64 -0
  36. package/src/rules/no-debug-code-in-production/index.d.ts +8 -0
  37. package/src/rules/no-debug-code-in-production/index.js +51 -0
  38. package/src/rules/no-directive-injection/index.d.ts +12 -0
  39. package/src/rules/no-directive-injection/index.js +457 -0
  40. package/src/rules/no-disabled-certificate-validation/index.d.ts +6 -0
  41. package/src/rules/no-disabled-certificate-validation/index.js +61 -0
  42. package/src/rules/no-dynamic-dependency-loading/index.d.ts +8 -0
  43. package/src/rules/no-dynamic-dependency-loading/index.js +51 -0
  44. package/src/rules/no-electron-security-issues/index.d.ts +10 -0
  45. package/src/rules/no-electron-security-issues/index.js +423 -0
  46. package/src/rules/no-exposed-debug-endpoints/index.d.ts +6 -0
  47. package/src/rules/no-exposed-debug-endpoints/index.js +62 -0
  48. package/src/rules/no-exposed-sensitive-data/index.d.ts +11 -0
  49. package/src/rules/no-exposed-sensitive-data/index.js +340 -0
  50. package/src/rules/no-format-string-injection/index.d.ts +17 -0
  51. package/src/rules/no-format-string-injection/index.js +660 -0
  52. package/src/rules/no-graphql-injection/index.d.ts +12 -0
  53. package/src/rules/no-graphql-injection/index.js +411 -0
  54. package/src/rules/no-hardcoded-credentials/index.d.ts +26 -0
  55. package/src/rules/no-hardcoded-credentials/index.js +376 -0
  56. package/src/rules/no-hardcoded-session-tokens/index.d.ts +6 -0
  57. package/src/rules/no-hardcoded-session-tokens/index.js +59 -0
  58. package/src/rules/no-http-urls/index.d.ts +12 -0
  59. package/src/rules/no-http-urls/index.js +114 -0
  60. package/src/rules/no-improper-sanitization/index.d.ts +12 -0
  61. package/src/rules/no-improper-sanitization/index.js +411 -0
  62. package/src/rules/no-improper-type-validation/index.d.ts +10 -0
  63. package/src/rules/no-improper-type-validation/index.js +475 -0
  64. package/src/rules/no-insecure-comparison/index.d.ts +7 -0
  65. package/src/rules/no-insecure-comparison/index.js +193 -0
  66. package/src/rules/no-insecure-redirects/index.d.ts +7 -0
  67. package/src/rules/no-insecure-redirects/index.js +216 -0
  68. package/src/rules/no-insecure-websocket/index.d.ts +6 -0
  69. package/src/rules/no-insecure-websocket/index.js +61 -0
  70. package/src/rules/no-ldap-injection/index.d.ts +10 -0
  71. package/src/rules/no-ldap-injection/index.js +455 -0
  72. package/src/rules/no-missing-authentication/index.d.ts +13 -0
  73. package/src/rules/no-missing-authentication/index.js +333 -0
  74. package/src/rules/no-missing-cors-check/index.d.ts +9 -0
  75. package/src/rules/no-missing-cors-check/index.js +399 -0
  76. package/src/rules/no-missing-csrf-protection/index.d.ts +11 -0
  77. package/src/rules/no-missing-csrf-protection/index.js +180 -0
  78. package/src/rules/no-missing-security-headers/index.d.ts +7 -0
  79. package/src/rules/no-missing-security-headers/index.js +218 -0
  80. package/src/rules/no-password-in-url/index.d.ts +8 -0
  81. package/src/rules/no-password-in-url/index.js +54 -0
  82. package/src/rules/no-permissive-cors/index.d.ts +8 -0
  83. package/src/rules/no-permissive-cors/index.js +65 -0
  84. package/src/rules/no-pii-in-logs/index.d.ts +8 -0
  85. package/src/rules/no-pii-in-logs/index.js +70 -0
  86. package/src/rules/no-privilege-escalation/index.d.ts +13 -0
  87. package/src/rules/no-privilege-escalation/index.js +321 -0
  88. package/src/rules/no-redos-vulnerable-regex/index.d.ts +7 -0
  89. package/src/rules/no-redos-vulnerable-regex/index.js +306 -0
  90. package/src/rules/no-sensitive-data-exposure/index.d.ts +11 -0
  91. package/src/rules/no-sensitive-data-exposure/index.js +250 -0
  92. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +8 -0
  93. package/src/rules/no-sensitive-data-in-analytics/index.js +62 -0
  94. package/src/rules/no-sensitive-data-in-cache/index.d.ts +8 -0
  95. package/src/rules/no-sensitive-data-in-cache/index.js +52 -0
  96. package/src/rules/no-toctou-vulnerability/index.d.ts +7 -0
  97. package/src/rules/no-toctou-vulnerability/index.js +208 -0
  98. package/src/rules/no-tracking-without-consent/index.d.ts +6 -0
  99. package/src/rules/no-tracking-without-consent/index.js +67 -0
  100. package/src/rules/no-unchecked-loop-condition/index.d.ts +12 -0
  101. package/src/rules/no-unchecked-loop-condition/index.js +646 -0
  102. package/src/rules/no-unencrypted-transmission/index.d.ts +11 -0
  103. package/src/rules/no-unencrypted-transmission/index.js +236 -0
  104. package/src/rules/no-unescaped-url-parameter/index.d.ts +9 -0
  105. package/src/rules/no-unescaped-url-parameter/index.js +355 -0
  106. package/src/rules/no-unlimited-resource-allocation/index.d.ts +12 -0
  107. package/src/rules/no-unlimited-resource-allocation/index.js +643 -0
  108. package/src/rules/no-unsafe-deserialization/index.d.ts +10 -0
  109. package/src/rules/no-unsafe-deserialization/index.js +491 -0
  110. package/src/rules/no-unsafe-dynamic-require/index.d.ts +5 -0
  111. package/src/rules/no-unsafe-dynamic-require/index.js +106 -0
  112. package/src/rules/no-unsafe-regex-construction/index.d.ts +9 -0
  113. package/src/rules/no-unsafe-regex-construction/index.js +291 -0
  114. package/src/rules/no-unvalidated-deeplinks/index.d.ts +6 -0
  115. package/src/rules/no-unvalidated-deeplinks/index.js +62 -0
  116. package/src/rules/no-unvalidated-user-input/index.d.ts +9 -0
  117. package/src/rules/no-unvalidated-user-input/index.js +420 -0
  118. package/src/rules/no-verbose-error-messages/index.d.ts +8 -0
  119. package/src/rules/no-verbose-error-messages/index.js +68 -0
  120. package/src/rules/no-weak-password-recovery/index.d.ts +12 -0
  121. package/src/rules/no-weak-password-recovery/index.js +424 -0
  122. package/src/rules/no-xpath-injection/index.d.ts +10 -0
  123. package/src/rules/no-xpath-injection/index.js +487 -0
  124. package/src/rules/no-xxe-injection/index.d.ts +7 -0
  125. package/src/rules/no-xxe-injection/index.js +266 -0
  126. package/src/rules/no-zip-slip/index.d.ts +9 -0
  127. package/src/rules/no-zip-slip/index.js +445 -0
  128. package/src/rules/require-backend-authorization/index.d.ts +6 -0
  129. package/src/rules/require-backend-authorization/index.js +60 -0
  130. package/src/rules/require-code-minification/index.d.ts +8 -0
  131. package/src/rules/require-code-minification/index.js +47 -0
  132. package/src/rules/require-csp-headers/index.d.ts +6 -0
  133. package/src/rules/require-csp-headers/index.js +64 -0
  134. package/src/rules/require-data-minimization/index.d.ts +8 -0
  135. package/src/rules/require-data-minimization/index.js +53 -0
  136. package/src/rules/require-dependency-integrity/index.d.ts +6 -0
  137. package/src/rules/require-dependency-integrity/index.js +64 -0
  138. package/src/rules/require-https-only/index.d.ts +8 -0
  139. package/src/rules/require-https-only/index.js +62 -0
  140. package/src/rules/require-mime-type-validation/index.d.ts +6 -0
  141. package/src/rules/require-mime-type-validation/index.js +66 -0
  142. package/src/rules/require-network-timeout/index.d.ts +8 -0
  143. package/src/rules/require-network-timeout/index.js +50 -0
  144. package/src/rules/require-package-lock/index.d.ts +8 -0
  145. package/src/rules/require-package-lock/index.js +63 -0
  146. package/src/rules/require-secure-credential-storage/index.d.ts +8 -0
  147. package/src/rules/require-secure-credential-storage/index.js +50 -0
  148. package/src/rules/require-secure-defaults/index.d.ts +8 -0
  149. package/src/rules/require-secure-defaults/index.js +47 -0
  150. package/src/rules/require-secure-deletion/index.d.ts +8 -0
  151. package/src/rules/require-secure-deletion/index.js +44 -0
  152. package/src/rules/require-storage-encryption/index.d.ts +8 -0
  153. package/src/rules/require-storage-encryption/index.js +50 -0
  154. package/src/rules/require-url-validation/index.d.ts +6 -0
  155. package/src/rules/require-url-validation/index.js +72 -0
  156. package/src/types/index.d.ts +106 -0
  157. package/src/types/index.js +16 -0
  158. package/src/index.ts +0 -605
  159. package/src/rules/__tests__/integration-demo.test.ts +0 -290
  160. package/src/rules/__tests__/integration-llm.test.ts +0 -89
  161. package/src/rules/database-injection/database-injection.test.ts +0 -456
  162. package/src/rules/database-injection/index.ts +0 -488
  163. package/src/rules/detect-child-process/detect-child-process.test.ts +0 -207
  164. package/src/rules/detect-child-process/index.ts +0 -634
  165. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +0 -416
  166. package/src/rules/detect-eval-with-expression/index.ts +0 -463
  167. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +0 -28
  168. package/src/rules/detect-mixed-content/index.ts +0 -52
  169. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +0 -269
  170. package/src/rules/detect-non-literal-fs-filename/index.ts +0 -551
  171. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +0 -189
  172. package/src/rules/detect-non-literal-regexp/index.ts +0 -490
  173. package/src/rules/detect-object-injection/detect-object-injection.test.ts +0 -440
  174. package/src/rules/detect-object-injection/index.ts +0 -674
  175. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +0 -32
  176. package/src/rules/detect-suspicious-dependencies/index.ts +0 -84
  177. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +0 -31
  178. package/src/rules/detect-weak-password-validation/index.ts +0 -68
  179. package/src/rules/no-allow-arbitrary-loads/index.ts +0 -54
  180. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +0 -28
  181. package/src/rules/no-arbitrary-file-access/index.ts +0 -238
  182. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +0 -119
  183. package/src/rules/no-buffer-overread/index.ts +0 -724
  184. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +0 -313
  185. package/src/rules/no-clickjacking/index.ts +0 -481
  186. package/src/rules/no-clickjacking/no-clickjacking.test.ts +0 -253
  187. package/src/rules/no-client-side-auth-logic/index.ts +0 -81
  188. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +0 -33
  189. package/src/rules/no-credentials-in-query-params/index.ts +0 -69
  190. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +0 -33
  191. package/src/rules/no-credentials-in-storage-api/index.ts +0 -64
  192. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +0 -31
  193. package/src/rules/no-data-in-temp-storage/index.ts +0 -75
  194. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +0 -33
  195. package/src/rules/no-debug-code-in-production/index.ts +0 -59
  196. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +0 -26
  197. package/src/rules/no-directive-injection/index.ts +0 -551
  198. package/src/rules/no-directive-injection/no-directive-injection.test.ts +0 -305
  199. package/src/rules/no-disabled-certificate-validation/index.ts +0 -72
  200. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +0 -33
  201. package/src/rules/no-document-cookie/index.ts +0 -113
  202. package/src/rules/no-document-cookie/no-document-cookie.test.ts +0 -382
  203. package/src/rules/no-dynamic-dependency-loading/index.ts +0 -60
  204. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +0 -27
  205. package/src/rules/no-electron-security-issues/index.ts +0 -504
  206. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +0 -324
  207. package/src/rules/no-exposed-debug-endpoints/index.ts +0 -73
  208. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +0 -40
  209. package/src/rules/no-exposed-sensitive-data/index.ts +0 -428
  210. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +0 -75
  211. package/src/rules/no-format-string-injection/index.ts +0 -801
  212. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +0 -437
  213. package/src/rules/no-graphql-injection/index.ts +0 -508
  214. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +0 -371
  215. package/src/rules/no-hardcoded-credentials/index.ts +0 -478
  216. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +0 -639
  217. package/src/rules/no-hardcoded-session-tokens/index.ts +0 -69
  218. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +0 -42
  219. package/src/rules/no-http-urls/index.ts +0 -131
  220. package/src/rules/no-http-urls/no-http-urls.test.ts +0 -60
  221. package/src/rules/no-improper-sanitization/index.ts +0 -502
  222. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +0 -156
  223. package/src/rules/no-improper-type-validation/index.ts +0 -572
  224. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +0 -372
  225. package/src/rules/no-insecure-comparison/index.ts +0 -232
  226. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +0 -218
  227. package/src/rules/no-insecure-cookie-settings/index.ts +0 -391
  228. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +0 -409
  229. package/src/rules/no-insecure-jwt/index.ts +0 -467
  230. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +0 -259
  231. package/src/rules/no-insecure-redirects/index.ts +0 -267
  232. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +0 -108
  233. package/src/rules/no-insecure-websocket/index.ts +0 -72
  234. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +0 -42
  235. package/src/rules/no-insufficient-postmessage-validation/index.ts +0 -497
  236. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +0 -360
  237. package/src/rules/no-insufficient-random/index.ts +0 -288
  238. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +0 -246
  239. package/src/rules/no-ldap-injection/index.ts +0 -547
  240. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +0 -317
  241. package/src/rules/no-missing-authentication/index.ts +0 -408
  242. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +0 -350
  243. package/src/rules/no-missing-cors-check/index.ts +0 -453
  244. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +0 -392
  245. package/src/rules/no-missing-csrf-protection/index.ts +0 -229
  246. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +0 -222
  247. package/src/rules/no-missing-security-headers/index.ts +0 -266
  248. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +0 -98
  249. package/src/rules/no-password-in-url/index.ts +0 -64
  250. package/src/rules/no-password-in-url/no-password-in-url.test.ts +0 -27
  251. package/src/rules/no-permissive-cors/index.ts +0 -78
  252. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +0 -28
  253. package/src/rules/no-pii-in-logs/index.ts +0 -83
  254. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +0 -26
  255. package/src/rules/no-postmessage-origin-wildcard/index.ts +0 -67
  256. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +0 -27
  257. package/src/rules/no-privilege-escalation/index.ts +0 -403
  258. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +0 -306
  259. package/src/rules/no-redos-vulnerable-regex/index.ts +0 -379
  260. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +0 -83
  261. package/src/rules/no-sensitive-data-exposure/index.ts +0 -294
  262. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +0 -262
  263. package/src/rules/no-sensitive-data-in-analytics/index.ts +0 -73
  264. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +0 -42
  265. package/src/rules/no-sensitive-data-in-cache/index.ts +0 -59
  266. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +0 -32
  267. package/src/rules/no-sql-injection/index.ts +0 -424
  268. package/src/rules/no-sql-injection/no-sql-injection.test.ts +0 -303
  269. package/src/rules/no-timing-attack/index.ts +0 -552
  270. package/src/rules/no-timing-attack/no-timing-attack.test.ts +0 -348
  271. package/src/rules/no-toctou-vulnerability/index.ts +0 -250
  272. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +0 -60
  273. package/src/rules/no-tracking-without-consent/index.ts +0 -78
  274. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +0 -34
  275. package/src/rules/no-unchecked-loop-condition/index.ts +0 -781
  276. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +0 -459
  277. package/src/rules/no-unencrypted-local-storage/index.ts +0 -73
  278. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +0 -41
  279. package/src/rules/no-unencrypted-transmission/index.ts +0 -296
  280. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +0 -287
  281. package/src/rules/no-unescaped-url-parameter/index.ts +0 -424
  282. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +0 -263
  283. package/src/rules/no-unlimited-resource-allocation/index.ts +0 -767
  284. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +0 -544
  285. package/src/rules/no-unsafe-deserialization/index.ts +0 -593
  286. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +0 -310
  287. package/src/rules/no-unsafe-dynamic-require/index.ts +0 -125
  288. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +0 -151
  289. package/src/rules/no-unsafe-regex-construction/index.ts +0 -370
  290. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +0 -181
  291. package/src/rules/no-unsanitized-html/index.ts +0 -400
  292. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +0 -488
  293. package/src/rules/no-unvalidated-deeplinks/index.ts +0 -73
  294. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +0 -29
  295. package/src/rules/no-unvalidated-user-input/index.ts +0 -498
  296. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +0 -463
  297. package/src/rules/no-verbose-error-messages/index.ts +0 -83
  298. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +0 -34
  299. package/src/rules/no-weak-crypto/index.ts +0 -447
  300. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +0 -297
  301. package/src/rules/no-weak-password-recovery/index.ts +0 -509
  302. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +0 -184
  303. package/src/rules/no-xpath-injection/index.ts +0 -596
  304. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +0 -405
  305. package/src/rules/no-xxe-injection/index.ts +0 -342
  306. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +0 -122
  307. package/src/rules/no-zip-slip/index.ts +0 -526
  308. package/src/rules/no-zip-slip/no-zip-slip.test.ts +0 -305
  309. package/src/rules/require-backend-authorization/index.ts +0 -71
  310. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +0 -31
  311. package/src/rules/require-code-minification/index.ts +0 -54
  312. package/src/rules/require-code-minification/require-code-minification.test.ts +0 -30
  313. package/src/rules/require-csp-headers/index.ts +0 -74
  314. package/src/rules/require-csp-headers/require-csp-headers.test.ts +0 -34
  315. package/src/rules/require-data-minimization/index.ts +0 -65
  316. package/src/rules/require-data-minimization/require-data-minimization.test.ts +0 -31
  317. package/src/rules/require-dependency-integrity/index.ts +0 -78
  318. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +0 -44
  319. package/src/rules/require-https-only/index.ts +0 -75
  320. package/src/rules/require-https-only/require-https-only.test.ts +0 -26
  321. package/src/rules/require-mime-type-validation/index.ts +0 -77
  322. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +0 -32
  323. package/src/rules/require-network-timeout/index.ts +0 -58
  324. package/src/rules/require-network-timeout/require-network-timeout.test.ts +0 -26
  325. package/src/rules/require-package-lock/index.ts +0 -75
  326. package/src/rules/require-package-lock/require-package-lock.test.ts +0 -27
  327. package/src/rules/require-secure-credential-storage/index.ts +0 -60
  328. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +0 -26
  329. package/src/rules/require-secure-defaults/index.ts +0 -54
  330. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +0 -26
  331. package/src/rules/require-secure-deletion/index.ts +0 -52
  332. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +0 -29
  333. package/src/rules/require-storage-encryption/index.ts +0 -60
  334. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +0 -26
  335. package/src/rules/require-url-validation/index.ts +0 -85
  336. package/src/rules/require-url-validation/require-url-validation.test.ts +0 -32
  337. package/src/types/index.ts +0 -235
@@ -1,372 +0,0 @@
1
- /**
2
- * Comprehensive tests for no-improper-type-validation rule
3
- * Security: CWE-1287 (Improper Validation of Specified Type of Input)
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 { noImproperTypeValidation } 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('no-improper-type-validation', () => {
26
- describe('Valid Code', () => {
27
- ruleTester.run('valid - proper type validation', noImproperTypeValidation, {
28
- valid: [
29
- // Proper type checking with strict equality
30
- {
31
- code: 'if (value !== null && typeof value === "object") { /* process */ }',
32
- },
33
- {
34
- code: 'if (Array.isArray(data)) { /* process array */ }',
35
- },
36
- // Non-user-input typeof checks are valid
37
- {
38
- code: 'if (typeof value === "string" && value.length > 0) { /* process */ }',
39
- },
40
- // Safe type guards
41
- {
42
- code: 'if (Number.isNaN(Number(value))) { /* handle NaN */ }',
43
- },
44
- {
45
- code: 'if (Object.prototype.toString.call(value) === "[object Array]") { /* process */ }',
46
- },
47
- // Strict equality for types
48
- {
49
- code: 'if (value !== null && value !== undefined) { /* process */ }',
50
- },
51
- ],
52
- invalid: [],
53
- });
54
- });
55
-
56
- describe('Invalid Code - Unsafe typeof Checks', () => {
57
- ruleTester.run('invalid - unsafe typeof usage', noImproperTypeValidation, {
58
- valid: [],
59
- invalid: [
60
- // typeof === "object" on user input variable
61
- {
62
- code: 'if (typeof userInput === "object") { processData(userInput); }',
63
- errors: [
64
- {
65
- messageId: 'unsafeTypeofCheck',
66
- },
67
- ],
68
- },
69
- // typeof on data (user input variable)
70
- {
71
- code: 'const isObject = typeof data === "object";',
72
- errors: [
73
- {
74
- messageId: 'unsafeTypeofCheck',
75
- },
76
- ],
77
- },
78
- ],
79
- });
80
- });
81
-
82
- describe('Invalid Code - Unsafe instanceof Usage', () => {
83
- ruleTester.run('invalid - unsafe instanceof usage', noImproperTypeValidation, {
84
- valid: [],
85
- invalid: [
86
- // instanceof on user input with allowInstanceofSameRealm: false
87
- {
88
- code: 'if (userInput instanceof Array) { processArray(userInput); }',
89
- options: [{ allowInstanceofSameRealm: false }],
90
- errors: [
91
- {
92
- messageId: 'unsafeInstanceofUsage',
93
- },
94
- ],
95
- },
96
- {
97
- code: 'if (data instanceof Object) { handleObject(data); }',
98
- options: [{ allowInstanceofSameRealm: false }],
99
- errors: [
100
- {
101
- messageId: 'unsafeInstanceofUsage',
102
- },
103
- ],
104
- },
105
- ],
106
- });
107
- });
108
-
109
- describe('Invalid Code - Loose Equality Type Checks', () => {
110
- ruleTester.run('invalid - loose equality for types', noImproperTypeValidation, {
111
- valid: [],
112
- invalid: [
113
- // Loose equality with null on user input variable - triggers both messages
114
- // IfStatement reports missingNullCheck, BinaryExpression reports looseEqualityTypeCheck
115
- {
116
- code: 'if (input != null) { processInput(input); }',
117
- errors: [
118
- {
119
- messageId: 'missingNullCheck',
120
- },
121
- {
122
- messageId: 'looseEqualityTypeCheck',
123
- },
124
- ],
125
- },
126
- // Loose equality with null (always flagged due to null comparison)
127
- {
128
- code: 'if (userData == null) { return; }',
129
- errors: [
130
- {
131
- messageId: 'looseEqualityTypeCheck',
132
- },
133
- ],
134
- },
135
- ],
136
- });
137
- });
138
-
139
- describe('Invalid Code - Missing Null Checks', () => {
140
- ruleTester.run('invalid - missing null checks', noImproperTypeValidation, {
141
- valid: [],
142
- invalid: [
143
- // userInput is a user input variable - reports missingNullCheck first (IfStatement),
144
- // then looseEqualityTypeCheck (BinaryExpression)
145
- {
146
- code: 'if (userInput != null) { processData(userInput); }',
147
- errors: [
148
- {
149
- messageId: 'missingNullCheck',
150
- },
151
- {
152
- messageId: 'looseEqualityTypeCheck',
153
- },
154
- ],
155
- },
156
- // req.body involves user input variable - only reports looseEqualityTypeCheck
157
- // because req.body as MemberExpression doesn't trigger missingNullCheck
158
- {
159
- code: 'if (req.body == null) { return; }',
160
- errors: [
161
- {
162
- messageId: 'looseEqualityTypeCheck',
163
- },
164
- ],
165
- },
166
- ],
167
- });
168
- });
169
-
170
- describe('Invalid Code - Unreliable Constructor Checks', () => {
171
- ruleTester.run('invalid - unreliable constructor checks', noImproperTypeValidation, {
172
- valid: [],
173
- invalid: [
174
- {
175
- code: 'const type = userInput.constructor.name;',
176
- errors: [
177
- {
178
- messageId: 'unreliableConstructorCheck',
179
- },
180
- ],
181
- },
182
- {
183
- code: 'if (data.constructor.name === "Array") { handleArray(data); }',
184
- errors: [
185
- {
186
- messageId: 'unreliableConstructorCheck',
187
- },
188
- ],
189
- },
190
- ],
191
- });
192
- });
193
-
194
- describe('Invalid Code - Improper Type Validation', () => {
195
- ruleTester.run('invalid - improper type validation patterns', noImproperTypeValidation, {
196
- valid: [],
197
- invalid: [
198
- // typeof userInput === "object" - unsafe typeof check on user input
199
- {
200
- code: 'const type = typeof userInput === "object";',
201
- errors: [
202
- {
203
- messageId: 'unsafeTypeofCheck',
204
- },
205
- ],
206
- },
207
- ],
208
- });
209
- });
210
-
211
- describe('Valid Code - False Positives Reduced', () => {
212
- ruleTester.run('valid - false positives reduced', noImproperTypeValidation, {
213
- valid: [
214
- // Safe annotations
215
- {
216
- code: `
217
- /** @validated */
218
- if (typeof userInput === "object") {
219
- processData(userInput);
220
- }
221
- `,
222
- },
223
- // TypeScript type guards (would be handled by TS compiler)
224
- {
225
- code: `
226
- function isString(value: any): value is string {
227
- return typeof value === "string";
228
- }
229
- `,
230
- },
231
- // Safe type checking functions
232
- {
233
- code: `
234
- if (validateType(userInput, "object")) {
235
- processData(userInput);
236
- }
237
- `,
238
- },
239
- // Proper null checks
240
- {
241
- code: `
242
- if (userInput !== null && userInput !== undefined) {
243
- processData(userInput);
244
- }
245
- `,
246
- },
247
- // Safe instanceof within same realm
248
- {
249
- code: `
250
- const arr = [1, 2, 3];
251
- if (arr instanceof Array) {
252
- processArray(arr);
253
- }
254
- `,
255
- },
256
- ],
257
- invalid: [],
258
- });
259
- });
260
-
261
- describe('Configuration Options', () => {
262
- ruleTester.run('config - custom user input variables', noImproperTypeValidation, {
263
- valid: [
264
- // otherInput is NOT in userInputVariables, so it's not flagged
265
- {
266
- code: 'if (typeof otherInput === "object") { /* process */ }',
267
- options: [{ userInputVariables: ['customInput'] }],
268
- },
269
- ],
270
- invalid: [
271
- // customInput IS in userInputVariables, so it's flagged
272
- {
273
- code: 'if (typeof customInput === "object") { /* process */ }',
274
- options: [{ userInputVariables: ['customInput'] }],
275
- errors: [
276
- {
277
- messageId: 'unsafeTypeofCheck',
278
- },
279
- ],
280
- },
281
- ],
282
- });
283
-
284
- ruleTester.run('config - disable instanceof checks', noImproperTypeValidation, {
285
- valid: [],
286
- invalid: [
287
- {
288
- code: 'if (data instanceof Array) { /* process */ }',
289
- options: [{ allowInstanceofSameRealm: false }],
290
- errors: [
291
- {
292
- messageId: 'unsafeInstanceofUsage',
293
- },
294
- ],
295
- },
296
- ],
297
- });
298
- });
299
-
300
- describe('Complex Type Validation Scenarios', () => {
301
- ruleTester.run('complex - real-world type validation patterns', noImproperTypeValidation, {
302
- valid: [],
303
- invalid: [
304
- // typeof userInput === "object" triggers unsafeTypeofCheck
305
- {
306
- code: `
307
- function processUserData(userInput) {
308
- // DANGEROUS: typeof check misses null
309
- if (typeof userInput === "object") {
310
- // null would pass this check!
311
- Object.keys(userInput).forEach(key => {
312
- processField(key, userInput[key]);
313
- });
314
- }
315
- }
316
- `,
317
- errors: [
318
- {
319
- messageId: 'unsafeTypeofCheck',
320
- },
321
- ],
322
- },
323
- // credentials != null triggers looseEqualityTypeCheck (null comparison)
324
- {
325
- code: `
326
- // Authentication bypass through type confusion
327
- function authenticate(credentials) {
328
- // DANGEROUS: loose equality allows type confusion
329
- if (credentials != null) {
330
- if (credentials.username == "admin") { // == allows string/number confusion
331
- return { role: "admin" };
332
- }
333
- }
334
- return { role: "user" };
335
- }
336
- `,
337
- errors: [
338
- {
339
- messageId: 'looseEqualityTypeCheck',
340
- },
341
- ],
342
- },
343
- // input != null triggers missingNullCheck (IfStatement) first,
344
- // then looseEqualityTypeCheck (BinaryExpression)
345
- {
346
- code: `
347
- // Incomplete type validation
348
- function validateAndProcess(input) {
349
- // DANGEROUS: only checks != null, misses undefined
350
- if (input != null) {
351
- if (typeof input === "string") {
352
- processString(input);
353
- } else if (Array.isArray(input)) {
354
- processArray(input);
355
- }
356
- // undefined would pass != null check but cause issues
357
- }
358
- }
359
- `,
360
- errors: [
361
- {
362
- messageId: 'missingNullCheck',
363
- },
364
- {
365
- messageId: 'looseEqualityTypeCheck',
366
- },
367
- ],
368
- },
369
- ],
370
- });
371
- });
372
- });
@@ -1,232 +0,0 @@
1
- /**
2
- * ESLint Rule: no-insecure-comparison
3
- * Detects insecure comparison operators (==, !=) that can lead to type coercion vulnerabilities
4
- * CWE-697: Incorrect Comparison
5
- *
6
- * @see https://cwe.mitre.org/data/definitions/697.html
7
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
8
- */
9
- import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
10
- import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
11
- import { createRule } from '@interlace/eslint-devkit';
12
-
13
- type MessageIds = 'insecureComparison' | 'useStrictEquality' | 'timingUnsafeComparison';
14
-
15
- export interface Options {
16
- /** Allow insecure comparison in test files. Default: false */
17
- allowInTests?: boolean;
18
-
19
- /** Additional patterns to ignore. Default: [] */
20
- ignorePatterns?: string[];
21
- }
22
-
23
- type RuleOptions = [Options?];
24
-
25
- export const noInsecureComparison = createRule<RuleOptions, MessageIds>({
26
- name: 'no-insecure-comparison',
27
- meta: {
28
- type: 'problem',
29
- deprecated: true,
30
- replacedBy: ['@see eslint-plugin-crypto/no-timing-unsafe-compare'],
31
- docs: {
32
- description: 'Detects insecure comparison operators (==, !=) that can lead to type coercion vulnerabilities',
33
- },
34
- fixable: 'code',
35
- hasSuggestions: true,
36
- messages: {
37
- insecureComparison: formatLLMMessage({
38
- icon: MessageIcons.SECURITY,
39
- issueName: 'Insecure Comparison',
40
- cwe: 'CWE-697',
41
- description: 'Insecure comparison operator ({{operator}}) detected - can lead to type coercion vulnerabilities',
42
- severity: 'HIGH',
43
- fix: 'Use strict equality ({{strictOperator}}) instead: {{example}}',
44
- documentationLink: 'https://cwe.mitre.org/data/definitions/697.html',
45
- }),
46
- useStrictEquality: formatLLMMessage({
47
- icon: MessageIcons.INFO,
48
- issueName: 'Use Strict Equality',
49
- description: 'Use strict equality operator',
50
- severity: 'LOW',
51
- fix: 'Replace == with === and != with !==',
52
- documentationLink: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality',
53
- }),
54
- timingUnsafeComparison: formatLLMMessage({
55
- icon: MessageIcons.SECURITY,
56
- issueName: 'Timing Attack Risk',
57
- cwe: 'CWE-208',
58
- description: 'Secret comparison with {{operator}} can leak timing information',
59
- severity: 'HIGH',
60
- fix: 'Use crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b))',
61
- documentationLink: 'https://nodejs.org/api/crypto.html#cryptotimingsafeequala-b',
62
- }),
63
- },
64
- schema: [
65
- {
66
- type: 'object',
67
- properties: {
68
- allowInTests: {
69
- type: 'boolean',
70
- default: false,
71
- description: 'Allow insecure comparison in test files',
72
- },
73
- ignorePatterns: {
74
- type: 'array',
75
- items: { type: 'string' },
76
- default: [],
77
- description: 'Additional patterns to ignore',
78
- },
79
- },
80
- additionalProperties: false,
81
- },
82
- ],
83
- },
84
- defaultOptions: [
85
- {
86
- allowInTests: false,
87
- ignorePatterns: [],
88
- },
89
- ],
90
- create(
91
- context: TSESLint.RuleContext<MessageIds, RuleOptions>,
92
- [options = {}]
93
- ) {
94
- const {
95
- allowInTests = false,
96
- ignorePatterns = [],
97
- } = options as Options;
98
-
99
- const filename = context.getFilename();
100
- const isTestFile = allowInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
101
- const sourceCode = context.sourceCode || context.sourceCode;
102
-
103
- /**
104
- * Check if a string matches any ignore pattern
105
- */
106
- function matchesIgnorePattern(text: string, patterns: string[]): boolean {
107
- return patterns.some(pattern => {
108
- try {
109
- const regex = new RegExp(pattern, 'i');
110
- return regex.test(text);
111
- } catch {
112
- // Invalid regex - treat as literal string match
113
- return text.toLowerCase().includes(pattern.toLowerCase());
114
- }
115
- });
116
- }
117
-
118
- /**
119
- * Check BinaryExpression for insecure comparison operators
120
- */
121
- function checkBinaryExpression(node: TSESTree.BinaryExpression) {
122
- if (isTestFile) {
123
- return;
124
- }
125
-
126
- const secretKeywords = ['secret', 'token', 'password', 'apikey', 'api_key', 'signature', 'auth', 'key', 'hash', 'digest', 'mac'];
127
-
128
- const isSecurityContext = ((): boolean => {
129
- let current: TSESTree.Node | undefined = node;
130
- while (current) {
131
- if ((current.type === 'FunctionDeclaration' ||
132
- current.type === 'FunctionExpression' ||
133
- current.type === 'ArrowFunctionExpression') &&
134
- 'id' in current && current.id?.name) {
135
- if (/security|auth|crypto|hash|token|secret|insecure|verify|validate/i.test(current.id.name)) {
136
- return true;
137
- }
138
- }
139
- if (current.type === 'MethodDefinition' && current.key.type === 'Identifier') {
140
- if (/security|auth|crypto|hash|token|secret|insecure|verify|validate/i.test(current.key.name)) {
141
- return true;
142
- }
143
- }
144
- current = current.parent;
145
- }
146
- return false;
147
- })();
148
-
149
- const isPotentialSecret = (expr: TSESTree.Expression): boolean => {
150
- const text = sourceCode.getText(expr).toLowerCase();
151
- if (secretKeywords.some(keyword => text.includes(keyword))) return true;
152
-
153
- // In security contexts, treat generic terms as potential secrets
154
- if (isSecurityContext) {
155
- const contextKeywords = ['provided', 'expected', 'actual', 'input', 'value', 'data'];
156
- return contextKeywords.some(keyword => text.includes(keyword));
157
- }
158
- return false;
159
- };
160
-
161
- // Timing-safe comparison for secrets even with strict equality
162
- if ((node.operator === '===' || node.operator === '!==') &&
163
- (isPotentialSecret(node.left) || isPotentialSecret(node.right))) {
164
- const leftText = sourceCode.getText(node.left);
165
- const rightText = sourceCode.getText(node.right);
166
-
167
- // ... rest of logic uses example ...
168
- const example = `crypto.timingSafeEqual(Buffer.from(${leftText}), Buffer.from(${rightText}))`;
169
-
170
- context.report({
171
- node,
172
- messageId: 'timingUnsafeComparison',
173
- data: {
174
- operator: node.operator,
175
- strictOperator: node.operator,
176
- example: example,
177
- },
178
- suggest: [
179
- {
180
- messageId: 'useStrictEquality', // This messageId usage might be wrong for timing safe output, but kept for now or reused?
181
- // Wait, previous code used useStrictEquality as suggest?
182
- // Ah, the previous code had a fix/suggest structure.
183
- fix: (fixer: TSESLint.RuleFixer) => fixer.replaceText(node, example),
184
- },
185
- ],
186
- });
187
- return;
188
- }
189
-
190
- // Check for insecure comparison operators
191
- if (node.operator === '==' || node.operator === '!=') {
192
- const text = sourceCode.getText(node);
193
-
194
- // Check if it matches any ignore pattern
195
- if (matchesIgnorePattern(text, ignorePatterns)) {
196
- return;
197
- }
198
-
199
- const strictOperator = node.operator === '==' ? '===' : '!==';
200
- const leftText = sourceCode.getText(node.left);
201
- const rightText = sourceCode.getText(node.right);
202
- const example = `${leftText} ${strictOperator} ${rightText}`;
203
-
204
- context.report({
205
- node: node,
206
- messageId: 'insecureComparison',
207
- data: {
208
- operator: node.operator,
209
- strictOperator,
210
- example,
211
- },
212
- fix: (fixer: TSESLint.RuleFixer) => {
213
- return fixer.replaceText(node, example);
214
- },
215
- suggest: [
216
- {
217
- messageId: 'useStrictEquality',
218
- fix: (fixer: TSESLint.RuleFixer) => {
219
- return fixer.replaceText(node, example);
220
- },
221
- },
222
- ],
223
- });
224
- }
225
- }
226
-
227
- return {
228
- BinaryExpression: checkBinaryExpression,
229
- };
230
- },
231
- });
232
-