eslint-plugin-secure-coding 2.3.2 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +1 -0
  2. package/package.json +3 -10
  3. package/src/index.ts +605 -0
  4. package/src/rules/__tests__/integration-demo.test.ts +290 -0
  5. package/src/rules/__tests__/integration-llm.test.ts +89 -0
  6. package/src/rules/database-injection/database-injection.test.ts +456 -0
  7. package/src/rules/database-injection/index.ts +488 -0
  8. package/src/rules/detect-child-process/detect-child-process.test.ts +207 -0
  9. package/src/rules/detect-child-process/index.ts +634 -0
  10. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +416 -0
  11. package/src/rules/detect-eval-with-expression/index.ts +463 -0
  12. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +28 -0
  13. package/src/rules/detect-mixed-content/index.ts +52 -0
  14. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +269 -0
  15. package/src/rules/detect-non-literal-fs-filename/index.ts +551 -0
  16. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +189 -0
  17. package/src/rules/detect-non-literal-regexp/index.ts +490 -0
  18. package/src/rules/detect-object-injection/detect-object-injection.test.ts +440 -0
  19. package/src/rules/detect-object-injection/index.ts +674 -0
  20. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +32 -0
  21. package/src/rules/detect-suspicious-dependencies/index.ts +84 -0
  22. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +31 -0
  23. package/src/rules/detect-weak-password-validation/index.ts +68 -0
  24. package/src/rules/no-allow-arbitrary-loads/index.ts +54 -0
  25. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +28 -0
  26. package/src/rules/no-arbitrary-file-access/index.ts +238 -0
  27. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +119 -0
  28. package/src/rules/no-buffer-overread/index.ts +724 -0
  29. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +313 -0
  30. package/src/rules/no-clickjacking/index.ts +481 -0
  31. package/src/rules/no-clickjacking/no-clickjacking.test.ts +253 -0
  32. package/src/rules/no-client-side-auth-logic/index.ts +81 -0
  33. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +33 -0
  34. package/src/rules/no-credentials-in-query-params/index.ts +69 -0
  35. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +33 -0
  36. package/src/rules/no-credentials-in-storage-api/index.ts +64 -0
  37. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +31 -0
  38. package/src/rules/no-data-in-temp-storage/index.ts +75 -0
  39. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +33 -0
  40. package/src/rules/no-debug-code-in-production/index.ts +59 -0
  41. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +26 -0
  42. package/src/rules/no-directive-injection/index.ts +551 -0
  43. package/src/rules/no-directive-injection/no-directive-injection.test.ts +305 -0
  44. package/src/rules/no-disabled-certificate-validation/index.ts +72 -0
  45. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +33 -0
  46. package/src/rules/no-document-cookie/index.ts +113 -0
  47. package/src/rules/no-document-cookie/no-document-cookie.test.ts +382 -0
  48. package/src/rules/no-dynamic-dependency-loading/index.ts +60 -0
  49. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +27 -0
  50. package/src/rules/no-electron-security-issues/index.ts +504 -0
  51. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +324 -0
  52. package/src/rules/no-exposed-debug-endpoints/index.ts +73 -0
  53. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +40 -0
  54. package/src/rules/no-exposed-sensitive-data/index.ts +428 -0
  55. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +75 -0
  56. package/src/rules/no-format-string-injection/index.ts +801 -0
  57. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +437 -0
  58. package/src/rules/no-graphql-injection/index.ts +508 -0
  59. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +371 -0
  60. package/src/rules/no-hardcoded-credentials/index.ts +478 -0
  61. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +639 -0
  62. package/src/rules/no-hardcoded-session-tokens/index.ts +69 -0
  63. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +42 -0
  64. package/src/rules/no-http-urls/index.ts +131 -0
  65. package/src/rules/no-http-urls/no-http-urls.test.ts +60 -0
  66. package/src/rules/no-improper-sanitization/index.ts +502 -0
  67. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +156 -0
  68. package/src/rules/no-improper-type-validation/index.ts +572 -0
  69. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +372 -0
  70. package/src/rules/no-insecure-comparison/index.ts +232 -0
  71. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +218 -0
  72. package/src/rules/no-insecure-cookie-settings/index.ts +391 -0
  73. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +409 -0
  74. package/src/rules/no-insecure-jwt/index.ts +467 -0
  75. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +259 -0
  76. package/src/rules/no-insecure-redirects/index.ts +267 -0
  77. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +108 -0
  78. package/src/rules/no-insecure-websocket/index.ts +72 -0
  79. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +42 -0
  80. package/src/rules/no-insufficient-postmessage-validation/index.ts +497 -0
  81. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +360 -0
  82. package/src/rules/no-insufficient-random/index.ts +288 -0
  83. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +246 -0
  84. package/src/rules/no-ldap-injection/index.ts +547 -0
  85. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +317 -0
  86. package/src/rules/no-missing-authentication/index.ts +408 -0
  87. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +350 -0
  88. package/src/rules/no-missing-cors-check/index.ts +453 -0
  89. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +392 -0
  90. package/src/rules/no-missing-csrf-protection/index.ts +229 -0
  91. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +222 -0
  92. package/src/rules/no-missing-security-headers/index.ts +266 -0
  93. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +98 -0
  94. package/src/rules/no-password-in-url/index.ts +64 -0
  95. package/src/rules/no-password-in-url/no-password-in-url.test.ts +27 -0
  96. package/src/rules/no-permissive-cors/index.ts +78 -0
  97. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +28 -0
  98. package/src/rules/no-pii-in-logs/index.ts +83 -0
  99. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +26 -0
  100. package/src/rules/no-postmessage-origin-wildcard/index.ts +67 -0
  101. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +27 -0
  102. package/src/rules/no-privilege-escalation/index.ts +403 -0
  103. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +306 -0
  104. package/src/rules/no-redos-vulnerable-regex/index.ts +379 -0
  105. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +83 -0
  106. package/src/rules/no-sensitive-data-exposure/index.ts +294 -0
  107. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +262 -0
  108. package/src/rules/no-sensitive-data-in-analytics/index.ts +73 -0
  109. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +42 -0
  110. package/src/rules/no-sensitive-data-in-cache/index.ts +59 -0
  111. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +32 -0
  112. package/src/rules/no-sql-injection/index.ts +424 -0
  113. package/src/rules/no-sql-injection/no-sql-injection.test.ts +303 -0
  114. package/src/rules/no-timing-attack/index.ts +552 -0
  115. package/src/rules/no-timing-attack/no-timing-attack.test.ts +348 -0
  116. package/src/rules/no-toctou-vulnerability/index.ts +250 -0
  117. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +60 -0
  118. package/src/rules/no-tracking-without-consent/index.ts +78 -0
  119. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +34 -0
  120. package/src/rules/no-unchecked-loop-condition/index.ts +781 -0
  121. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +459 -0
  122. package/src/rules/no-unencrypted-local-storage/index.ts +73 -0
  123. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +41 -0
  124. package/src/rules/no-unencrypted-transmission/index.ts +296 -0
  125. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +287 -0
  126. package/src/rules/no-unescaped-url-parameter/index.ts +424 -0
  127. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +263 -0
  128. package/src/rules/no-unlimited-resource-allocation/index.ts +767 -0
  129. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +544 -0
  130. package/src/rules/no-unsafe-deserialization/index.ts +593 -0
  131. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +310 -0
  132. package/src/rules/no-unsafe-dynamic-require/index.ts +125 -0
  133. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +151 -0
  134. package/src/rules/no-unsafe-regex-construction/index.ts +370 -0
  135. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +181 -0
  136. package/src/rules/no-unsanitized-html/index.ts +400 -0
  137. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +488 -0
  138. package/src/rules/no-unvalidated-deeplinks/index.ts +73 -0
  139. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +29 -0
  140. package/src/rules/no-unvalidated-user-input/index.ts +498 -0
  141. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +463 -0
  142. package/src/rules/no-verbose-error-messages/index.ts +83 -0
  143. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +34 -0
  144. package/src/rules/no-weak-crypto/index.ts +447 -0
  145. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +297 -0
  146. package/src/rules/no-weak-password-recovery/index.ts +509 -0
  147. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +184 -0
  148. package/src/rules/no-xpath-injection/index.ts +596 -0
  149. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +405 -0
  150. package/src/rules/no-xxe-injection/index.ts +342 -0
  151. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +122 -0
  152. package/src/rules/no-zip-slip/index.ts +526 -0
  153. package/src/rules/no-zip-slip/no-zip-slip.test.ts +305 -0
  154. package/src/rules/require-backend-authorization/index.ts +71 -0
  155. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +31 -0
  156. package/src/rules/require-code-minification/index.ts +54 -0
  157. package/src/rules/require-code-minification/require-code-minification.test.ts +30 -0
  158. package/src/rules/require-csp-headers/index.ts +74 -0
  159. package/src/rules/require-csp-headers/require-csp-headers.test.ts +34 -0
  160. package/src/rules/require-data-minimization/index.ts +65 -0
  161. package/src/rules/require-data-minimization/require-data-minimization.test.ts +31 -0
  162. package/src/rules/require-dependency-integrity/index.ts +78 -0
  163. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +44 -0
  164. package/src/rules/require-https-only/index.ts +75 -0
  165. package/src/rules/require-https-only/require-https-only.test.ts +26 -0
  166. package/src/rules/require-mime-type-validation/index.ts +77 -0
  167. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +32 -0
  168. package/src/rules/require-network-timeout/index.ts +58 -0
  169. package/src/rules/require-network-timeout/require-network-timeout.test.ts +26 -0
  170. package/src/rules/require-package-lock/index.ts +75 -0
  171. package/src/rules/require-package-lock/require-package-lock.test.ts +27 -0
  172. package/src/rules/require-secure-credential-storage/index.ts +60 -0
  173. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +26 -0
  174. package/src/rules/require-secure-defaults/index.ts +54 -0
  175. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +26 -0
  176. package/src/rules/require-secure-deletion/index.ts +52 -0
  177. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +29 -0
  178. package/src/rules/require-storage-encryption/index.ts +60 -0
  179. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +26 -0
  180. package/src/rules/require-url-validation/index.ts +85 -0
  181. package/src/rules/require-url-validation/require-url-validation.test.ts +32 -0
  182. package/src/types/{index.d.ts → index.ts} +157 -53
  183. package/src/index.d.ts +0 -32
  184. package/src/index.js +0 -465
  185. package/src/rules/database-injection/index.d.ts +0 -13
  186. package/src/rules/database-injection/index.js +0 -406
  187. package/src/rules/detect-child-process/index.d.ts +0 -11
  188. package/src/rules/detect-child-process/index.js +0 -529
  189. package/src/rules/detect-eval-with-expression/index.d.ts +0 -9
  190. package/src/rules/detect-eval-with-expression/index.js +0 -392
  191. package/src/rules/detect-mixed-content/index.d.ts +0 -8
  192. package/src/rules/detect-mixed-content/index.js +0 -44
  193. package/src/rules/detect-non-literal-fs-filename/index.d.ts +0 -7
  194. package/src/rules/detect-non-literal-fs-filename/index.js +0 -454
  195. package/src/rules/detect-non-literal-regexp/index.d.ts +0 -9
  196. package/src/rules/detect-non-literal-regexp/index.js +0 -403
  197. package/src/rules/detect-object-injection/index.d.ts +0 -11
  198. package/src/rules/detect-object-injection/index.js +0 -560
  199. package/src/rules/detect-suspicious-dependencies/index.d.ts +0 -8
  200. package/src/rules/detect-suspicious-dependencies/index.js +0 -71
  201. package/src/rules/detect-weak-password-validation/index.d.ts +0 -6
  202. package/src/rules/detect-weak-password-validation/index.js +0 -58
  203. package/src/rules/no-allow-arbitrary-loads/index.d.ts +0 -8
  204. package/src/rules/no-allow-arbitrary-loads/index.js +0 -47
  205. package/src/rules/no-arbitrary-file-access/index.d.ts +0 -13
  206. package/src/rules/no-arbitrary-file-access/index.js +0 -195
  207. package/src/rules/no-buffer-overread/index.d.ts +0 -29
  208. package/src/rules/no-buffer-overread/index.js +0 -606
  209. package/src/rules/no-clickjacking/index.d.ts +0 -10
  210. package/src/rules/no-clickjacking/index.js +0 -396
  211. package/src/rules/no-client-side-auth-logic/index.d.ts +0 -6
  212. package/src/rules/no-client-side-auth-logic/index.js +0 -69
  213. package/src/rules/no-credentials-in-query-params/index.d.ts +0 -8
  214. package/src/rules/no-credentials-in-query-params/index.js +0 -57
  215. package/src/rules/no-credentials-in-storage-api/index.d.ts +0 -6
  216. package/src/rules/no-credentials-in-storage-api/index.js +0 -54
  217. package/src/rules/no-data-in-temp-storage/index.d.ts +0 -6
  218. package/src/rules/no-data-in-temp-storage/index.js +0 -64
  219. package/src/rules/no-debug-code-in-production/index.d.ts +0 -8
  220. package/src/rules/no-debug-code-in-production/index.js +0 -51
  221. package/src/rules/no-directive-injection/index.d.ts +0 -12
  222. package/src/rules/no-directive-injection/index.js +0 -457
  223. package/src/rules/no-disabled-certificate-validation/index.d.ts +0 -6
  224. package/src/rules/no-disabled-certificate-validation/index.js +0 -61
  225. package/src/rules/no-document-cookie/index.d.ts +0 -5
  226. package/src/rules/no-document-cookie/index.js +0 -89
  227. package/src/rules/no-dynamic-dependency-loading/index.d.ts +0 -8
  228. package/src/rules/no-dynamic-dependency-loading/index.js +0 -51
  229. package/src/rules/no-electron-security-issues/index.d.ts +0 -10
  230. package/src/rules/no-electron-security-issues/index.js +0 -423
  231. package/src/rules/no-exposed-debug-endpoints/index.d.ts +0 -6
  232. package/src/rules/no-exposed-debug-endpoints/index.js +0 -62
  233. package/src/rules/no-exposed-sensitive-data/index.d.ts +0 -11
  234. package/src/rules/no-exposed-sensitive-data/index.js +0 -340
  235. package/src/rules/no-format-string-injection/index.d.ts +0 -17
  236. package/src/rules/no-format-string-injection/index.js +0 -660
  237. package/src/rules/no-graphql-injection/index.d.ts +0 -12
  238. package/src/rules/no-graphql-injection/index.js +0 -411
  239. package/src/rules/no-hardcoded-credentials/index.d.ts +0 -26
  240. package/src/rules/no-hardcoded-credentials/index.js +0 -376
  241. package/src/rules/no-hardcoded-session-tokens/index.d.ts +0 -6
  242. package/src/rules/no-hardcoded-session-tokens/index.js +0 -59
  243. package/src/rules/no-http-urls/index.d.ts +0 -12
  244. package/src/rules/no-http-urls/index.js +0 -114
  245. package/src/rules/no-improper-sanitization/index.d.ts +0 -12
  246. package/src/rules/no-improper-sanitization/index.js +0 -411
  247. package/src/rules/no-improper-type-validation/index.d.ts +0 -10
  248. package/src/rules/no-improper-type-validation/index.js +0 -475
  249. package/src/rules/no-insecure-comparison/index.d.ts +0 -7
  250. package/src/rules/no-insecure-comparison/index.js +0 -193
  251. package/src/rules/no-insecure-cookie-settings/index.d.ts +0 -9
  252. package/src/rules/no-insecure-cookie-settings/index.js +0 -306
  253. package/src/rules/no-insecure-jwt/index.d.ts +0 -10
  254. package/src/rules/no-insecure-jwt/index.js +0 -380
  255. package/src/rules/no-insecure-redirects/index.d.ts +0 -7
  256. package/src/rules/no-insecure-redirects/index.js +0 -216
  257. package/src/rules/no-insecure-websocket/index.d.ts +0 -6
  258. package/src/rules/no-insecure-websocket/index.js +0 -61
  259. package/src/rules/no-insufficient-postmessage-validation/index.d.ts +0 -14
  260. package/src/rules/no-insufficient-postmessage-validation/index.js +0 -392
  261. package/src/rules/no-insufficient-random/index.d.ts +0 -9
  262. package/src/rules/no-insufficient-random/index.js +0 -208
  263. package/src/rules/no-ldap-injection/index.d.ts +0 -10
  264. package/src/rules/no-ldap-injection/index.js +0 -455
  265. package/src/rules/no-missing-authentication/index.d.ts +0 -13
  266. package/src/rules/no-missing-authentication/index.js +0 -333
  267. package/src/rules/no-missing-cors-check/index.d.ts +0 -9
  268. package/src/rules/no-missing-cors-check/index.js +0 -399
  269. package/src/rules/no-missing-csrf-protection/index.d.ts +0 -11
  270. package/src/rules/no-missing-csrf-protection/index.js +0 -180
  271. package/src/rules/no-missing-security-headers/index.d.ts +0 -7
  272. package/src/rules/no-missing-security-headers/index.js +0 -218
  273. package/src/rules/no-password-in-url/index.d.ts +0 -8
  274. package/src/rules/no-password-in-url/index.js +0 -54
  275. package/src/rules/no-permissive-cors/index.d.ts +0 -8
  276. package/src/rules/no-permissive-cors/index.js +0 -65
  277. package/src/rules/no-pii-in-logs/index.d.ts +0 -8
  278. package/src/rules/no-pii-in-logs/index.js +0 -70
  279. package/src/rules/no-postmessage-origin-wildcard/index.d.ts +0 -8
  280. package/src/rules/no-postmessage-origin-wildcard/index.js +0 -56
  281. package/src/rules/no-privilege-escalation/index.d.ts +0 -13
  282. package/src/rules/no-privilege-escalation/index.js +0 -321
  283. package/src/rules/no-redos-vulnerable-regex/index.d.ts +0 -7
  284. package/src/rules/no-redos-vulnerable-regex/index.js +0 -306
  285. package/src/rules/no-sensitive-data-exposure/index.d.ts +0 -11
  286. package/src/rules/no-sensitive-data-exposure/index.js +0 -250
  287. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +0 -8
  288. package/src/rules/no-sensitive-data-in-analytics/index.js +0 -62
  289. package/src/rules/no-sensitive-data-in-cache/index.d.ts +0 -8
  290. package/src/rules/no-sensitive-data-in-cache/index.js +0 -52
  291. package/src/rules/no-sql-injection/index.d.ts +0 -10
  292. package/src/rules/no-sql-injection/index.js +0 -335
  293. package/src/rules/no-timing-attack/index.d.ts +0 -10
  294. package/src/rules/no-timing-attack/index.js +0 -447
  295. package/src/rules/no-toctou-vulnerability/index.d.ts +0 -7
  296. package/src/rules/no-toctou-vulnerability/index.js +0 -208
  297. package/src/rules/no-tracking-without-consent/index.d.ts +0 -6
  298. package/src/rules/no-tracking-without-consent/index.js +0 -67
  299. package/src/rules/no-unchecked-loop-condition/index.d.ts +0 -12
  300. package/src/rules/no-unchecked-loop-condition/index.js +0 -646
  301. package/src/rules/no-unencrypted-local-storage/index.d.ts +0 -8
  302. package/src/rules/no-unencrypted-local-storage/index.js +0 -61
  303. package/src/rules/no-unencrypted-transmission/index.d.ts +0 -11
  304. package/src/rules/no-unencrypted-transmission/index.js +0 -236
  305. package/src/rules/no-unescaped-url-parameter/index.d.ts +0 -9
  306. package/src/rules/no-unescaped-url-parameter/index.js +0 -355
  307. package/src/rules/no-unlimited-resource-allocation/index.d.ts +0 -12
  308. package/src/rules/no-unlimited-resource-allocation/index.js +0 -643
  309. package/src/rules/no-unsafe-deserialization/index.d.ts +0 -10
  310. package/src/rules/no-unsafe-deserialization/index.js +0 -491
  311. package/src/rules/no-unsafe-dynamic-require/index.d.ts +0 -5
  312. package/src/rules/no-unsafe-dynamic-require/index.js +0 -106
  313. package/src/rules/no-unsafe-regex-construction/index.d.ts +0 -9
  314. package/src/rules/no-unsafe-regex-construction/index.js +0 -291
  315. package/src/rules/no-unsanitized-html/index.d.ts +0 -9
  316. package/src/rules/no-unsanitized-html/index.js +0 -335
  317. package/src/rules/no-unvalidated-deeplinks/index.d.ts +0 -6
  318. package/src/rules/no-unvalidated-deeplinks/index.js +0 -62
  319. package/src/rules/no-unvalidated-user-input/index.d.ts +0 -9
  320. package/src/rules/no-unvalidated-user-input/index.js +0 -420
  321. package/src/rules/no-verbose-error-messages/index.d.ts +0 -8
  322. package/src/rules/no-verbose-error-messages/index.js +0 -68
  323. package/src/rules/no-weak-crypto/index.d.ts +0 -11
  324. package/src/rules/no-weak-crypto/index.js +0 -351
  325. package/src/rules/no-weak-password-recovery/index.d.ts +0 -12
  326. package/src/rules/no-weak-password-recovery/index.js +0 -424
  327. package/src/rules/no-xpath-injection/index.d.ts +0 -10
  328. package/src/rules/no-xpath-injection/index.js +0 -487
  329. package/src/rules/no-xxe-injection/index.d.ts +0 -7
  330. package/src/rules/no-xxe-injection/index.js +0 -266
  331. package/src/rules/no-zip-slip/index.d.ts +0 -9
  332. package/src/rules/no-zip-slip/index.js +0 -445
  333. package/src/rules/require-backend-authorization/index.d.ts +0 -6
  334. package/src/rules/require-backend-authorization/index.js +0 -60
  335. package/src/rules/require-code-minification/index.d.ts +0 -8
  336. package/src/rules/require-code-minification/index.js +0 -47
  337. package/src/rules/require-csp-headers/index.d.ts +0 -6
  338. package/src/rules/require-csp-headers/index.js +0 -64
  339. package/src/rules/require-data-minimization/index.d.ts +0 -8
  340. package/src/rules/require-data-minimization/index.js +0 -53
  341. package/src/rules/require-dependency-integrity/index.d.ts +0 -6
  342. package/src/rules/require-dependency-integrity/index.js +0 -64
  343. package/src/rules/require-https-only/index.d.ts +0 -8
  344. package/src/rules/require-https-only/index.js +0 -62
  345. package/src/rules/require-mime-type-validation/index.d.ts +0 -6
  346. package/src/rules/require-mime-type-validation/index.js +0 -66
  347. package/src/rules/require-network-timeout/index.d.ts +0 -8
  348. package/src/rules/require-network-timeout/index.js +0 -50
  349. package/src/rules/require-package-lock/index.d.ts +0 -8
  350. package/src/rules/require-package-lock/index.js +0 -63
  351. package/src/rules/require-secure-credential-storage/index.d.ts +0 -8
  352. package/src/rules/require-secure-credential-storage/index.js +0 -50
  353. package/src/rules/require-secure-defaults/index.d.ts +0 -8
  354. package/src/rules/require-secure-defaults/index.js +0 -47
  355. package/src/rules/require-secure-deletion/index.d.ts +0 -8
  356. package/src/rules/require-secure-deletion/index.js +0 -44
  357. package/src/rules/require-storage-encryption/index.d.ts +0 -8
  358. package/src/rules/require-storage-encryption/index.js +0 -50
  359. package/src/rules/require-url-validation/index.d.ts +0 -6
  360. package/src/rules/require-url-validation/index.js +0 -72
  361. package/src/types/index.js +0 -17
@@ -1,62 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Require validation of deep link URLs
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.noUnvalidatedDeeplinks = void 0;
7
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
8
- exports.noUnvalidatedDeeplinks = (0, eslint_devkit_1.createRule)({
9
- name: 'no-unvalidated-deeplinks',
10
- meta: {
11
- type: 'problem',
12
- docs: {
13
- description: 'Require validation of deep link URLs',
14
- },
15
- messages: {
16
- violationDetected: (0, eslint_devkit_1.formatLLMMessage)({
17
- icon: eslint_devkit_1.MessageIcons.SECURITY,
18
- issueName: 'Unvalidated Deeplink',
19
- cwe: 'CWE-939',
20
- description: 'Deep link URL used without validation - potential open redirect',
21
- severity: 'HIGH',
22
- fix: 'Validate deep link URLs against a whitelist before navigation',
23
- documentationLink: 'https://cwe.mitre.org/data/definitions/939.html',
24
- })
25
- },
26
- schema: [],
27
- },
28
- defaultOptions: [],
29
- create(context) {
30
- function report(node) {
31
- context.report({ node, messageId: 'violationDetected' });
32
- }
33
- return {
34
- CallExpression(node) {
35
- // Detect Linking.openURL() with variable argument (React Native)
36
- if (node.callee.type === 'MemberExpression' &&
37
- node.callee.object.type === 'Identifier' &&
38
- node.callee.object.name === 'Linking' &&
39
- node.callee.property.type === 'Identifier' &&
40
- node.callee.property.name === 'openURL') {
41
- const urlArg = node.arguments[0];
42
- // Flag if URL is a variable/expression, not a literal
43
- if (urlArg && urlArg.type === 'Identifier') {
44
- report(node);
45
- }
46
- if (urlArg && urlArg.type === 'MemberExpression') {
47
- report(node);
48
- }
49
- }
50
- // Detect navigation.navigate with external URLs
51
- if (node.callee.type === 'MemberExpression' &&
52
- node.callee.property.type === 'Identifier' &&
53
- node.callee.property.name === 'navigate') {
54
- const urlArg = node.arguments[0];
55
- if (urlArg && urlArg.type === 'Identifier') {
56
- report(node);
57
- }
58
- }
59
- },
60
- };
61
- },
62
- });
@@ -1,9 +0,0 @@
1
- export interface Options {
2
- /** Allow unvalidated input in test files. Default: false */
3
- allowInTests?: boolean;
4
- /** Trusted validation libraries. Default: ['zod', 'joi', 'yup', 'class-validator'] */
5
- trustedLibraries?: string[];
6
- /** Additional safe patterns to ignore. Default: ['^safe', '^sanitized', '^validated', '^clean'] (prefix patterns) */
7
- ignorePatterns?: string[];
8
- }
9
- export declare const noUnvalidatedUserInput: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
@@ -1,420 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noUnvalidatedUserInput = void 0;
4
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
5
- const eslint_devkit_2 = require("@interlace/eslint-devkit");
6
- /**
7
- * Patterns that indicate unvalidated user input
8
- */
9
- const UNVALIDATED_INPUT_PATTERNS = [
10
- // Express/Node.js patterns
11
- { pattern: /\breq\.body\b/, name: 'req.body', context: 'Express request body' },
12
- { pattern: /\breq\.query\b/, name: 'req.query', context: 'Express query parameters' },
13
- { pattern: /\breq\.params\b/, name: 'req.params', context: 'Express route parameters' },
14
- { pattern: /\breq\.headers\b/, name: 'req.headers', context: 'Express headers' },
15
- { pattern: /\breq\.cookies\b/, name: 'req.cookies', context: 'Express cookies' },
16
- // Fastify patterns
17
- { pattern: /\brequest\.body\b/, name: 'request.body', context: 'Fastify request body' },
18
- { pattern: /\brequest\.query\b/, name: 'request.query', context: 'Fastify query parameters' },
19
- { pattern: /\brequest\.params\b/, name: 'request.params', context: 'Fastify route parameters' },
20
- // Next.js patterns
21
- { pattern: /\bsearchParams\b/, name: 'searchParams', context: 'Next.js search params' },
22
- // Generic patterns - ONLY flag clearly user-related patterns
23
- // Removed 'input' as it's too generic and causes many false positives
24
- { pattern: /\buserInput\b/, name: 'userInput', context: 'Generic user input' },
25
- { pattern: /\bunsafeInput\b/, name: 'unsafeInput', context: 'Explicitly unsafe input' },
26
- { pattern: /\brawInput\b/, name: 'rawInput', context: 'Raw/unprocessed input' },
27
- ];
28
- /**
29
- * Check if a node is inside a validation function call
30
- */
31
- function isInsideValidationCall(node, sourceCode, trustedLibraries) {
32
- let current = node;
33
- while (current) {
34
- // Check if current is an argument to a CallExpression
35
- if (current.parent && current.parent.type === 'CallExpression') {
36
- const callExpr = current.parent;
37
- // Verify that current is actually an argument of this call
38
- const isArgument = callExpr.arguments.some((arg) => arg === current);
39
- if (!isArgument) {
40
- // Not an argument, continue traversing
41
- if ('parent' in current && current.parent) {
42
- current = current.parent;
43
- continue;
44
- }
45
- else {
46
- break;
47
- }
48
- }
49
- const callee = callExpr.callee;
50
- // Check if it's a validation library call (e.g., schema.parse(), schema.validate())
51
- if (callee.type === 'MemberExpression') {
52
- const property = callee.property;
53
- if (property.type === 'Identifier') {
54
- const methodName = property.name.toLowerCase();
55
- // Check for validation methods (including async variants)
56
- // Note: safeParse is one word, not two
57
- if (['parse', 'validate', 'safeparse', 'parseasync', 'validateasync', 'safe_parse'].includes(methodName)) {
58
- return true;
59
- }
60
- }
61
- // Check if the object is a validation library
62
- const object = callee.object;
63
- if (object.type === 'Identifier') {
64
- const objectName = object.name.toLowerCase();
65
- if (trustedLibraries.some(lib => objectName.includes(lib.toLowerCase()))) {
66
- return true;
67
- }
68
- }
69
- }
70
- // Check if it's a direct validation function call (e.g., validate(), plainToClass())
71
- if (callee.type === 'Identifier') {
72
- const calleeName = callee.name.toLowerCase();
73
- if (['validate', 'plaintoclass', 'transform'].includes(calleeName)) {
74
- return true;
75
- }
76
- if (trustedLibraries.some(lib => calleeName.includes(lib.toLowerCase()))) {
77
- return true;
78
- }
79
- }
80
- }
81
- // Traverse up the AST
82
- if ('parent' in current && current.parent) {
83
- current = current.parent;
84
- }
85
- else {
86
- break;
87
- }
88
- }
89
- return false;
90
- }
91
- /**
92
- * Check if a string matches any ignore pattern
93
- */
94
- function matchesIgnorePattern(text, ignorePatterns) {
95
- return ignorePatterns.some(pattern => {
96
- try {
97
- const regex = new RegExp(pattern, 'i');
98
- return regex.test(text);
99
- }
100
- catch {
101
- // Invalid regex - treat as literal string match
102
- return text.toLowerCase().includes(pattern.toLowerCase());
103
- }
104
- });
105
- }
106
- exports.noUnvalidatedUserInput = (0, eslint_devkit_2.createRule)({
107
- name: 'no-unvalidated-user-input',
108
- meta: {
109
- type: 'problem',
110
- docs: {
111
- description: 'Detects unvalidated user input usage (req.body, req.query, etc.)',
112
- },
113
- hasSuggestions: true,
114
- messages: {
115
- unvalidatedInput: (0, eslint_devkit_1.formatLLMMessage)({
116
- icon: eslint_devkit_1.MessageIcons.SECURITY,
117
- issueName: 'Unvalidated User Input',
118
- cwe: 'CWE-20',
119
- description: 'Unvalidated user input detected: {{inputSource}}',
120
- severity: 'HIGH',
121
- fix: 'Use validation library: {{validationExample}}',
122
- documentationLink: 'https://cwe.mitre.org/data/definitions/20.html',
123
- }),
124
- useValidationLibrary: (0, eslint_devkit_1.formatLLMMessage)({
125
- icon: eslint_devkit_1.MessageIcons.INFO,
126
- issueName: 'Use Validation Library',
127
- description: 'Use validation library',
128
- severity: 'LOW',
129
- fix: 'Use Zod, Joi, Yup, or class-validator',
130
- documentationLink: 'https://zod.dev/',
131
- }),
132
- useZod: (0, eslint_devkit_1.formatLLMMessage)({
133
- icon: eslint_devkit_1.MessageIcons.INFO,
134
- issueName: 'Use Zod',
135
- description: 'Use Zod for validation',
136
- severity: 'LOW',
137
- fix: 'const data = z.object({ name: z.string() }).parse(req.body)',
138
- documentationLink: 'https://zod.dev/',
139
- }),
140
- useJoi: (0, eslint_devkit_1.formatLLMMessage)({
141
- icon: eslint_devkit_1.MessageIcons.INFO,
142
- issueName: 'Use Joi',
143
- description: 'Use Joi for validation',
144
- severity: 'LOW',
145
- fix: 'Joi.object({ name: Joi.string() }).validate(req.body)',
146
- documentationLink: 'https://joi.dev/',
147
- }),
148
- },
149
- schema: [
150
- {
151
- type: 'object',
152
- properties: {
153
- allowInTests: {
154
- type: 'boolean',
155
- default: false,
156
- description: 'Allow unvalidated input in test files',
157
- },
158
- trustedLibraries: {
159
- type: 'array',
160
- items: { type: 'string' },
161
- default: ['zod', 'joi', 'yup', 'class-validator'],
162
- description: 'Trusted validation libraries',
163
- },
164
- ignorePatterns: {
165
- type: 'array',
166
- items: { type: 'string' },
167
- default: [],
168
- description: 'Additional safe patterns to ignore',
169
- },
170
- },
171
- additionalProperties: false,
172
- },
173
- ],
174
- },
175
- defaultOptions: [
176
- {
177
- allowInTests: false,
178
- trustedLibraries: ['zod', 'joi', 'yup', 'class-validator'],
179
- ignorePatterns: ['^safe', '^sanitized', '^validated', '^clean'],
180
- },
181
- ],
182
- create(context, [options = {}]) {
183
- const { allowInTests = false, trustedLibraries = ['zod', 'joi', 'yup', 'class-validator'], ignorePatterns = ['^safe', '^sanitized', '^validated', '^clean'], } = options;
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
- function checkMemberExpression(node) {
188
- if (isTestFile) {
189
- return;
190
- }
191
- const text = sourceCode.getText(node);
192
- // Check if the variable name (if in assignment) matches ignore pattern
193
- // For cases like: const safeInput = req.body;
194
- if (node.parent && node.parent.type === 'VariableDeclarator' && node.parent.id.type === 'Identifier') {
195
- const varName = node.parent.id.name;
196
- if (matchesIgnorePattern(varName, ignorePatterns)) {
197
- return;
198
- }
199
- }
200
- // Check if it matches any ignore pattern
201
- if (matchesIgnorePattern(text, ignorePatterns)) {
202
- return;
203
- }
204
- // Check if it matches unvalidated input patterns
205
- // For nested member expressions like req.body.name, check the base (req.body)
206
- let baseText = text;
207
- if (node.object.type === 'MemberExpression') {
208
- baseText = sourceCode.getText(node.object);
209
- }
210
- const matchedPattern = UNVALIDATED_INPUT_PATTERNS.find(p => p.pattern.test(text) || p.pattern.test(baseText));
211
- if (matchedPattern) {
212
- // Skip if this is a nested member expression and the parent also matches
213
- // This prevents double reporting for cases like req.query.id
214
- // We only want to report on the outermost matching expression
215
- if (node.object.type === 'MemberExpression') {
216
- const parentText = sourceCode.getText(node.object);
217
- const parentMatches = UNVALIDATED_INPUT_PATTERNS.some(p => p.pattern.test(parentText));
218
- if (parentMatches) {
219
- // Parent also matches, skip this nested one - it will be reported when we visit the parent
220
- return;
221
- }
222
- }
223
- // Skip if this is in a destructuring assignment - checkObjectPattern will handle it
224
- // This prevents double reporting for cases like: const { email } = req.body;
225
- if (node.parent && node.parent.type === 'VariableDeclarator' && node.parent.id.type === 'ObjectPattern') {
226
- return; // checkObjectPattern will report on the init instead
227
- }
228
- // Check if it's inside a validation call
229
- if (isInsideValidationCall(node, sourceCode, trustedLibraries)) {
230
- return;
231
- }
232
- // Determine validation example based on context
233
- let validationExample = 'const schema = z.object({ field: z.string() }); const data = schema.parse(req.body);';
234
- if (text.includes('query')) {
235
- validationExample = 'const schema = z.object({ id: z.string() }); const data = schema.parse(req.query);';
236
- }
237
- else if (text.includes('params')) {
238
- validationExample = 'const schema = z.object({ id: z.string() }); const data = schema.parse(req.params);';
239
- }
240
- // Build suggestions - provide same code as output for test framework recognition
241
- const suggestions = [
242
- {
243
- messageId: 'useZod',
244
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
245
- fix: (_fixer) => {
246
- // This is a suggestion, not an auto-fix, so we return null
247
- return null;
248
- },
249
- },
250
- {
251
- messageId: 'useJoi',
252
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
253
- fix: (_fixer) => {
254
- return null;
255
- },
256
- },
257
- ];
258
- context.report({
259
- node,
260
- messageId: 'unvalidatedInput',
261
- data: {
262
- inputSource: matchedPattern.name,
263
- validationExample,
264
- },
265
- suggest: suggestions,
266
- });
267
- }
268
- }
269
- function checkIdentifier(node) {
270
- if (isTestFile) {
271
- return;
272
- }
273
- const text = node.name;
274
- // Check if it matches any ignore pattern
275
- if (matchesIgnorePattern(text, ignorePatterns)) {
276
- return;
277
- }
278
- // Skip if this identifier is assigned from a user input source (MemberExpression)
279
- // For cases like: const userInput = req.body;
280
- // We should only report on req.body, not on userInput
281
- // But don't skip if the init is the same identifier (e.g., const data = input;)
282
- if (node.parent && node.parent.type === 'VariableDeclarator' && node.parent.init) {
283
- const init = node.parent.init;
284
- // Only skip if init is a MemberExpression (like req.body) that will be caught by checkMemberExpression
285
- // Don't skip if init is the same identifier (like input) - we want to report on it
286
- if (init.type === 'MemberExpression') {
287
- const initText = sourceCode.getText(init);
288
- // Check if init matches any user input pattern
289
- const initMatchesPattern = UNVALIDATED_INPUT_PATTERNS.some(p => p.pattern.test(initText));
290
- if (initMatchesPattern) {
291
- return; // Skip - the init (e.g., req.body) will be reported by checkMemberExpression
292
- }
293
- }
294
- }
295
- // Check for generic input patterns (userInput, unsafeInput, rawInput)
296
- const genericInputPatternNames = ['userInput', 'unsafeInput', 'rawInput'];
297
- const matchedPattern = UNVALIDATED_INPUT_PATTERNS.find(p => genericInputPatternNames.includes(p.name) && p.pattern.test(text));
298
- if (matchedPattern) {
299
- // Check if it's inside a validation call
300
- if (isInsideValidationCall(node, sourceCode, trustedLibraries)) {
301
- return;
302
- }
303
- context.report({
304
- node,
305
- messageId: 'unvalidatedInput',
306
- data: {
307
- inputSource: matchedPattern.name,
308
- validationExample: 'const schema = z.object({ field: z.string() }); const data = schema.parse(input);',
309
- },
310
- suggest: [
311
- {
312
- messageId: 'useZod',
313
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
314
- fix: (_fixer) => null,
315
- },
316
- {
317
- messageId: 'useJoi',
318
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
319
- fix: (_fixer) => null,
320
- },
321
- ],
322
- });
323
- }
324
- }
325
- function checkObjectPattern(node) {
326
- if (isTestFile) {
327
- return;
328
- }
329
- // Check destructuring patterns like: const { page, limit } = req.query;
330
- if (node.parent && node.parent.type === eslint_devkit_1.AST_NODE_TYPES.VariableDeclarator && node.parent.init) {
331
- const init = node.parent.init;
332
- const initText = sourceCode.getText(init);
333
- // If init is a CallExpression, check if it's a validation call
334
- // If so, the input is being validated, so skip
335
- if (init.type === eslint_devkit_1.AST_NODE_TYPES.CallExpression) {
336
- const callee = init.callee;
337
- if (callee.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression && callee.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier) {
338
- const methodName = callee.property.name.toLowerCase();
339
- if (['parse', 'validate', 'safeparse', 'parseasync', 'validateasync', 'safe_parse'].includes(methodName)) {
340
- return; // It's a validation call, skip
341
- }
342
- }
343
- if (callee.type === eslint_devkit_1.AST_NODE_TYPES.Identifier) {
344
- const calleeName = callee.name.toLowerCase();
345
- if (['validate', 'plaintoclass', 'transform'].includes(calleeName)) {
346
- return; // It's a validation call, skip
347
- }
348
- }
349
- }
350
- // Check if the right side matches unvalidated input patterns
351
- const matchedPattern = UNVALIDATED_INPUT_PATTERNS.find(p => p.pattern.test(initText));
352
- if (matchedPattern) {
353
- // For CallExpressions, check the arguments to see if they're validated
354
- // The init itself being a validation call was already checked above
355
- if (init.type === eslint_devkit_1.AST_NODE_TYPES.CallExpression) {
356
- // Check each argument to see if it's validated
357
- // If init is a validation call (like schema.validate(req.body)),
358
- // then req.body is validated, so skip
359
- const callee = init.callee;
360
- const isValidationCall = (callee.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression && callee.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
361
- ['parse', 'validate', 'safeparse', 'parseasync', 'validateasync', 'safe_parse'].includes(callee.property.name.toLowerCase())) ||
362
- (callee.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
363
- ['validate', 'plaintoclass', 'transform'].includes(callee.name.toLowerCase()));
364
- if (isValidationCall) {
365
- return; // The init is a validation call, so the input is validated
366
- }
367
- // If init is not a validation call, check if arguments are validated
368
- const hasValidatedArg = init.arguments.some((arg) => {
369
- if (arg.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression || arg.type === eslint_devkit_1.AST_NODE_TYPES.Identifier) {
370
- return isInsideValidationCall(arg, sourceCode, trustedLibraries);
371
- }
372
- return false;
373
- });
374
- if (hasValidatedArg) {
375
- return; // At least one argument is validated
376
- }
377
- }
378
- else {
379
- // For non-call expressions, check if init itself is inside a validation call
380
- if (isInsideValidationCall(init, sourceCode, trustedLibraries)) {
381
- return;
382
- }
383
- }
384
- // Check if variable name matches ignore pattern
385
- if (node.parent.id.type === eslint_devkit_1.AST_NODE_TYPES.ObjectPattern) {
386
- const varText = sourceCode.getText(node.parent.id);
387
- if (matchesIgnorePattern(varText, ignorePatterns)) {
388
- return;
389
- }
390
- }
391
- context.report({
392
- node: init,
393
- messageId: 'unvalidatedInput',
394
- data: {
395
- inputSource: matchedPattern.name,
396
- validationExample: 'const schema = z.object({ page: z.string(), limit: z.string() }); const { page, limit } = schema.parse(req.query);',
397
- },
398
- suggest: [
399
- {
400
- messageId: 'useZod',
401
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
402
- fix: (_fixer) => null,
403
- },
404
- {
405
- messageId: 'useJoi',
406
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
407
- fix: (_fixer) => null,
408
- },
409
- ],
410
- });
411
- }
412
- }
413
- }
414
- return {
415
- MemberExpression: checkMemberExpression,
416
- Identifier: checkIdentifier,
417
- ObjectPattern: checkObjectPattern,
418
- };
419
- },
420
- });
@@ -1,8 +0,0 @@
1
- /**
2
- * @fileoverview Prevent exposing stack traces to users
3
- * @see https://owasp.org/www-project-mobile-top-10/
4
- * @see https://cwe.mitre.org/data/definitions/209.html
5
- */
6
- export interface Options {
7
- }
8
- export declare const noVerboseErrorMessages: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
@@ -1,68 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Prevent exposing stack traces to users
4
- * @see https://owasp.org/www-project-mobile-top-10/
5
- * @see https://cwe.mitre.org/data/definitions/209.html
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.noVerboseErrorMessages = void 0;
9
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
10
- exports.noVerboseErrorMessages = (0, eslint_devkit_1.createRule)({
11
- name: 'no-verbose-error-messages',
12
- meta: {
13
- type: 'problem',
14
- docs: {
15
- description: 'Prevent exposing stack traces to users',
16
- },
17
- messages: {
18
- violationDetected: (0, eslint_devkit_1.formatLLMMessage)({
19
- icon: eslint_devkit_1.MessageIcons.SECURITY,
20
- issueName: 'violation Detected',
21
- cwe: 'CWE-209',
22
- description: 'Prevent exposing stack traces to users detected - this is a security risk',
23
- severity: 'MEDIUM',
24
- fix: 'Review and apply secure practices',
25
- documentationLink: 'https://cwe.mitre.org/data/definitions/209.html',
26
- })
27
- },
28
- schema: [],
29
- },
30
- defaultOptions: [],
31
- create(context) {
32
- function report(node) {
33
- context.report({
34
- node,
35
- messageId: 'violationDetected',
36
- });
37
- }
38
- return {
39
- CallExpression(node) {
40
- // Check res.send/res.json with error.stack
41
- if (node.type === eslint_devkit_1.AST_NODE_TYPES.CallExpression &&
42
- node.callee.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression &&
43
- node.callee.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
44
- ['send', 'json'].includes(node.callee.property.name)) {
45
- const arg = node.arguments[0];
46
- // Check for error.stack or err.stack
47
- if (arg?.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression &&
48
- arg.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
49
- arg.property.name === 'stack') {
50
- report(node);
51
- }
52
- // Check for { stack: error.stack } in object
53
- if (arg?.type === eslint_devkit_1.AST_NODE_TYPES.ObjectExpression) {
54
- const stackProp = arg.properties.find(p => p.type === eslint_devkit_1.AST_NODE_TYPES.Property &&
55
- p.key.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
56
- (p.key.name === 'stack' ||
57
- (p.value.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression &&
58
- p.value.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
59
- p.value.property.name === 'stack')));
60
- if (stackProp) {
61
- report(node);
62
- }
63
- }
64
- }
65
- },
66
- };
67
- },
68
- });
@@ -1,11 +0,0 @@
1
- export interface Options {
2
- /** Allow weak crypto in test files. Default: false */
3
- allowInTests?: boolean;
4
- /** Additional weak algorithms to detect. Default: [] */
5
- additionalWeakAlgorithms?: string[];
6
- /** Trusted crypto libraries. Default: ['crypto', 'crypto-js'] */
7
- trustedLibraries?: string[];
8
- /** Strategy for fixing weak crypto: 'upgrade', 'migrate', 'policy', 'auto' */
9
- strategy?: 'upgrade' | 'migrate' | 'policy' | 'auto';
10
- }
11
- export declare const noWeakCrypto: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;