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,453 +0,0 @@
1
- /**
2
- * ESLint Rule: no-missing-cors-check
3
- * Detects missing CORS validation (wildcard CORS, missing origin check)
4
- * CWE-346: Origin Validation Error
5
- *
6
- * @see https://cwe.mitre.org/data/definitions/346.html
7
- * @see https://owasp.org/www-community/attacks/CORS_Misconfiguration
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 = 'missingCorsCheck' | 'useOriginValidation' | 'useCorsMiddleware';
14
-
15
- export interface Options {
16
- /** Allow missing CORS checks in test files. Default: false */
17
- allowInTests?: boolean;
18
-
19
- /** Trusted CORS libraries. Default: ['cors', '@koa/cors', 'express-cors'] */
20
- trustedLibraries?: string[];
21
-
22
- /** Additional safe patterns to ignore. Default: [] */
23
- ignorePatterns?: string[];
24
- }
25
-
26
- type RuleOptions = [Options?];
27
-
28
- /**
29
- * Check if a string matches any ignore pattern
30
- */
31
- function matchesIgnorePattern(text: string, ignorePatterns: string[]): boolean {
32
- return ignorePatterns.some(pattern => {
33
- try {
34
- const regex = new RegExp(pattern, 'i');
35
- return regex.test(text);
36
- } catch {
37
- return false;
38
- }
39
- });
40
- }
41
-
42
- export const noMissingCorsCheck = createRule<RuleOptions, MessageIds>({
43
- name: 'no-missing-cors-check',
44
- meta: {
45
- type: 'problem',
46
- deprecated: true,
47
- replacedBy: ['@see eslint-plugin-express-security/no-permissive-cors'],
48
- docs: {
49
- description: 'Detects missing CORS validation (wildcard CORS, missing origin check)',
50
- },
51
- hasSuggestions: true,
52
- messages: {
53
- missingCorsCheck: formatLLMMessage({
54
- icon: MessageIcons.SECURITY,
55
- issueName: 'Missing CORS Validation',
56
- cwe: 'CWE-346',
57
- description: 'Missing CORS validation detected: {{issue}}',
58
- severity: 'HIGH',
59
- fix: '{{safeAlternative}}',
60
- documentationLink: 'https://cwe.mitre.org/data/definitions/346.html',
61
- }),
62
- useOriginValidation: formatLLMMessage({
63
- icon: MessageIcons.INFO,
64
- issueName: 'Validate Origin',
65
- description: 'Validate CORS origin',
66
- severity: 'LOW',
67
- fix: 'cors({ origin: (origin, cb) => allowedOrigins.includes(origin) ? cb(null, true) : cb(new Error()) })',
68
- documentationLink: 'https://github.com/expressjs/cors#configuration-options',
69
- }),
70
- useCorsMiddleware: formatLLMMessage({
71
- icon: MessageIcons.INFO,
72
- issueName: 'Use CORS Middleware',
73
- description: 'Use CORS middleware with origin validation',
74
- severity: 'LOW',
75
- fix: 'app.use(cors({ origin: allowedOrigins }))',
76
- documentationLink: 'https://github.com/expressjs/cors',
77
- }),
78
- },
79
- schema: [
80
- {
81
- type: 'object',
82
- properties: {
83
- allowInTests: {
84
- type: 'boolean',
85
- default: false,
86
- description: 'Allow missing CORS checks in test files',
87
- },
88
- trustedLibraries: {
89
- type: 'array',
90
- items: { type: 'string' },
91
- default: [],
92
- description: 'Custom CORS libraries to trust (wildcard origins in these libraries will not be reported)',
93
- },
94
- ignorePatterns: {
95
- type: 'array',
96
- items: { type: 'string' },
97
- default: [],
98
- description: 'Additional safe patterns to ignore',
99
- },
100
- },
101
- additionalProperties: false,
102
- },
103
- ],
104
- },
105
- defaultOptions: [
106
- {
107
- allowInTests: false,
108
- trustedLibraries: [], // Empty by default - users can add custom CORS libraries they trust
109
- ignorePatterns: [],
110
- },
111
- ],
112
- create(
113
- context: TSESLint.RuleContext<MessageIds, RuleOptions>,
114
- [options = {}]
115
- ) {
116
- const {
117
- allowInTests = false,
118
- trustedLibraries: corsTrustedLibraries = [],
119
- ignorePatterns = [],
120
- } = options as Options;
121
-
122
- const trustedLibraries = corsTrustedLibraries;
123
-
124
- const filename = context.getFilename();
125
- const isTestFile = allowInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
126
- const sourceCode = context.sourceCode || context.sourceCode;
127
-
128
- function checkLiteral(node: TSESTree.Literal) {
129
- if (isTestFile) {
130
- return;
131
- }
132
-
133
- // Check for wildcard CORS origin
134
- if (node.value === '*' && typeof node.value === 'string') {
135
- const text = sourceCode.getText(node);
136
-
137
- // Check if it matches any ignore pattern
138
- if (matchesIgnorePattern(text, ignorePatterns)) {
139
- return;
140
- }
141
-
142
- // Check if it's in contexts handled by other checkers
143
- // 1. setHeader/header calls - checkMemberExpression handles these
144
- // 2. app.use(cors({ origin: "*" })) - checkCallExpression handles these with suggestions
145
- let shouldSkip = false;
146
- let current: TSESTree.Node | null = node;
147
- while (current && current.parent) {
148
- current = current.parent as TSESTree.Node;
149
- if (current.type === 'CallExpression') {
150
- const callText = sourceCode.getText(current);
151
- // Check if it's a setHeader/header call with Access-Control-Allow-Origin
152
- // Skip these - checkMemberExpression handles them
153
- if (/\b(setHeader|header)\s*\(/i.test(callText) && /\bAccess-Control-Allow-Origin\b/i.test(callText)) {
154
- shouldSkip = true;
155
- break;
156
- }
157
- // Check if it's app.use(cors({ origin: "*" })) - checkCallExpression handles these with suggestions
158
- if (/\buse\s*\(/i.test(callText) && /\bcors\s*\(/i.test(callText)) {
159
- // Check if the literal is in an object property named "origin"
160
- if (node.parent && node.parent.type === 'Property') {
161
- const prop = node.parent as TSESTree.Property;
162
- if (prop.key.type === 'Identifier' && prop.key.name === 'origin') {
163
- shouldSkip = true;
164
- break;
165
- }
166
- }
167
- }
168
- }
169
- }
170
-
171
- // Skip if it's in a context handled by another checker
172
- if (shouldSkip) {
173
- return;
174
- }
175
-
176
- // Check if it's in a CORS-related context
177
- // Only report if it's actually in a CORS configuration (app.use(cors(...)), etc.)
178
- // Not just any object with origin: "*"
179
- let isActualCorsContext = false;
180
-
181
- // Check if it's in app.use(cors(...)) or similar
182
- current = node;
183
- while (current && current.parent) {
184
- current = current.parent as TSESTree.Node;
185
- if (current.type === 'CallExpression') {
186
- const callText = sourceCode.getText(current);
187
- // Check if it's a CORS middleware call
188
- if (/\b(use|cors)\s*\(/i.test(callText) && /\bcors\s*\(/i.test(callText)) {
189
- isActualCorsContext = true;
190
- break;
191
- }
192
- }
193
- }
194
-
195
- // Also check if it's in an object property with name "origin" or "allowedOrigins"
196
- // but only if it's in a CORS-related call expression
197
- if (node.parent && node.parent.type === 'Property') {
198
- const prop = node.parent as TSESTree.Property;
199
- if (prop.key.type === 'Identifier') {
200
- const keyName = prop.key.name.toLowerCase();
201
- if (keyName === 'origin' || keyName === 'allowedorigins') {
202
- // Check if this property is in a CORS call context
203
- let inCorsCall = false;
204
- let checkNode: TSESTree.Node | null = prop;
205
- while (checkNode && checkNode.parent) {
206
- checkNode = checkNode.parent as TSESTree.Node;
207
- if (checkNode.type === 'CallExpression') {
208
- const callText = sourceCode.getText(checkNode);
209
- if (/\bcors\s*\(/i.test(callText) ||
210
- (/\buse\s*\(/i.test(callText) && /\bcors/i.test(callText))) {
211
- inCorsCall = true;
212
- break;
213
- }
214
- }
215
- }
216
-
217
- if (inCorsCall) {
218
- // Always report wildcard CORS origin - it's never safe
219
- context.report({
220
- node,
221
- messageId: 'missingCorsCheck',
222
- data: {
223
- issue: 'Wildcard CORS origin (*) allows all origins',
224
- safeAlternative: 'Use origin validation: app.use(cors({ origin: (origin, callback) => { if (allowedOrigins.includes(origin)) callback(null, true); else callback(new Error("Not allowed")); } } }));',
225
- },
226
- suggest: [
227
- {
228
- messageId: 'useOriginValidation',
229
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
230
- fix: (_fixer: TSESLint.RuleFixer) => null,
231
- },
232
- ],
233
- });
234
- return;
235
- }
236
- }
237
- }
238
- }
239
-
240
- // Only report if it's in an actual CORS context
241
- if (isActualCorsContext) {
242
- // Always report wildcard CORS origin - it's never safe
243
- context.report({
244
- node,
245
- messageId: 'missingCorsCheck',
246
- data: {
247
- issue: 'Wildcard CORS origin (*) allows all origins',
248
- safeAlternative: 'Use origin validation: app.use(cors({ origin: (origin, callback) => { if (allowedOrigins.includes(origin)) callback(null, true); else callback(new Error("Not allowed")); } } }));',
249
- },
250
- suggest: [
251
- {
252
- messageId: 'useOriginValidation',
253
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
254
- fix: (_fixer: TSESLint.RuleFixer) => null,
255
- },
256
- ],
257
- });
258
- }
259
- }
260
- }
261
-
262
- function checkCallExpression(node: TSESTree.CallExpression) {
263
- if (isTestFile) {
264
- return;
265
- }
266
-
267
- // Check for app.use(cors({ origin: "*" })) or similar
268
- if (node.callee.type === 'MemberExpression') {
269
- const property = node.callee.property;
270
- if (property.type === 'Identifier' && property.name === 'use') {
271
- // Check if CORS is being used
272
- const text = sourceCode.getText(node);
273
-
274
- // Check if it matches any ignore pattern
275
- if (matchesIgnorePattern(text, ignorePatterns)) {
276
- return;
277
- }
278
-
279
- // Check if it's a CORS middleware call
280
- // Check for cors() or trusted library calls
281
- const firstArg = node.arguments.length > 0 ? node.arguments[0] : null;
282
- let isCorsCall = /\bcors\s*\(/i.test(text);
283
- if (!isCorsCall && firstArg && firstArg.type === 'CallExpression' && firstArg.callee.type === 'Identifier') {
284
- const callee = firstArg.callee;
285
- const calleeName = callee.name.toLowerCase();
286
- // Check if it's the standard 'cors' library or a trusted library
287
- isCorsCall = calleeName === 'cors' || trustedLibraries.some(lib => {
288
- return calleeName.includes(lib.toLowerCase());
289
- });
290
- }
291
-
292
- // Check if it's a trusted library - skip if explicitly trusted
293
- let isTrustedLibrary = false;
294
- if (firstArg && firstArg.type === 'CallExpression' && firstArg.callee.type === 'Identifier') {
295
- const calleeName = firstArg.callee.name.toLowerCase();
296
- isTrustedLibrary = trustedLibraries.some(lib => calleeName.includes(lib.toLowerCase()));
297
- }
298
-
299
- if (isTrustedLibrary) {
300
- return; // Trusted library, skip
301
- }
302
-
303
- // Check if it's a CORS call
304
- if (/\bcors\s*\(/i.test(text) || isCorsCall) {
305
- // Check arguments for wildcard origin
306
- // For app.use(cors({ origin: "*" })), we need to check the arguments to cors(), not app.use()
307
- const corsCallArg = firstArg && firstArg.type === 'CallExpression' ? firstArg : null;
308
- const argsToCheck = corsCallArg ? corsCallArg.arguments : node.arguments;
309
-
310
- for (const arg of argsToCheck) {
311
- if (arg.type === 'ObjectExpression') {
312
- // Check for origin property with wildcard value
313
- for (const prop of arg.properties) {
314
- if (prop.type === 'Property' &&
315
- prop.key.type === 'Identifier' &&
316
- prop.key.name === 'origin' &&
317
- prop.value.type === 'Literal' &&
318
- prop.value.value === '*') {
319
- context.report({
320
- node: prop.value,
321
- messageId: 'missingCorsCheck',
322
- data: {
323
- issue: 'Wildcard CORS origin (*) allows all origins',
324
- safeAlternative: 'Use origin validation: app.use(cors({ origin: (origin, callback) => { if (allowedOrigins.includes(origin)) callback(null, true); else callback(new Error("Not allowed")); } } }));',
325
- },
326
- suggest: [
327
- {
328
- messageId: 'useOriginValidation',
329
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
330
- fix: (_fixer: TSESLint.RuleFixer) => null,
331
- },
332
- ],
333
- });
334
- }
335
- }
336
- } else if (arg.type === 'Identifier') {
337
- // Check if this identifier was assigned an object literal with origin: "*"
338
- // For cases like: const config = { origin: "*" }; app.use(cors(config));
339
- const varName = arg.name;
340
- // Traverse the AST to find the variable declaration
341
- let current: TSESTree.Node | null = node;
342
- while (current) {
343
- if (current.type === 'Program' || current.type === 'FunctionDeclaration' || current.type === 'FunctionExpression' || current.type === 'ArrowFunctionExpression') {
344
- // Search for variable declarations in this scope
345
- const scopeBody = current.type === 'Program' ? current.body :
346
- (current.type === 'FunctionDeclaration' || current.type === 'FunctionExpression' || current.type === 'ArrowFunctionExpression') ?
347
- (current.body.type === 'BlockStatement' ? current.body.body : []) : [];
348
-
349
- for (const stmt of scopeBody) {
350
- if (stmt.type === 'VariableDeclaration') {
351
- for (const declarator of stmt.declarations) {
352
- if (declarator.id.type === 'Identifier' && declarator.id.name === varName && declarator.init) {
353
- // Check if init is an object literal with origin: "*"
354
- if (declarator.init.type === 'ObjectExpression') {
355
- for (const prop of declarator.init.properties) {
356
- if (prop.type === 'Property' &&
357
- prop.key.type === 'Identifier' &&
358
- prop.key.name === 'origin' &&
359
- prop.value.type === 'Literal' &&
360
- prop.value.value === '*') {
361
- context.report({
362
- node: arg,
363
- messageId: 'missingCorsCheck',
364
- data: {
365
- issue: 'Wildcard CORS origin (*) allows all origins',
366
- safeAlternative: 'Use origin validation: app.use(cors({ origin: (origin, callback) => { if (allowedOrigins.includes(origin)) callback(null, true); else callback(new Error("Not allowed")); } } }));',
367
- },
368
- suggest: [
369
- {
370
- messageId: 'useOriginValidation',
371
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
372
- fix: (_fixer: TSESLint.RuleFixer) => null,
373
- },
374
- ],
375
- });
376
- return; // Found and reported, exit
377
- }
378
- }
379
- }
380
- }
381
- }
382
- }
383
- }
384
- break; // Only check the immediate scope
385
- }
386
- if (current.parent) {
387
- current = current.parent as TSESTree.Node;
388
- } else {
389
- break;
390
- }
391
- }
392
- }
393
- }
394
- }
395
- }
396
- }
397
- }
398
-
399
- function checkMemberExpression(node: TSESTree.MemberExpression) {
400
- if (isTestFile) {
401
- return;
402
- }
403
-
404
- // Check for Access-Control-Allow-Origin header without validation
405
- if (node.property.type === 'Identifier') {
406
- const propertyName = node.property.name;
407
-
408
- if (propertyName === 'setHeader' || propertyName === 'header') {
409
- // Check if it matches any ignore pattern
410
- const text = sourceCode.getText(node);
411
- if (matchesIgnorePattern(text, ignorePatterns)) {
412
- return;
413
- }
414
-
415
- // Check if it's setting CORS headers
416
- // Need to check the full call expression, not just the member expression
417
- const parent = node.parent;
418
- if (parent && parent.type === 'CallExpression') {
419
- const callText = sourceCode.getText(parent);
420
- if (/\bAccess-Control-Allow-Origin\b/i.test(callText)) {
421
- // Check if the value is a wildcard
422
- const args = parent.arguments;
423
- if (args.length >= 2 && args[1].type === 'Literal' && args[1].value === '*') {
424
- context.report({
425
- node: args[1],
426
- messageId: 'missingCorsCheck',
427
- data: {
428
- issue: 'Wildcard CORS header allows all origins',
429
- safeAlternative: 'Validate origin before setting header: res.setHeader("Access-Control-Allow-Origin", allowedOrigins.includes(origin) ? origin : "null");',
430
- },
431
- suggest: [
432
- {
433
- messageId: 'useOriginValidation',
434
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
435
- fix: (_fixer: TSESLint.RuleFixer) => null,
436
- },
437
- ],
438
- });
439
- }
440
- }
441
- }
442
- }
443
- }
444
- }
445
-
446
- return {
447
- Literal: checkLiteral,
448
- CallExpression: checkCallExpression,
449
- MemberExpression: checkMemberExpression,
450
- };
451
- },
452
- });
453
-