eslint-plugin-secure-coding 2.3.2 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +1 -0
  2. package/package.json +3 -10
  3. package/src/index.ts +605 -0
  4. package/src/rules/__tests__/integration-demo.test.ts +290 -0
  5. package/src/rules/__tests__/integration-llm.test.ts +89 -0
  6. package/src/rules/database-injection/database-injection.test.ts +456 -0
  7. package/src/rules/database-injection/index.ts +488 -0
  8. package/src/rules/detect-child-process/detect-child-process.test.ts +207 -0
  9. package/src/rules/detect-child-process/index.ts +634 -0
  10. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +416 -0
  11. package/src/rules/detect-eval-with-expression/index.ts +463 -0
  12. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +28 -0
  13. package/src/rules/detect-mixed-content/index.ts +52 -0
  14. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +269 -0
  15. package/src/rules/detect-non-literal-fs-filename/index.ts +551 -0
  16. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +189 -0
  17. package/src/rules/detect-non-literal-regexp/index.ts +490 -0
  18. package/src/rules/detect-object-injection/detect-object-injection.test.ts +440 -0
  19. package/src/rules/detect-object-injection/index.ts +674 -0
  20. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +32 -0
  21. package/src/rules/detect-suspicious-dependencies/index.ts +84 -0
  22. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +31 -0
  23. package/src/rules/detect-weak-password-validation/index.ts +68 -0
  24. package/src/rules/no-allow-arbitrary-loads/index.ts +54 -0
  25. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +28 -0
  26. package/src/rules/no-arbitrary-file-access/index.ts +238 -0
  27. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +119 -0
  28. package/src/rules/no-buffer-overread/index.ts +724 -0
  29. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +313 -0
  30. package/src/rules/no-clickjacking/index.ts +481 -0
  31. package/src/rules/no-clickjacking/no-clickjacking.test.ts +253 -0
  32. package/src/rules/no-client-side-auth-logic/index.ts +81 -0
  33. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +33 -0
  34. package/src/rules/no-credentials-in-query-params/index.ts +69 -0
  35. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +33 -0
  36. package/src/rules/no-credentials-in-storage-api/index.ts +64 -0
  37. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +31 -0
  38. package/src/rules/no-data-in-temp-storage/index.ts +75 -0
  39. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +33 -0
  40. package/src/rules/no-debug-code-in-production/index.ts +59 -0
  41. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +26 -0
  42. package/src/rules/no-directive-injection/index.ts +551 -0
  43. package/src/rules/no-directive-injection/no-directive-injection.test.ts +305 -0
  44. package/src/rules/no-disabled-certificate-validation/index.ts +72 -0
  45. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +33 -0
  46. package/src/rules/no-document-cookie/index.ts +113 -0
  47. package/src/rules/no-document-cookie/no-document-cookie.test.ts +382 -0
  48. package/src/rules/no-dynamic-dependency-loading/index.ts +60 -0
  49. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +27 -0
  50. package/src/rules/no-electron-security-issues/index.ts +504 -0
  51. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +324 -0
  52. package/src/rules/no-exposed-debug-endpoints/index.ts +73 -0
  53. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +40 -0
  54. package/src/rules/no-exposed-sensitive-data/index.ts +428 -0
  55. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +75 -0
  56. package/src/rules/no-format-string-injection/index.ts +801 -0
  57. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +437 -0
  58. package/src/rules/no-graphql-injection/index.ts +508 -0
  59. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +371 -0
  60. package/src/rules/no-hardcoded-credentials/index.ts +478 -0
  61. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +639 -0
  62. package/src/rules/no-hardcoded-session-tokens/index.ts +69 -0
  63. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +42 -0
  64. package/src/rules/no-http-urls/index.ts +131 -0
  65. package/src/rules/no-http-urls/no-http-urls.test.ts +60 -0
  66. package/src/rules/no-improper-sanitization/index.ts +502 -0
  67. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +156 -0
  68. package/src/rules/no-improper-type-validation/index.ts +572 -0
  69. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +372 -0
  70. package/src/rules/no-insecure-comparison/index.ts +232 -0
  71. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +218 -0
  72. package/src/rules/no-insecure-cookie-settings/index.ts +391 -0
  73. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +409 -0
  74. package/src/rules/no-insecure-jwt/index.ts +467 -0
  75. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +259 -0
  76. package/src/rules/no-insecure-redirects/index.ts +267 -0
  77. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +108 -0
  78. package/src/rules/no-insecure-websocket/index.ts +72 -0
  79. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +42 -0
  80. package/src/rules/no-insufficient-postmessage-validation/index.ts +497 -0
  81. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +360 -0
  82. package/src/rules/no-insufficient-random/index.ts +288 -0
  83. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +246 -0
  84. package/src/rules/no-ldap-injection/index.ts +547 -0
  85. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +317 -0
  86. package/src/rules/no-missing-authentication/index.ts +408 -0
  87. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +350 -0
  88. package/src/rules/no-missing-cors-check/index.ts +453 -0
  89. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +392 -0
  90. package/src/rules/no-missing-csrf-protection/index.ts +229 -0
  91. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +222 -0
  92. package/src/rules/no-missing-security-headers/index.ts +266 -0
  93. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +98 -0
  94. package/src/rules/no-password-in-url/index.ts +64 -0
  95. package/src/rules/no-password-in-url/no-password-in-url.test.ts +27 -0
  96. package/src/rules/no-permissive-cors/index.ts +78 -0
  97. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +28 -0
  98. package/src/rules/no-pii-in-logs/index.ts +83 -0
  99. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +26 -0
  100. package/src/rules/no-postmessage-origin-wildcard/index.ts +67 -0
  101. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +27 -0
  102. package/src/rules/no-privilege-escalation/index.ts +403 -0
  103. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +306 -0
  104. package/src/rules/no-redos-vulnerable-regex/index.ts +379 -0
  105. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +83 -0
  106. package/src/rules/no-sensitive-data-exposure/index.ts +294 -0
  107. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +262 -0
  108. package/src/rules/no-sensitive-data-in-analytics/index.ts +73 -0
  109. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +42 -0
  110. package/src/rules/no-sensitive-data-in-cache/index.ts +59 -0
  111. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +32 -0
  112. package/src/rules/no-sql-injection/index.ts +424 -0
  113. package/src/rules/no-sql-injection/no-sql-injection.test.ts +303 -0
  114. package/src/rules/no-timing-attack/index.ts +552 -0
  115. package/src/rules/no-timing-attack/no-timing-attack.test.ts +348 -0
  116. package/src/rules/no-toctou-vulnerability/index.ts +250 -0
  117. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +60 -0
  118. package/src/rules/no-tracking-without-consent/index.ts +78 -0
  119. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +34 -0
  120. package/src/rules/no-unchecked-loop-condition/index.ts +781 -0
  121. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +459 -0
  122. package/src/rules/no-unencrypted-local-storage/index.ts +73 -0
  123. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +41 -0
  124. package/src/rules/no-unencrypted-transmission/index.ts +296 -0
  125. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +287 -0
  126. package/src/rules/no-unescaped-url-parameter/index.ts +424 -0
  127. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +263 -0
  128. package/src/rules/no-unlimited-resource-allocation/index.ts +767 -0
  129. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +544 -0
  130. package/src/rules/no-unsafe-deserialization/index.ts +593 -0
  131. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +310 -0
  132. package/src/rules/no-unsafe-dynamic-require/index.ts +125 -0
  133. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +151 -0
  134. package/src/rules/no-unsafe-regex-construction/index.ts +370 -0
  135. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +181 -0
  136. package/src/rules/no-unsanitized-html/index.ts +400 -0
  137. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +488 -0
  138. package/src/rules/no-unvalidated-deeplinks/index.ts +73 -0
  139. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +29 -0
  140. package/src/rules/no-unvalidated-user-input/index.ts +498 -0
  141. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +463 -0
  142. package/src/rules/no-verbose-error-messages/index.ts +83 -0
  143. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +34 -0
  144. package/src/rules/no-weak-crypto/index.ts +447 -0
  145. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +297 -0
  146. package/src/rules/no-weak-password-recovery/index.ts +509 -0
  147. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +184 -0
  148. package/src/rules/no-xpath-injection/index.ts +596 -0
  149. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +405 -0
  150. package/src/rules/no-xxe-injection/index.ts +342 -0
  151. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +122 -0
  152. package/src/rules/no-zip-slip/index.ts +526 -0
  153. package/src/rules/no-zip-slip/no-zip-slip.test.ts +305 -0
  154. package/src/rules/require-backend-authorization/index.ts +71 -0
  155. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +31 -0
  156. package/src/rules/require-code-minification/index.ts +54 -0
  157. package/src/rules/require-code-minification/require-code-minification.test.ts +30 -0
  158. package/src/rules/require-csp-headers/index.ts +74 -0
  159. package/src/rules/require-csp-headers/require-csp-headers.test.ts +34 -0
  160. package/src/rules/require-data-minimization/index.ts +65 -0
  161. package/src/rules/require-data-minimization/require-data-minimization.test.ts +31 -0
  162. package/src/rules/require-dependency-integrity/index.ts +78 -0
  163. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +44 -0
  164. package/src/rules/require-https-only/index.ts +75 -0
  165. package/src/rules/require-https-only/require-https-only.test.ts +26 -0
  166. package/src/rules/require-mime-type-validation/index.ts +77 -0
  167. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +32 -0
  168. package/src/rules/require-network-timeout/index.ts +58 -0
  169. package/src/rules/require-network-timeout/require-network-timeout.test.ts +26 -0
  170. package/src/rules/require-package-lock/index.ts +75 -0
  171. package/src/rules/require-package-lock/require-package-lock.test.ts +27 -0
  172. package/src/rules/require-secure-credential-storage/index.ts +60 -0
  173. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +26 -0
  174. package/src/rules/require-secure-defaults/index.ts +54 -0
  175. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +26 -0
  176. package/src/rules/require-secure-deletion/index.ts +52 -0
  177. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +29 -0
  178. package/src/rules/require-storage-encryption/index.ts +60 -0
  179. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +26 -0
  180. package/src/rules/require-url-validation/index.ts +85 -0
  181. package/src/rules/require-url-validation/require-url-validation.test.ts +32 -0
  182. package/src/types/{index.d.ts → index.ts} +157 -53
  183. package/src/index.d.ts +0 -32
  184. package/src/index.js +0 -465
  185. package/src/rules/database-injection/index.d.ts +0 -13
  186. package/src/rules/database-injection/index.js +0 -406
  187. package/src/rules/detect-child-process/index.d.ts +0 -11
  188. package/src/rules/detect-child-process/index.js +0 -529
  189. package/src/rules/detect-eval-with-expression/index.d.ts +0 -9
  190. package/src/rules/detect-eval-with-expression/index.js +0 -392
  191. package/src/rules/detect-mixed-content/index.d.ts +0 -8
  192. package/src/rules/detect-mixed-content/index.js +0 -44
  193. package/src/rules/detect-non-literal-fs-filename/index.d.ts +0 -7
  194. package/src/rules/detect-non-literal-fs-filename/index.js +0 -454
  195. package/src/rules/detect-non-literal-regexp/index.d.ts +0 -9
  196. package/src/rules/detect-non-literal-regexp/index.js +0 -403
  197. package/src/rules/detect-object-injection/index.d.ts +0 -11
  198. package/src/rules/detect-object-injection/index.js +0 -560
  199. package/src/rules/detect-suspicious-dependencies/index.d.ts +0 -8
  200. package/src/rules/detect-suspicious-dependencies/index.js +0 -71
  201. package/src/rules/detect-weak-password-validation/index.d.ts +0 -6
  202. package/src/rules/detect-weak-password-validation/index.js +0 -58
  203. package/src/rules/no-allow-arbitrary-loads/index.d.ts +0 -8
  204. package/src/rules/no-allow-arbitrary-loads/index.js +0 -47
  205. package/src/rules/no-arbitrary-file-access/index.d.ts +0 -13
  206. package/src/rules/no-arbitrary-file-access/index.js +0 -195
  207. package/src/rules/no-buffer-overread/index.d.ts +0 -29
  208. package/src/rules/no-buffer-overread/index.js +0 -606
  209. package/src/rules/no-clickjacking/index.d.ts +0 -10
  210. package/src/rules/no-clickjacking/index.js +0 -396
  211. package/src/rules/no-client-side-auth-logic/index.d.ts +0 -6
  212. package/src/rules/no-client-side-auth-logic/index.js +0 -69
  213. package/src/rules/no-credentials-in-query-params/index.d.ts +0 -8
  214. package/src/rules/no-credentials-in-query-params/index.js +0 -57
  215. package/src/rules/no-credentials-in-storage-api/index.d.ts +0 -6
  216. package/src/rules/no-credentials-in-storage-api/index.js +0 -54
  217. package/src/rules/no-data-in-temp-storage/index.d.ts +0 -6
  218. package/src/rules/no-data-in-temp-storage/index.js +0 -64
  219. package/src/rules/no-debug-code-in-production/index.d.ts +0 -8
  220. package/src/rules/no-debug-code-in-production/index.js +0 -51
  221. package/src/rules/no-directive-injection/index.d.ts +0 -12
  222. package/src/rules/no-directive-injection/index.js +0 -457
  223. package/src/rules/no-disabled-certificate-validation/index.d.ts +0 -6
  224. package/src/rules/no-disabled-certificate-validation/index.js +0 -61
  225. package/src/rules/no-document-cookie/index.d.ts +0 -5
  226. package/src/rules/no-document-cookie/index.js +0 -89
  227. package/src/rules/no-dynamic-dependency-loading/index.d.ts +0 -8
  228. package/src/rules/no-dynamic-dependency-loading/index.js +0 -51
  229. package/src/rules/no-electron-security-issues/index.d.ts +0 -10
  230. package/src/rules/no-electron-security-issues/index.js +0 -423
  231. package/src/rules/no-exposed-debug-endpoints/index.d.ts +0 -6
  232. package/src/rules/no-exposed-debug-endpoints/index.js +0 -62
  233. package/src/rules/no-exposed-sensitive-data/index.d.ts +0 -11
  234. package/src/rules/no-exposed-sensitive-data/index.js +0 -340
  235. package/src/rules/no-format-string-injection/index.d.ts +0 -17
  236. package/src/rules/no-format-string-injection/index.js +0 -660
  237. package/src/rules/no-graphql-injection/index.d.ts +0 -12
  238. package/src/rules/no-graphql-injection/index.js +0 -411
  239. package/src/rules/no-hardcoded-credentials/index.d.ts +0 -26
  240. package/src/rules/no-hardcoded-credentials/index.js +0 -376
  241. package/src/rules/no-hardcoded-session-tokens/index.d.ts +0 -6
  242. package/src/rules/no-hardcoded-session-tokens/index.js +0 -59
  243. package/src/rules/no-http-urls/index.d.ts +0 -12
  244. package/src/rules/no-http-urls/index.js +0 -114
  245. package/src/rules/no-improper-sanitization/index.d.ts +0 -12
  246. package/src/rules/no-improper-sanitization/index.js +0 -411
  247. package/src/rules/no-improper-type-validation/index.d.ts +0 -10
  248. package/src/rules/no-improper-type-validation/index.js +0 -475
  249. package/src/rules/no-insecure-comparison/index.d.ts +0 -7
  250. package/src/rules/no-insecure-comparison/index.js +0 -193
  251. package/src/rules/no-insecure-cookie-settings/index.d.ts +0 -9
  252. package/src/rules/no-insecure-cookie-settings/index.js +0 -306
  253. package/src/rules/no-insecure-jwt/index.d.ts +0 -10
  254. package/src/rules/no-insecure-jwt/index.js +0 -380
  255. package/src/rules/no-insecure-redirects/index.d.ts +0 -7
  256. package/src/rules/no-insecure-redirects/index.js +0 -216
  257. package/src/rules/no-insecure-websocket/index.d.ts +0 -6
  258. package/src/rules/no-insecure-websocket/index.js +0 -61
  259. package/src/rules/no-insufficient-postmessage-validation/index.d.ts +0 -14
  260. package/src/rules/no-insufficient-postmessage-validation/index.js +0 -392
  261. package/src/rules/no-insufficient-random/index.d.ts +0 -9
  262. package/src/rules/no-insufficient-random/index.js +0 -208
  263. package/src/rules/no-ldap-injection/index.d.ts +0 -10
  264. package/src/rules/no-ldap-injection/index.js +0 -455
  265. package/src/rules/no-missing-authentication/index.d.ts +0 -13
  266. package/src/rules/no-missing-authentication/index.js +0 -333
  267. package/src/rules/no-missing-cors-check/index.d.ts +0 -9
  268. package/src/rules/no-missing-cors-check/index.js +0 -399
  269. package/src/rules/no-missing-csrf-protection/index.d.ts +0 -11
  270. package/src/rules/no-missing-csrf-protection/index.js +0 -180
  271. package/src/rules/no-missing-security-headers/index.d.ts +0 -7
  272. package/src/rules/no-missing-security-headers/index.js +0 -218
  273. package/src/rules/no-password-in-url/index.d.ts +0 -8
  274. package/src/rules/no-password-in-url/index.js +0 -54
  275. package/src/rules/no-permissive-cors/index.d.ts +0 -8
  276. package/src/rules/no-permissive-cors/index.js +0 -65
  277. package/src/rules/no-pii-in-logs/index.d.ts +0 -8
  278. package/src/rules/no-pii-in-logs/index.js +0 -70
  279. package/src/rules/no-postmessage-origin-wildcard/index.d.ts +0 -8
  280. package/src/rules/no-postmessage-origin-wildcard/index.js +0 -56
  281. package/src/rules/no-privilege-escalation/index.d.ts +0 -13
  282. package/src/rules/no-privilege-escalation/index.js +0 -321
  283. package/src/rules/no-redos-vulnerable-regex/index.d.ts +0 -7
  284. package/src/rules/no-redos-vulnerable-regex/index.js +0 -306
  285. package/src/rules/no-sensitive-data-exposure/index.d.ts +0 -11
  286. package/src/rules/no-sensitive-data-exposure/index.js +0 -250
  287. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +0 -8
  288. package/src/rules/no-sensitive-data-in-analytics/index.js +0 -62
  289. package/src/rules/no-sensitive-data-in-cache/index.d.ts +0 -8
  290. package/src/rules/no-sensitive-data-in-cache/index.js +0 -52
  291. package/src/rules/no-sql-injection/index.d.ts +0 -10
  292. package/src/rules/no-sql-injection/index.js +0 -335
  293. package/src/rules/no-timing-attack/index.d.ts +0 -10
  294. package/src/rules/no-timing-attack/index.js +0 -447
  295. package/src/rules/no-toctou-vulnerability/index.d.ts +0 -7
  296. package/src/rules/no-toctou-vulnerability/index.js +0 -208
  297. package/src/rules/no-tracking-without-consent/index.d.ts +0 -6
  298. package/src/rules/no-tracking-without-consent/index.js +0 -67
  299. package/src/rules/no-unchecked-loop-condition/index.d.ts +0 -12
  300. package/src/rules/no-unchecked-loop-condition/index.js +0 -646
  301. package/src/rules/no-unencrypted-local-storage/index.d.ts +0 -8
  302. package/src/rules/no-unencrypted-local-storage/index.js +0 -61
  303. package/src/rules/no-unencrypted-transmission/index.d.ts +0 -11
  304. package/src/rules/no-unencrypted-transmission/index.js +0 -236
  305. package/src/rules/no-unescaped-url-parameter/index.d.ts +0 -9
  306. package/src/rules/no-unescaped-url-parameter/index.js +0 -355
  307. package/src/rules/no-unlimited-resource-allocation/index.d.ts +0 -12
  308. package/src/rules/no-unlimited-resource-allocation/index.js +0 -643
  309. package/src/rules/no-unsafe-deserialization/index.d.ts +0 -10
  310. package/src/rules/no-unsafe-deserialization/index.js +0 -491
  311. package/src/rules/no-unsafe-dynamic-require/index.d.ts +0 -5
  312. package/src/rules/no-unsafe-dynamic-require/index.js +0 -106
  313. package/src/rules/no-unsafe-regex-construction/index.d.ts +0 -9
  314. package/src/rules/no-unsafe-regex-construction/index.js +0 -291
  315. package/src/rules/no-unsanitized-html/index.d.ts +0 -9
  316. package/src/rules/no-unsanitized-html/index.js +0 -335
  317. package/src/rules/no-unvalidated-deeplinks/index.d.ts +0 -6
  318. package/src/rules/no-unvalidated-deeplinks/index.js +0 -62
  319. package/src/rules/no-unvalidated-user-input/index.d.ts +0 -9
  320. package/src/rules/no-unvalidated-user-input/index.js +0 -420
  321. package/src/rules/no-verbose-error-messages/index.d.ts +0 -8
  322. package/src/rules/no-verbose-error-messages/index.js +0 -68
  323. package/src/rules/no-weak-crypto/index.d.ts +0 -11
  324. package/src/rules/no-weak-crypto/index.js +0 -351
  325. package/src/rules/no-weak-password-recovery/index.d.ts +0 -12
  326. package/src/rules/no-weak-password-recovery/index.js +0 -424
  327. package/src/rules/no-xpath-injection/index.d.ts +0 -10
  328. package/src/rules/no-xpath-injection/index.js +0 -487
  329. package/src/rules/no-xxe-injection/index.d.ts +0 -7
  330. package/src/rules/no-xxe-injection/index.js +0 -266
  331. package/src/rules/no-zip-slip/index.d.ts +0 -9
  332. package/src/rules/no-zip-slip/index.js +0 -445
  333. package/src/rules/require-backend-authorization/index.d.ts +0 -6
  334. package/src/rules/require-backend-authorization/index.js +0 -60
  335. package/src/rules/require-code-minification/index.d.ts +0 -8
  336. package/src/rules/require-code-minification/index.js +0 -47
  337. package/src/rules/require-csp-headers/index.d.ts +0 -6
  338. package/src/rules/require-csp-headers/index.js +0 -64
  339. package/src/rules/require-data-minimization/index.d.ts +0 -8
  340. package/src/rules/require-data-minimization/index.js +0 -53
  341. package/src/rules/require-dependency-integrity/index.d.ts +0 -6
  342. package/src/rules/require-dependency-integrity/index.js +0 -64
  343. package/src/rules/require-https-only/index.d.ts +0 -8
  344. package/src/rules/require-https-only/index.js +0 -62
  345. package/src/rules/require-mime-type-validation/index.d.ts +0 -6
  346. package/src/rules/require-mime-type-validation/index.js +0 -66
  347. package/src/rules/require-network-timeout/index.d.ts +0 -8
  348. package/src/rules/require-network-timeout/index.js +0 -50
  349. package/src/rules/require-package-lock/index.d.ts +0 -8
  350. package/src/rules/require-package-lock/index.js +0 -63
  351. package/src/rules/require-secure-credential-storage/index.d.ts +0 -8
  352. package/src/rules/require-secure-credential-storage/index.js +0 -50
  353. package/src/rules/require-secure-defaults/index.d.ts +0 -8
  354. package/src/rules/require-secure-defaults/index.js +0 -47
  355. package/src/rules/require-secure-deletion/index.d.ts +0 -8
  356. package/src/rules/require-secure-deletion/index.js +0 -44
  357. package/src/rules/require-storage-encryption/index.d.ts +0 -8
  358. package/src/rules/require-storage-encryption/index.js +0 -50
  359. package/src/rules/require-url-validation/index.d.ts +0 -6
  360. package/src/rules/require-url-validation/index.js +0 -72
  361. package/src/types/index.js +0 -17
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Comprehensive tests for no-missing-cors-check rule
3
+ * CWE-346: Origin Validation Error
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 { noMissingCorsCheck } 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-missing-cors-check', () => {
31
+ describe('Valid Code', () => {
32
+ ruleTester.run('valid - proper CORS validation', noMissingCorsCheck, {
33
+ valid: [
34
+ // CORS with origin validation
35
+ {
36
+ code: `
37
+ app.use(cors({
38
+ origin: (origin, callback) => {
39
+ if (allowedOrigins.includes(origin)) {
40
+ callback(null, true);
41
+ } else {
42
+ callback(new Error('Not allowed'));
43
+ }
44
+ }
45
+ }));
46
+ `,
47
+ },
48
+ // CORS with allowed origins array
49
+ {
50
+ code: 'app.use(cors({ origin: allowedOrigins }));',
51
+ },
52
+ // CORS with trusted library
53
+ {
54
+ code: 'app.use(cors({ origin: "https://example.com" }));',
55
+ },
56
+ // Test files (when allowInTests is true)
57
+ {
58
+ code: 'app.use(cors({ origin: "*" }));',
59
+ filename: 'test.spec.ts',
60
+ options: [{ allowInTests: true }],
61
+ },
62
+ // Ignored patterns
63
+ {
64
+ code: 'app.use(cors({ origin: safeOrigin }));',
65
+ options: [{ ignorePatterns: ['safeOrigin'] }],
66
+ },
67
+ ],
68
+ invalid: [],
69
+ });
70
+ });
71
+
72
+ describe('Invalid Code - Wildcard Origin', () => {
73
+ ruleTester.run('invalid - wildcard CORS origin', noMissingCorsCheck, {
74
+ valid: [],
75
+ invalid: [
76
+ {
77
+ code: 'app.use(cors({ origin: "*" }));',
78
+ errors: [
79
+ {
80
+ messageId: 'missingCorsCheck',
81
+ // Note: Suggestions are provided by the rule but not recognized by test framework
82
+ // because fix returns null (suggestions are not auto-fixable)
83
+ },
84
+ ],
85
+ },
86
+ {
87
+ code: 'app.use(cors({ origin: "*", credentials: true }));',
88
+ errors: [
89
+ {
90
+ messageId: 'missingCorsCheck',
91
+ },
92
+ ],
93
+ },
94
+ ],
95
+ });
96
+ });
97
+
98
+ describe('Invalid Code - CORS Headers', () => {
99
+ ruleTester.run('invalid - wildcard CORS header', noMissingCorsCheck, {
100
+ valid: [],
101
+ invalid: [
102
+ {
103
+ code: 'res.setHeader("Access-Control-Allow-Origin", "*");',
104
+ errors: [
105
+ {
106
+ messageId: 'missingCorsCheck',
107
+ },
108
+ ],
109
+ },
110
+ {
111
+ code: 'res.header("Access-Control-Allow-Origin", "*");',
112
+ errors: [
113
+ {
114
+ messageId: 'missingCorsCheck',
115
+ },
116
+ ],
117
+ },
118
+ ],
119
+ });
120
+ });
121
+
122
+ describe('Options', () => {
123
+ ruleTester.run('options - allowInTests', noMissingCorsCheck, {
124
+ valid: [
125
+ {
126
+ code: 'app.use(cors({ origin: "*" }));',
127
+ filename: 'test.spec.ts',
128
+ options: [{ allowInTests: true }],
129
+ },
130
+ ],
131
+ invalid: [
132
+ {
133
+ code: 'app.use(cors({ origin: "*" }));',
134
+ filename: 'server.ts',
135
+ options: [{ allowInTests: true }],
136
+ errors: [
137
+ {
138
+ messageId: 'missingCorsCheck',
139
+ },
140
+ ],
141
+ },
142
+ ],
143
+ });
144
+
145
+ ruleTester.run('options - ignorePatterns with invalid regex', noMissingCorsCheck, {
146
+ valid: [
147
+ {
148
+ code: 'app.use(cors({ origin: testOrigin }));',
149
+ options: [{ ignorePatterns: ['['] }], // Invalid regex should be caught
150
+ },
151
+ ],
152
+ invalid: [],
153
+ });
154
+
155
+ ruleTester.run('options - trustedLibraries', noMissingCorsCheck, {
156
+ valid: [
157
+ {
158
+ code: 'app.use(myCors({ origin: "*" }));',
159
+ options: [{ trustedLibraries: ['myCors'] }],
160
+ },
161
+ ],
162
+ invalid: [],
163
+ });
164
+ });
165
+
166
+ describe('Edge Cases', () => {
167
+ ruleTester.run('edge cases - non-wildcard literal', noMissingCorsCheck, {
168
+ valid: [
169
+ {
170
+ code: 'app.use(cors({ origin: "https://example.com" }));',
171
+ },
172
+ {
173
+ code: 'app.use(cors({ origin: 123 }));',
174
+ },
175
+ {
176
+ code: 'app.use(cors({ origin: true }));',
177
+ },
178
+ ],
179
+ invalid: [],
180
+ });
181
+
182
+ ruleTester.run('edge cases - non-CORS context', noMissingCorsCheck, {
183
+ valid: [
184
+ {
185
+ code: 'const config = { origin: "*" };',
186
+ },
187
+ {
188
+ code: 'const data = { allowedOrigins: "*" };',
189
+ },
190
+ ],
191
+ invalid: [],
192
+ });
193
+
194
+ ruleTester.run('edge cases - CORS config object validation', noMissingCorsCheck, {
195
+ valid: [
196
+ {
197
+ code: 'app.use(cors({ origin: allowedOrigins, credentials: true }));',
198
+ },
199
+ ],
200
+ invalid: [],
201
+ });
202
+
203
+ ruleTester.run('edge cases - setHeader with non-wildcard', noMissingCorsCheck, {
204
+ valid: [
205
+ {
206
+ code: 'res.setHeader("Access-Control-Allow-Origin", origin);',
207
+ },
208
+ {
209
+ code: 'res.setHeader("Content-Type", "*");',
210
+ },
211
+ ],
212
+ invalid: [],
213
+ });
214
+
215
+ ruleTester.run('edge cases - header with non-Access-Control', noMissingCorsCheck, {
216
+ valid: [
217
+ {
218
+ code: 'res.setHeader("Content-Type", "*");',
219
+ },
220
+ {
221
+ code: 'res.header("Content-Type", "*");',
222
+ },
223
+ ],
224
+ invalid: [],
225
+ });
226
+
227
+ ruleTester.run('edge cases - callExpression without use method', noMissingCorsCheck, {
228
+ valid: [
229
+ {
230
+ code: 'app.get("/api", handler);',
231
+ },
232
+ {
233
+ code: 'router.post("/users", controller);',
234
+ },
235
+ ],
236
+ invalid: [],
237
+ });
238
+
239
+ ruleTester.run('edge cases - literal in CORS context via property', noMissingCorsCheck, {
240
+ valid: [],
241
+ invalid: [
242
+ {
243
+ code: 'app.use(cors({ origin: "*", allowedOrigins: ["https://example.com"] }));',
244
+ errors: [
245
+ {
246
+ messageId: 'missingCorsCheck',
247
+ },
248
+ ],
249
+ },
250
+ ],
251
+ });
252
+
253
+ ruleTester.run('edge cases - literal in isActualCorsContext', noMissingCorsCheck, {
254
+ valid: [],
255
+ invalid: [
256
+ {
257
+ code: 'const config = { origin: "*" }; app.use(cors(config));',
258
+ errors: [
259
+ {
260
+ messageId: 'missingCorsCheck',
261
+ },
262
+ ],
263
+ },
264
+ ],
265
+ });
266
+
267
+ ruleTester.run('edge cases - literal with ignorePatterns', noMissingCorsCheck, {
268
+ valid: [
269
+ {
270
+ code: 'app.use(cors({ origin: "*" }));',
271
+ options: [{ ignorePatterns: ['\\*'] }],
272
+ },
273
+ ],
274
+ invalid: [],
275
+ });
276
+
277
+ ruleTester.run('edge cases - literal in CORS context via first while loop', noMissingCorsCheck, {
278
+ valid: [],
279
+ invalid: [
280
+ {
281
+ code: 'cors({ origin: "*" });',
282
+ errors: [
283
+ {
284
+ messageId: 'missingCorsCheck',
285
+ },
286
+ ],
287
+ },
288
+ ],
289
+ });
290
+
291
+ ruleTester.run('edge cases - property in CORS call (allowedOrigins)', noMissingCorsCheck, {
292
+ valid: [],
293
+ invalid: [
294
+ {
295
+ code: 'app.use(cors({ allowedOrigins: "*" }));',
296
+ errors: [
297
+ {
298
+ messageId: 'missingCorsCheck',
299
+ },
300
+ ],
301
+ },
302
+ ],
303
+ });
304
+
305
+ ruleTester.run('edge cases - memberExpression with ignorePatterns', noMissingCorsCheck, {
306
+ valid: [
307
+ {
308
+ code: 'safeRes.setHeader("Access-Control-Allow-Origin", "*");',
309
+ options: [{ ignorePatterns: ['safeRes'] }],
310
+ },
311
+ ],
312
+ invalid: [],
313
+ });
314
+
315
+ ruleTester.run('edge cases - variable declaration found in scope', noMissingCorsCheck, {
316
+ valid: [],
317
+ invalid: [
318
+ {
319
+ code: `
320
+ const corsConfig = { origin: "*" };
321
+ app.use(cors(corsConfig));
322
+ `,
323
+ errors: [
324
+ {
325
+ messageId: 'missingCorsCheck',
326
+ },
327
+ ],
328
+ },
329
+ ],
330
+ });
331
+
332
+ ruleTester.run('edge cases - isActualCorsContext path (direct cors call)', noMissingCorsCheck, {
333
+ valid: [],
334
+ invalid: [
335
+ {
336
+ code: 'enable(cors({ origin: "*" }));',
337
+ errors: [
338
+ {
339
+ messageId: 'missingCorsCheck',
340
+ },
341
+ ],
342
+ },
343
+ ],
344
+ });
345
+
346
+ ruleTester.run('edge cases - variable in Program scope (line 427)', noMissingCorsCheck, {
347
+ valid: [],
348
+ invalid: [
349
+ {
350
+ code: `
351
+ const myConfig = { origin: "*" };
352
+ app.use(cors(myConfig));
353
+ `,
354
+ errors: [
355
+ {
356
+ messageId: 'missingCorsCheck',
357
+ },
358
+ ],
359
+ },
360
+ ],
361
+ });
362
+
363
+ ruleTester.run('edge cases - variable not found, traverse to root (line 432)', noMissingCorsCheck, {
364
+ valid: [
365
+ {
366
+ code: 'app.use(cors(unknownVar));',
367
+ },
368
+ ],
369
+ invalid: [],
370
+ });
371
+
372
+ ruleTester.run('edge cases - variable in function scope', noMissingCorsCheck, {
373
+ valid: [],
374
+ invalid: [
375
+ {
376
+ code: `
377
+ function setupCors() {
378
+ const config = { origin: "*" };
379
+ app.use(cors(config));
380
+ }
381
+ `,
382
+ errors: [
383
+ {
384
+ messageId: 'missingCorsCheck',
385
+ },
386
+ ],
387
+ },
388
+ ],
389
+ });
390
+ });
391
+ });
392
+
@@ -0,0 +1,229 @@
1
+ /**
2
+ * ESLint Rule: no-missing-csrf-protection
3
+ * Detects missing CSRF token validation in POST/PUT/DELETE requests
4
+ * CWE-352: Cross-Site Request Forgery (CSRF)
5
+ *
6
+ * @see https://cwe.mitre.org/data/definitions/352.html
7
+ * @see https://owasp.org/www-community/attacks/csrf
8
+ */
9
+ import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
10
+ import { AST_NODE_TYPES, formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
11
+ import { createRule } from '@interlace/eslint-devkit';
12
+
13
+ type MessageIds = 'missingCsrfProtection' | 'addCsrfValidation';
14
+
15
+ export interface Options {
16
+ /** Allow missing CSRF protection in test files. Default: false */
17
+ allowInTests?: boolean;
18
+
19
+ /** CSRF middleware patterns to recognize. Default: ['csrf', 'csurf', 'csrfProtection', 'verifyCsrfToken'] */
20
+ csrfMiddlewarePatterns?: string[];
21
+
22
+ /** HTTP methods that require CSRF protection. Default: ['post', 'put', 'delete', 'patch'] */
23
+ protectedMethods?: string[];
24
+
25
+ /** Additional safe patterns to ignore. Default: [] */
26
+ ignorePatterns?: string[];
27
+ }
28
+
29
+ type RuleOptions = [Options?];
30
+
31
+ /**
32
+ * Default CSRF middleware patterns
33
+ */
34
+ const DEFAULT_CSRF_MIDDLEWARE_PATTERNS = [
35
+ 'csrf',
36
+ 'csurf',
37
+ 'csrfProtection',
38
+ 'verifyCsrfToken',
39
+ 'csrfToken',
40
+ 'validateCsrf',
41
+ 'checkCsrf',
42
+ 'csrfMiddleware',
43
+ ];
44
+
45
+ /**
46
+ * Default HTTP methods that require CSRF protection
47
+ */
48
+ const DEFAULT_PROTECTED_METHODS = ['post', 'put', 'delete', 'patch'];
49
+
50
+ /**
51
+ * Check if a string matches any ignore pattern
52
+ */
53
+ function matchesIgnorePattern(text: string, patterns: string[]): boolean {
54
+ return patterns.some(pattern => {
55
+ try {
56
+ const regex = new RegExp(pattern, 'i');
57
+ return regex.test(text);
58
+ } catch {
59
+ return text.toLowerCase().includes(pattern.toLowerCase());
60
+ }
61
+ });
62
+ }
63
+
64
+ export const noMissingCsrfProtection = createRule<RuleOptions, MessageIds>({
65
+ name: 'no-missing-csrf-protection',
66
+ meta: {
67
+ type: 'problem',
68
+ deprecated: true,
69
+ replacedBy: ['@see eslint-plugin-express-security/require-csrf-protection'],
70
+ docs: {
71
+ description: 'Detects missing CSRF token validation in POST/PUT/DELETE requests',
72
+ },
73
+ hasSuggestions: true,
74
+ messages: {
75
+ missingCsrfProtection: formatLLMMessage({
76
+ icon: MessageIcons.SECURITY,
77
+ issueName: 'Missing CSRF Protection',
78
+ cwe: 'CWE-352',
79
+ description: 'Missing CSRF protection detected: {{issue}}',
80
+ severity: 'HIGH',
81
+ fix: '{{safeAlternative}}',
82
+ documentationLink: 'https://cwe.mitre.org/data/definitions/352.html',
83
+ }),
84
+ addCsrfValidation: formatLLMMessage({
85
+ icon: MessageIcons.INFO,
86
+ issueName: 'Add CSRF Validation',
87
+ description: 'Add CSRF middleware',
88
+ severity: 'LOW',
89
+ fix: 'app.use(csrf({ cookie: true }))',
90
+ documentationLink: 'https://github.com/expressjs/csurf',
91
+ }),
92
+ },
93
+ schema: [
94
+ {
95
+ type: 'object',
96
+ properties: {
97
+ allowInTests: {
98
+ type: 'boolean',
99
+ default: false,
100
+ description: 'Allow missing CSRF protection in test files',
101
+ },
102
+ csrfMiddlewarePatterns: {
103
+ type: 'array',
104
+ items: { type: 'string' },
105
+ default: [],
106
+ description: 'CSRF middleware patterns to recognize',
107
+ },
108
+ protectedMethods: {
109
+ type: 'array',
110
+ items: { type: 'string' },
111
+ default: [],
112
+ description: 'HTTP methods that require CSRF protection',
113
+ },
114
+ ignorePatterns: {
115
+ type: 'array',
116
+ items: { type: 'string' },
117
+ default: [],
118
+ description: 'Additional safe patterns to ignore',
119
+ },
120
+ },
121
+ additionalProperties: false,
122
+ },
123
+ ],
124
+ },
125
+ defaultOptions: [
126
+ {
127
+ allowInTests: false,
128
+ csrfMiddlewarePatterns: [],
129
+ protectedMethods: [],
130
+ ignorePatterns: [],
131
+ },
132
+ ],
133
+ create(
134
+ context: TSESLint.RuleContext<MessageIds, RuleOptions>,
135
+ [options = {}]
136
+ ) {
137
+ const {
138
+ allowInTests = false,
139
+ csrfMiddlewarePatterns,
140
+ protectedMethods: customProtectedMethods,
141
+ ignorePatterns = [],
142
+ } = options as Options;
143
+
144
+ const csrfPatterns = csrfMiddlewarePatterns && csrfMiddlewarePatterns.length > 0
145
+ ? csrfMiddlewarePatterns
146
+ : DEFAULT_CSRF_MIDDLEWARE_PATTERNS;
147
+
148
+ const protectedMethods = customProtectedMethods && customProtectedMethods.length > 0
149
+ ? customProtectedMethods
150
+ : DEFAULT_PROTECTED_METHODS;
151
+
152
+ // Pre-compute Set for O(1) lookups (performance optimization)
153
+ const protectedMethodsSet = new Set(protectedMethods.map(m => m.toLowerCase()));
154
+
155
+ const filename = context.filename;
156
+ const isTestFile = allowInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
157
+ const sourceCode = context.sourceCode;
158
+
159
+ function checkCallExpression(node: TSESTree.CallExpression) {
160
+ if (isTestFile) {
161
+ return;
162
+ }
163
+
164
+ const callee = node.callee;
165
+ const callText = sourceCode.getText(node);
166
+
167
+ // Check if it matches any ignore pattern
168
+ if (matchesIgnorePattern(callText, ignorePatterns)) {
169
+ return;
170
+ }
171
+
172
+ // Check for route handler methods (app.post, router.put, etc.)
173
+ if (callee.type === AST_NODE_TYPES.MemberExpression && callee.property.type === AST_NODE_TYPES.Identifier) {
174
+ const methodName = callee.property.name;
175
+
176
+ // Only check if it's a route handler that requires CSRF (O(1) Set lookup)
177
+ if (protectedMethodsSet.has(methodName.toLowerCase())) {
178
+ // Must have at least 2 arguments (path and handler)
179
+ if (node.arguments.length < 2) {
180
+ return;
181
+ }
182
+
183
+ // Check if CSRF middleware is in the route chain arguments
184
+ let hasCsrfInChain = false;
185
+
186
+ // Check if any argument (after the first path argument) is a CSRF middleware
187
+ // Skip the first argument (path) and check the rest
188
+ for (let i = 1; i < node.arguments.length; i++) {
189
+ const arg = node.arguments[i];
190
+ const argText = sourceCode.getText(arg);
191
+ if (csrfPatterns.some(pattern => argText.toLowerCase().includes(pattern.toLowerCase()))) {
192
+ hasCsrfInChain = true;
193
+ break;
194
+ }
195
+ }
196
+
197
+ if (!hasCsrfInChain) {
198
+ context.report({
199
+ node,
200
+ messageId: 'missingCsrfProtection',
201
+ data: {
202
+ issue: `${methodName.toUpperCase()} route handler missing CSRF protection`,
203
+ safeAlternative: `Add CSRF middleware: app.${methodName}("/path", csrf(), handler) or use app.use(csrf()) globally`,
204
+ },
205
+ suggest: [
206
+ {
207
+ messageId: 'addCsrfValidation',
208
+ fix(fixer: TSESLint.RuleFixer) {
209
+ // Add CSRF middleware after the first argument (path)
210
+ const firstArg = node.arguments[0];
211
+ if (firstArg) {
212
+ return fixer.insertTextAfter(firstArg, ', csrf()');
213
+ }
214
+ return null;
215
+ },
216
+ },
217
+ ],
218
+ });
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ return {
225
+ CallExpression: checkCallExpression,
226
+ };
227
+ },
228
+ });
229
+