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,218 +0,0 @@
1
- /**
2
- * Comprehensive tests for no-insecure-comparison rule
3
- * CWE-697: Incorrect Comparison
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 { noInsecureComparison } 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
- parserOptions: {
23
- ecmaFeatures: {
24
- jsx: true,
25
- },
26
- },
27
- },
28
- });
29
-
30
- describe('no-insecure-comparison', () => {
31
- describe('Valid Code', () => {
32
- ruleTester.run('valid - strict equality operators', noInsecureComparison, {
33
- valid: [
34
- {
35
- code: 'if (x === y) {}',
36
- },
37
- {
38
- code: 'if (x !== y) {}',
39
- },
40
- {
41
- code: 'const result = a === b ? 1 : 0;',
42
- },
43
- {
44
- code: 'if (value !== null && value !== undefined) {}',
45
- },
46
- {
47
- code: 'if (user.id === userId) {}',
48
- },
49
- // Test files (when allowInTests is true)
50
- {
51
- code: 'if (x == y) {}',
52
- filename: 'test.spec.ts',
53
- options: [{ allowInTests: true }],
54
- },
55
- // Ignored patterns
56
- {
57
- code: 'if (x == y) {}',
58
- options: [{ ignorePatterns: ['x == y'] }],
59
- },
60
- ],
61
- invalid: [],
62
- });
63
- });
64
-
65
- describe('Invalid Code - Loose Equality', () => {
66
- ruleTester.run('invalid - loose equality operator', noInsecureComparison, {
67
- valid: [],
68
- invalid: [
69
- {
70
- code: 'if (x == y) {}',
71
- errors: [
72
- {
73
- messageId: 'insecureComparison',
74
- suggestions: [
75
- {
76
- messageId: 'useStrictEquality',
77
- output: 'if (x === y) {}',
78
- },
79
- ],
80
- },
81
- ],
82
- output: 'if (x === y) {}',
83
- },
84
- {
85
- code: 'if (user.id == userId) {}',
86
- errors: [
87
- {
88
- messageId: 'insecureComparison',
89
- suggestions: [
90
- {
91
- messageId: 'useStrictEquality',
92
- output: 'if (user.id === userId) {}',
93
- },
94
- ],
95
- },
96
- ],
97
- output: 'if (user.id === userId) {}',
98
- },
99
- {
100
- code: 'const result = a == b ? 1 : 0;',
101
- errors: [
102
- {
103
- messageId: 'insecureComparison',
104
- suggestions: [
105
- {
106
- messageId: 'useStrictEquality',
107
- output: 'const result = a === b ? 1 : 0;',
108
- },
109
- ],
110
- },
111
- ],
112
- output: 'const result = a === b ? 1 : 0;',
113
- },
114
- ],
115
- });
116
- });
117
-
118
- describe('Invalid Code - Loose Inequality', () => {
119
- ruleTester.run('invalid - loose inequality operator', noInsecureComparison, {
120
- valid: [],
121
- invalid: [
122
- {
123
- code: 'if (x != y) {}',
124
- errors: [
125
- {
126
- messageId: 'insecureComparison',
127
- suggestions: [
128
- {
129
- messageId: 'useStrictEquality',
130
- output: 'if (x !== y) {}',
131
- },
132
- ],
133
- },
134
- ],
135
- output: 'if (x !== y) {}',
136
- },
137
- {
138
- code: 'if (value != null) {}',
139
- errors: [
140
- {
141
- messageId: 'insecureComparison',
142
- suggestions: [
143
- {
144
- messageId: 'useStrictEquality',
145
- output: 'if (value !== null) {}',
146
- },
147
- ],
148
- },
149
- ],
150
- output: 'if (value !== null) {}',
151
- },
152
- ],
153
- });
154
- });
155
-
156
- describe('Options', () => {
157
- ruleTester.run('options - allowInTests', noInsecureComparison, {
158
- valid: [
159
- {
160
- code: 'if (x == y) {}',
161
- filename: 'test.spec.ts',
162
- options: [{ allowInTests: true }],
163
- },
164
- ],
165
- invalid: [
166
- {
167
- code: 'if (x == y) {}',
168
- filename: 'server.ts',
169
- options: [{ allowInTests: true }],
170
- errors: [
171
- {
172
- messageId: 'insecureComparison',
173
- suggestions: [
174
- {
175
- messageId: 'useStrictEquality',
176
- output: 'if (x === y) {}',
177
- },
178
- ],
179
- },
180
- ],
181
- output: 'if (x === y) {}',
182
- },
183
- ],
184
- });
185
-
186
- ruleTester.run('options - ignorePatterns', noInsecureComparison, {
187
- valid: [
188
- {
189
- code: 'if (x == y) {}',
190
- options: [{ ignorePatterns: ['x == y'] }],
191
- },
192
- {
193
- code: 'if (a != b) {}',
194
- options: [{ ignorePatterns: ['a != b'] }],
195
- },
196
- ],
197
- invalid: [
198
- {
199
- code: 'if (x == y) {}',
200
- options: [{ ignorePatterns: ['other'] }],
201
- errors: [
202
- {
203
- messageId: 'insecureComparison',
204
- suggestions: [
205
- {
206
- messageId: 'useStrictEquality',
207
- output: 'if (x === y) {}',
208
- },
209
- ],
210
- },
211
- ],
212
- output: 'if (x === y) {}',
213
- },
214
- ],
215
- });
216
- });
217
- });
218
-
@@ -1,391 +0,0 @@
1
- /**
2
- * ESLint Rule: no-insecure-cookie-settings
3
- * Detects insecure cookie configurations (missing httpOnly, secure, sameSite flags)
4
- * CWE-614: Sensitive Cookie in HTTPS Session Without 'Secure' Attribute
5
- *
6
- * @see https://cwe.mitre.org/data/definitions/614.html
7
- * @see https://owasp.org/www-community/HttpOnly
8
- */
9
- import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
10
- import { formatLLMMessage, MessageIcons, createRule } from '@interlace/eslint-devkit';
11
-
12
- type MessageIds = 'insecureCookieSettings' | 'addSecureFlags';
13
-
14
- export interface Options {
15
- /** Allow insecure cookies in test files. Default: false */
16
- allowInTests?: boolean;
17
-
18
- /** Cookie library patterns to recognize. Default: ['cookie', 'js-cookie', 'universal-cookie'] */
19
- cookieLibraries?: string[];
20
-
21
- /** Additional safe patterns to ignore. Default: [] */
22
- ignorePatterns?: string[];
23
- }
24
-
25
- type RuleOptions = [Options?];
26
-
27
- /**
28
- * Check if a node is inside a cookie configuration
29
- */
30
- function isInsideCookieConfig(
31
- node: TSESTree.Node,
32
- sourceCode: TSESLint.SourceCode
33
- ): boolean {
34
- let current: TSESTree.Node | null = node;
35
-
36
- // Traverse up the parent chain
37
- while (current && 'parent' in current && current.parent) {
38
- current = current.parent as TSESTree.Node;
39
-
40
- // Check for cookie-related method calls
41
- if (current.type === 'CallExpression') {
42
- const callExpr = current as TSESTree.CallExpression;
43
-
44
- // Check for res.cookie() calls
45
- if (callExpr.callee.type === 'MemberExpression') {
46
- const memberExpr = callExpr.callee;
47
- if (memberExpr.property.type === 'Identifier' && memberExpr.property.name === 'cookie') {
48
- // Check if the node is an argument of this call
49
- if (callExpr.arguments.some((arg: TSESTree.Node) => arg === node || (arg.type === 'ObjectExpression' && sourceCode.getText(arg).includes(sourceCode.getText(node))))) {
50
- return true;
51
- }
52
- }
53
- }
54
-
55
- // Check for other cookie-related calls using text matching
56
- const callText = sourceCode.getText(current);
57
- if (/\b(cookie|cookies|setCookie|res\.cookie|document\.cookie)\b/i.test(callText)) {
58
- const callee = callExpr.callee;
59
- // Specific check for cookies.set / cookie.set
60
- if (callee.type === 'MemberExpression' &&
61
- callee.property.type === 'Identifier' &&
62
- callee.property.name === 'set') {
63
- return true;
64
- }
65
-
66
- // Check if node is part of this call
67
- const nodeText = sourceCode.getText(node);
68
- if (callText.includes(nodeText)) {
69
- return true;
70
- }
71
- }
72
- }
73
- }
74
-
75
- return false;
76
- }
77
-
78
- /**
79
- * Check if an object expression has secure cookie settings
80
- */
81
- function hasSecureCookieSettings(
82
- node: TSESTree.ObjectExpression,
83
- sourceCode: TSESLint.SourceCode
84
- ): { hasHttpOnly: boolean; hasSecure: boolean; hasSameSite: boolean } {
85
- const text = sourceCode.getText(node);
86
-
87
- // Check for httpOnly flag (case-insensitive)
88
- const hasHttpOnly = /\bhttpOnly\s*:\s*(true|'true'|"true")/i.test(text);
89
-
90
- // Check for secure flag (case-insensitive)
91
- const hasSecure = /\bsecure\s*:\s*(true|'true'|"true")/i.test(text);
92
-
93
- // Check for sameSite flag (should be 'strict', 'lax', or 'none')
94
- const hasSameSite = /\bsameSite\s*:\s*['"](strict|lax|none)['"]/i.test(text);
95
-
96
- return { hasHttpOnly, hasSecure, hasSameSite };
97
- }
98
-
99
- /**
100
- * Check if a string matches any ignore pattern
101
- */
102
- function matchesIgnorePattern(text: string, ignorePatterns: string[]): boolean {
103
- return ignorePatterns.some(pattern => {
104
- try {
105
- const regex = new RegExp(pattern, 'i');
106
- return regex.test(text);
107
- } catch {
108
- return false;
109
- }
110
- });
111
- }
112
-
113
- export const noInsecureCookieSettings = createRule<RuleOptions, MessageIds>({
114
- name: 'no-insecure-cookie-settings',
115
- meta: {
116
- type: 'problem',
117
- deprecated: true,
118
- replacedBy: ['@see eslint-plugin-express-security/no-insecure-cookie-options'],
119
- docs: {
120
- description: 'Detects insecure cookie configurations (missing httpOnly, secure, sameSite flags)',
121
- },
122
- hasSuggestions: true,
123
- messages: {
124
- insecureCookieSettings: formatLLMMessage({
125
- icon: MessageIcons.SECURITY,
126
- issueName: 'Insecure Cookie Configuration',
127
- cwe: 'CWE-614',
128
- description: 'Insecure cookie settings detected: {{issue}}',
129
- severity: 'HIGH',
130
- fix: '{{safeAlternative}}',
131
- documentationLink: 'https://cwe.mitre.org/data/definitions/614.html',
132
- }),
133
- addSecureFlags: formatLLMMessage({
134
- icon: MessageIcons.INFO,
135
- issueName: 'Add Secure Flags',
136
- description: 'Set secure cookie flags',
137
- severity: 'LOW',
138
- fix: '{ httpOnly: true, secure: true, sameSite: "strict" }',
139
- documentationLink: 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#security',
140
- }),
141
- },
142
- schema: [
143
- {
144
- type: 'object',
145
- properties: {
146
- allowInTests: {
147
- type: 'boolean',
148
- default: false,
149
- description: 'Allow insecure cookies in test files',
150
- },
151
- cookieLibraries: {
152
- type: 'array',
153
- items: { type: 'string' },
154
- default: [],
155
- description: 'Cookie library patterns to recognize',
156
- },
157
- ignorePatterns: {
158
- type: 'array',
159
- items: { type: 'string' },
160
- default: [],
161
- description: 'Additional safe patterns to ignore',
162
- },
163
- },
164
- additionalProperties: false,
165
- },
166
- ],
167
- },
168
- defaultOptions: [
169
- {
170
- allowInTests: false,
171
- cookieLibraries: [],
172
- ignorePatterns: [],
173
- },
174
- ],
175
- create(
176
- context: TSESLint.RuleContext<MessageIds, RuleOptions>,
177
- [options = {}]
178
- ) {
179
- const {
180
- allowInTests = false,
181
- ignorePatterns = [],
182
- } = options as Options;
183
-
184
- const filename = context.getFilename();
185
- const isTestFile = allowInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
186
- const sourceCode = context.sourceCode || context.sourceCode;
187
-
188
- function checkObjectExpression(node: TSESTree.ObjectExpression) {
189
- if (isTestFile) {
190
- return;
191
- }
192
-
193
- // Check if this ObjectExpression is the third argument of a cookie call
194
- // First, check if parent is directly a CallExpression
195
- if (node.parent && node.parent.type === 'CallExpression') {
196
- const parentCall = node.parent as TSESTree.CallExpression;
197
- const callee = parentCall.callee;
198
-
199
- // Check if it's a cookie call
200
- if (
201
- callee.type === 'MemberExpression' &&
202
- callee.property.type === 'Identifier' &&
203
- callee.property.name === 'cookie'
204
- ) {
205
- // Check if this node is the third argument (index 2)
206
- // Use both reference check and range check for reliability
207
- const thirdArg = parentCall.arguments.length >= 3 ? parentCall.arguments[2] : null;
208
- const isThirdArg = thirdArg && (
209
- thirdArg === node ||
210
- (thirdArg.type === 'ObjectExpression' &&
211
- thirdArg.range[0] === node.range[0] &&
212
- thirdArg.range[1] === node.range[1])
213
- );
214
-
215
- if (isThirdArg) {
216
- // Check if the parent call is ignored
217
- const callText = sourceCode.getText(parentCall);
218
- if (matchesIgnorePattern(callText, ignorePatterns)) {
219
- return;
220
- }
221
- }
222
- }
223
- }
224
-
225
- // If not handled above, check if it's inside a cookie config using helper
226
- if (!isInsideCookieConfig(node, sourceCode)) {
227
- return;
228
- }
229
-
230
- // If it's inside a cookie config, check it
231
- const text = sourceCode.getText(node);
232
-
233
- // Check if it matches any ignore pattern
234
- if (matchesIgnorePattern(text, ignorePatterns)) {
235
- return;
236
- }
237
-
238
- const { hasHttpOnly, hasSecure, hasSameSite } = hasSecureCookieSettings(node, sourceCode);
239
-
240
- const issues: string[] = [];
241
- if (!hasHttpOnly) {
242
- issues.push('missing httpOnly flag');
243
- }
244
- if (!hasSecure) {
245
- issues.push('missing secure flag');
246
- }
247
- if (!hasSameSite) {
248
- issues.push('missing sameSite flag');
249
- }
250
-
251
- if (issues.length > 0) {
252
- const issueDescription = issues.join(', ');
253
- const safeAlternative = 'Set httpOnly: true, secure: true, sameSite: "strict"';
254
-
255
- context.report({
256
- node,
257
- messageId: 'insecureCookieSettings',
258
- data: {
259
- issue: issueDescription,
260
- safeAlternative,
261
- },
262
- suggest: [
263
- {
264
- messageId: 'addSecureFlags',
265
- fix(fixer: TSESLint.RuleFixer) {
266
- // Find the last property in the object
267
- const properties = node.properties;
268
- if (properties.length === 0) {
269
- // Empty object - add all flags
270
- return fixer.replaceText(node, '{ httpOnly: true, secure: true, sameSite: "strict" }');
271
- }
272
-
273
- const lastProperty = properties[properties.length - 1];
274
- const lastPropertyText = sourceCode.getText(lastProperty);
275
- const needsComma = !lastPropertyText.trim().endsWith(',');
276
- const insertPosition = lastProperty.range[1];
277
-
278
- const missingFlags: string[] = [];
279
- if (!hasHttpOnly) missingFlags.push('httpOnly: true');
280
- if (!hasSecure) missingFlags.push('secure: true');
281
- if (!hasSameSite) missingFlags.push('sameSite: "strict"');
282
-
283
- const prefix = needsComma ? ',' : '';
284
- const insertion = prefix + '\n ' + missingFlags.join(',\n ');
285
-
286
- return fixer.insertTextAfterRange(
287
- [insertPosition, insertPosition],
288
- insertion
289
- );
290
- },
291
- },
292
- ],
293
- });
294
- }
295
- }
296
-
297
- function checkCallExpression(node: TSESTree.CallExpression) {
298
- if (isTestFile) {
299
- return;
300
- }
301
-
302
- const callee = node.callee;
303
- const callText = sourceCode.getText(node);
304
-
305
- // Check if it matches any ignore pattern
306
- if (matchesIgnorePattern(callText, ignorePatterns)) {
307
- return;
308
- }
309
-
310
- // Check for res.cookie() calls or cookies.set() calls
311
- const isResCookie =
312
- callee.type === 'MemberExpression' &&
313
- callee.property.type === 'Identifier' &&
314
- callee.property.name === 'cookie';
315
-
316
- const isUniversalCookie =
317
- callee.type === 'MemberExpression' &&
318
- callee.property.type === 'Identifier' &&
319
- callee.property.name === 'set' &&
320
- callee.object.type === 'Identifier' &&
321
- (callee.object.name === 'cookies' || callee.object.name === 'cookie');
322
-
323
- if (isResCookie || isUniversalCookie) {
324
- // Check if third argument (options) is provided
325
- if (node.arguments.length < 3) {
326
- context.report({
327
- node,
328
- messageId: 'insecureCookieSettings',
329
- data: {
330
- issue: 'missing cookie options with httpOnly, secure, and sameSite flags',
331
- safeAlternative: 'Add options object: res.cookie(name, value, { httpOnly: true, secure: true, sameSite: "strict" })',
332
- },
333
- suggest: [
334
- {
335
- messageId: 'addSecureFlags',
336
- fix(fixer: TSESLint.RuleFixer) {
337
- // Add options as third argument
338
- const lastArg = node.arguments[node.arguments.length - 1];
339
- const insertPosition = lastArg.range[1];
340
- return fixer.insertTextAfterRange(
341
- [insertPosition, insertPosition],
342
- `, { httpOnly: true, secure: true, sameSite: "strict" }`
343
- );
344
- },
345
- },
346
- ],
347
- });
348
- return;
349
- }
350
- }
351
- }
352
-
353
- function checkAssignmentExpression(node: TSESTree.AssignmentExpression) {
354
- if (isTestFile) {
355
- return;
356
- }
357
-
358
- // Check for document.cookie assignments
359
- if (
360
- node.left.type === 'MemberExpression' &&
361
- node.left.object.type === 'Identifier' &&
362
- node.left.object.name === 'document' &&
363
- node.left.property.type === 'Identifier' &&
364
- node.left.property.name === 'cookie'
365
- ) {
366
- const text = sourceCode.getText(node);
367
-
368
- // Check if it matches any ignore pattern
369
- if (matchesIgnorePattern(text, ignorePatterns)) {
370
- return;
371
- }
372
-
373
- context.report({
374
- node,
375
- messageId: 'insecureCookieSettings',
376
- data: {
377
- issue: 'using document.cookie directly (cannot set httpOnly flag)',
378
- safeAlternative: 'Use server-side cookie setting with httpOnly: true, secure: true, sameSite: "strict"',
379
- },
380
- });
381
- }
382
- }
383
-
384
- return {
385
- ObjectExpression: checkObjectExpression,
386
- CallExpression: checkCallExpression,
387
- AssignmentExpression: checkAssignmentExpression,
388
- };
389
- },
390
- });
391
-