eslint-plugin-secure-coding 2.3.3 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +2 -2
  3. package/package.json +1 -1
  4. package/src/index.d.ts +32 -0
  5. package/src/index.js +416 -0
  6. package/src/rules/detect-child-process/index.d.ts +11 -0
  7. package/src/rules/detect-child-process/index.js +529 -0
  8. package/src/rules/detect-eval-with-expression/index.d.ts +9 -0
  9. package/src/rules/detect-eval-with-expression/index.js +392 -0
  10. package/src/rules/detect-mixed-content/index.d.ts +8 -0
  11. package/src/rules/detect-mixed-content/index.js +44 -0
  12. package/src/rules/detect-non-literal-fs-filename/index.d.ts +7 -0
  13. package/src/rules/detect-non-literal-fs-filename/index.js +454 -0
  14. package/src/rules/detect-non-literal-regexp/index.d.ts +9 -0
  15. package/src/rules/detect-non-literal-regexp/index.js +403 -0
  16. package/src/rules/detect-object-injection/index.d.ts +11 -0
  17. package/src/rules/detect-object-injection/index.js +560 -0
  18. package/src/rules/detect-suspicious-dependencies/index.d.ts +8 -0
  19. package/src/rules/detect-suspicious-dependencies/index.js +71 -0
  20. package/src/rules/detect-weak-password-validation/index.d.ts +6 -0
  21. package/src/rules/detect-weak-password-validation/index.js +58 -0
  22. package/src/rules/no-allow-arbitrary-loads/index.d.ts +8 -0
  23. package/src/rules/no-allow-arbitrary-loads/index.js +47 -0
  24. package/src/rules/no-arbitrary-file-access/index.d.ts +13 -0
  25. package/src/rules/no-arbitrary-file-access/index.js +195 -0
  26. package/src/rules/no-buffer-overread/index.d.ts +29 -0
  27. package/src/rules/no-buffer-overread/index.js +606 -0
  28. package/src/rules/no-clickjacking/index.d.ts +10 -0
  29. package/src/rules/no-clickjacking/index.js +396 -0
  30. package/src/rules/no-client-side-auth-logic/index.d.ts +6 -0
  31. package/src/rules/no-client-side-auth-logic/index.js +69 -0
  32. package/src/rules/no-credentials-in-query-params/index.d.ts +8 -0
  33. package/src/rules/no-credentials-in-query-params/index.js +57 -0
  34. package/src/rules/no-data-in-temp-storage/index.d.ts +6 -0
  35. package/src/rules/no-data-in-temp-storage/index.js +64 -0
  36. package/src/rules/no-debug-code-in-production/index.d.ts +8 -0
  37. package/src/rules/no-debug-code-in-production/index.js +51 -0
  38. package/src/rules/no-directive-injection/index.d.ts +12 -0
  39. package/src/rules/no-directive-injection/index.js +457 -0
  40. package/src/rules/no-disabled-certificate-validation/index.d.ts +6 -0
  41. package/src/rules/no-disabled-certificate-validation/index.js +61 -0
  42. package/src/rules/no-dynamic-dependency-loading/index.d.ts +8 -0
  43. package/src/rules/no-dynamic-dependency-loading/index.js +51 -0
  44. package/src/rules/no-electron-security-issues/index.d.ts +10 -0
  45. package/src/rules/no-electron-security-issues/index.js +423 -0
  46. package/src/rules/no-exposed-debug-endpoints/index.d.ts +6 -0
  47. package/src/rules/no-exposed-debug-endpoints/index.js +62 -0
  48. package/src/rules/no-exposed-sensitive-data/index.d.ts +11 -0
  49. package/src/rules/no-exposed-sensitive-data/index.js +340 -0
  50. package/src/rules/no-format-string-injection/index.d.ts +17 -0
  51. package/src/rules/no-format-string-injection/index.js +660 -0
  52. package/src/rules/no-graphql-injection/index.d.ts +12 -0
  53. package/src/rules/no-graphql-injection/index.js +411 -0
  54. package/src/rules/no-hardcoded-credentials/index.d.ts +26 -0
  55. package/src/rules/no-hardcoded-credentials/index.js +376 -0
  56. package/src/rules/no-hardcoded-session-tokens/index.d.ts +6 -0
  57. package/src/rules/no-hardcoded-session-tokens/index.js +59 -0
  58. package/src/rules/no-http-urls/index.d.ts +12 -0
  59. package/src/rules/no-http-urls/index.js +114 -0
  60. package/src/rules/no-improper-sanitization/index.d.ts +12 -0
  61. package/src/rules/no-improper-sanitization/index.js +411 -0
  62. package/src/rules/no-improper-type-validation/index.d.ts +10 -0
  63. package/src/rules/no-improper-type-validation/index.js +475 -0
  64. package/src/rules/no-insecure-comparison/index.d.ts +7 -0
  65. package/src/rules/no-insecure-comparison/index.js +193 -0
  66. package/src/rules/no-insecure-redirects/index.d.ts +7 -0
  67. package/src/rules/no-insecure-redirects/index.js +216 -0
  68. package/src/rules/no-insecure-websocket/index.d.ts +6 -0
  69. package/src/rules/no-insecure-websocket/index.js +61 -0
  70. package/src/rules/no-ldap-injection/index.d.ts +10 -0
  71. package/src/rules/no-ldap-injection/index.js +455 -0
  72. package/src/rules/no-missing-authentication/index.d.ts +13 -0
  73. package/src/rules/no-missing-authentication/index.js +333 -0
  74. package/src/rules/no-missing-cors-check/index.d.ts +9 -0
  75. package/src/rules/no-missing-cors-check/index.js +399 -0
  76. package/src/rules/no-missing-csrf-protection/index.d.ts +11 -0
  77. package/src/rules/no-missing-csrf-protection/index.js +180 -0
  78. package/src/rules/no-missing-security-headers/index.d.ts +7 -0
  79. package/src/rules/no-missing-security-headers/index.js +218 -0
  80. package/src/rules/no-password-in-url/index.d.ts +8 -0
  81. package/src/rules/no-password-in-url/index.js +54 -0
  82. package/src/rules/no-permissive-cors/index.d.ts +8 -0
  83. package/src/rules/no-permissive-cors/index.js +65 -0
  84. package/src/rules/no-pii-in-logs/index.d.ts +8 -0
  85. package/src/rules/no-pii-in-logs/index.js +70 -0
  86. package/src/rules/no-privilege-escalation/index.d.ts +13 -0
  87. package/src/rules/no-privilege-escalation/index.js +321 -0
  88. package/src/rules/no-redos-vulnerable-regex/index.d.ts +7 -0
  89. package/src/rules/no-redos-vulnerable-regex/index.js +306 -0
  90. package/src/rules/no-sensitive-data-exposure/index.d.ts +11 -0
  91. package/src/rules/no-sensitive-data-exposure/index.js +250 -0
  92. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +8 -0
  93. package/src/rules/no-sensitive-data-in-analytics/index.js +62 -0
  94. package/src/rules/no-sensitive-data-in-cache/index.d.ts +8 -0
  95. package/src/rules/no-sensitive-data-in-cache/index.js +52 -0
  96. package/src/rules/no-toctou-vulnerability/index.d.ts +7 -0
  97. package/src/rules/no-toctou-vulnerability/index.js +208 -0
  98. package/src/rules/no-tracking-without-consent/index.d.ts +6 -0
  99. package/src/rules/no-tracking-without-consent/index.js +67 -0
  100. package/src/rules/no-unchecked-loop-condition/index.d.ts +12 -0
  101. package/src/rules/no-unchecked-loop-condition/index.js +646 -0
  102. package/src/rules/no-unencrypted-transmission/index.d.ts +11 -0
  103. package/src/rules/no-unencrypted-transmission/index.js +236 -0
  104. package/src/rules/no-unescaped-url-parameter/index.d.ts +9 -0
  105. package/src/rules/no-unescaped-url-parameter/index.js +355 -0
  106. package/src/rules/no-unlimited-resource-allocation/index.d.ts +12 -0
  107. package/src/rules/no-unlimited-resource-allocation/index.js +643 -0
  108. package/src/rules/no-unsafe-deserialization/index.d.ts +10 -0
  109. package/src/rules/no-unsafe-deserialization/index.js +491 -0
  110. package/src/rules/no-unsafe-dynamic-require/index.d.ts +5 -0
  111. package/src/rules/no-unsafe-dynamic-require/index.js +106 -0
  112. package/src/rules/no-unsafe-regex-construction/index.d.ts +9 -0
  113. package/src/rules/no-unsafe-regex-construction/index.js +291 -0
  114. package/src/rules/no-unvalidated-deeplinks/index.d.ts +6 -0
  115. package/src/rules/no-unvalidated-deeplinks/index.js +62 -0
  116. package/src/rules/no-unvalidated-user-input/index.d.ts +9 -0
  117. package/src/rules/no-unvalidated-user-input/index.js +420 -0
  118. package/src/rules/no-verbose-error-messages/index.d.ts +8 -0
  119. package/src/rules/no-verbose-error-messages/index.js +68 -0
  120. package/src/rules/no-weak-password-recovery/index.d.ts +12 -0
  121. package/src/rules/no-weak-password-recovery/index.js +424 -0
  122. package/src/rules/no-xpath-injection/index.d.ts +10 -0
  123. package/src/rules/no-xpath-injection/index.js +487 -0
  124. package/src/rules/no-xxe-injection/index.d.ts +7 -0
  125. package/src/rules/no-xxe-injection/index.js +266 -0
  126. package/src/rules/no-zip-slip/index.d.ts +9 -0
  127. package/src/rules/no-zip-slip/index.js +445 -0
  128. package/src/rules/require-backend-authorization/index.d.ts +6 -0
  129. package/src/rules/require-backend-authorization/index.js +60 -0
  130. package/src/rules/require-code-minification/index.d.ts +8 -0
  131. package/src/rules/require-code-minification/index.js +47 -0
  132. package/src/rules/require-csp-headers/index.d.ts +6 -0
  133. package/src/rules/require-csp-headers/index.js +64 -0
  134. package/src/rules/require-data-minimization/index.d.ts +8 -0
  135. package/src/rules/require-data-minimization/index.js +53 -0
  136. package/src/rules/require-dependency-integrity/index.d.ts +6 -0
  137. package/src/rules/require-dependency-integrity/index.js +64 -0
  138. package/src/rules/require-https-only/index.d.ts +8 -0
  139. package/src/rules/require-https-only/index.js +62 -0
  140. package/src/rules/require-mime-type-validation/index.d.ts +6 -0
  141. package/src/rules/require-mime-type-validation/index.js +66 -0
  142. package/src/rules/require-network-timeout/index.d.ts +8 -0
  143. package/src/rules/require-network-timeout/index.js +50 -0
  144. package/src/rules/require-package-lock/index.d.ts +8 -0
  145. package/src/rules/require-package-lock/index.js +63 -0
  146. package/src/rules/require-secure-credential-storage/index.d.ts +8 -0
  147. package/src/rules/require-secure-credential-storage/index.js +50 -0
  148. package/src/rules/require-secure-defaults/index.d.ts +8 -0
  149. package/src/rules/require-secure-defaults/index.js +47 -0
  150. package/src/rules/require-secure-deletion/index.d.ts +8 -0
  151. package/src/rules/require-secure-deletion/index.js +44 -0
  152. package/src/rules/require-storage-encryption/index.d.ts +8 -0
  153. package/src/rules/require-storage-encryption/index.js +50 -0
  154. package/src/rules/require-url-validation/index.d.ts +6 -0
  155. package/src/rules/require-url-validation/index.js +72 -0
  156. package/src/types/index.d.ts +106 -0
  157. package/src/types/index.js +16 -0
  158. package/src/index.ts +0 -605
  159. package/src/rules/__tests__/integration-demo.test.ts +0 -290
  160. package/src/rules/__tests__/integration-llm.test.ts +0 -89
  161. package/src/rules/database-injection/database-injection.test.ts +0 -456
  162. package/src/rules/database-injection/index.ts +0 -488
  163. package/src/rules/detect-child-process/detect-child-process.test.ts +0 -207
  164. package/src/rules/detect-child-process/index.ts +0 -634
  165. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +0 -416
  166. package/src/rules/detect-eval-with-expression/index.ts +0 -463
  167. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +0 -28
  168. package/src/rules/detect-mixed-content/index.ts +0 -52
  169. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +0 -269
  170. package/src/rules/detect-non-literal-fs-filename/index.ts +0 -551
  171. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +0 -189
  172. package/src/rules/detect-non-literal-regexp/index.ts +0 -490
  173. package/src/rules/detect-object-injection/detect-object-injection.test.ts +0 -440
  174. package/src/rules/detect-object-injection/index.ts +0 -674
  175. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +0 -32
  176. package/src/rules/detect-suspicious-dependencies/index.ts +0 -84
  177. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +0 -31
  178. package/src/rules/detect-weak-password-validation/index.ts +0 -68
  179. package/src/rules/no-allow-arbitrary-loads/index.ts +0 -54
  180. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +0 -28
  181. package/src/rules/no-arbitrary-file-access/index.ts +0 -238
  182. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +0 -119
  183. package/src/rules/no-buffer-overread/index.ts +0 -724
  184. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +0 -313
  185. package/src/rules/no-clickjacking/index.ts +0 -481
  186. package/src/rules/no-clickjacking/no-clickjacking.test.ts +0 -253
  187. package/src/rules/no-client-side-auth-logic/index.ts +0 -81
  188. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +0 -33
  189. package/src/rules/no-credentials-in-query-params/index.ts +0 -69
  190. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +0 -33
  191. package/src/rules/no-credentials-in-storage-api/index.ts +0 -64
  192. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +0 -31
  193. package/src/rules/no-data-in-temp-storage/index.ts +0 -75
  194. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +0 -33
  195. package/src/rules/no-debug-code-in-production/index.ts +0 -59
  196. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +0 -26
  197. package/src/rules/no-directive-injection/index.ts +0 -551
  198. package/src/rules/no-directive-injection/no-directive-injection.test.ts +0 -305
  199. package/src/rules/no-disabled-certificate-validation/index.ts +0 -72
  200. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +0 -33
  201. package/src/rules/no-document-cookie/index.ts +0 -113
  202. package/src/rules/no-document-cookie/no-document-cookie.test.ts +0 -382
  203. package/src/rules/no-dynamic-dependency-loading/index.ts +0 -60
  204. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +0 -27
  205. package/src/rules/no-electron-security-issues/index.ts +0 -504
  206. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +0 -324
  207. package/src/rules/no-exposed-debug-endpoints/index.ts +0 -73
  208. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +0 -40
  209. package/src/rules/no-exposed-sensitive-data/index.ts +0 -428
  210. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +0 -75
  211. package/src/rules/no-format-string-injection/index.ts +0 -801
  212. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +0 -437
  213. package/src/rules/no-graphql-injection/index.ts +0 -508
  214. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +0 -371
  215. package/src/rules/no-hardcoded-credentials/index.ts +0 -478
  216. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +0 -639
  217. package/src/rules/no-hardcoded-session-tokens/index.ts +0 -69
  218. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +0 -42
  219. package/src/rules/no-http-urls/index.ts +0 -131
  220. package/src/rules/no-http-urls/no-http-urls.test.ts +0 -60
  221. package/src/rules/no-improper-sanitization/index.ts +0 -502
  222. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +0 -156
  223. package/src/rules/no-improper-type-validation/index.ts +0 -572
  224. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +0 -372
  225. package/src/rules/no-insecure-comparison/index.ts +0 -232
  226. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +0 -218
  227. package/src/rules/no-insecure-cookie-settings/index.ts +0 -391
  228. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +0 -409
  229. package/src/rules/no-insecure-jwt/index.ts +0 -467
  230. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +0 -259
  231. package/src/rules/no-insecure-redirects/index.ts +0 -267
  232. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +0 -108
  233. package/src/rules/no-insecure-websocket/index.ts +0 -72
  234. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +0 -42
  235. package/src/rules/no-insufficient-postmessage-validation/index.ts +0 -497
  236. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +0 -360
  237. package/src/rules/no-insufficient-random/index.ts +0 -288
  238. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +0 -246
  239. package/src/rules/no-ldap-injection/index.ts +0 -547
  240. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +0 -317
  241. package/src/rules/no-missing-authentication/index.ts +0 -408
  242. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +0 -350
  243. package/src/rules/no-missing-cors-check/index.ts +0 -453
  244. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +0 -392
  245. package/src/rules/no-missing-csrf-protection/index.ts +0 -229
  246. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +0 -222
  247. package/src/rules/no-missing-security-headers/index.ts +0 -266
  248. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +0 -98
  249. package/src/rules/no-password-in-url/index.ts +0 -64
  250. package/src/rules/no-password-in-url/no-password-in-url.test.ts +0 -27
  251. package/src/rules/no-permissive-cors/index.ts +0 -78
  252. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +0 -28
  253. package/src/rules/no-pii-in-logs/index.ts +0 -83
  254. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +0 -26
  255. package/src/rules/no-postmessage-origin-wildcard/index.ts +0 -67
  256. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +0 -27
  257. package/src/rules/no-privilege-escalation/index.ts +0 -403
  258. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +0 -306
  259. package/src/rules/no-redos-vulnerable-regex/index.ts +0 -379
  260. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +0 -83
  261. package/src/rules/no-sensitive-data-exposure/index.ts +0 -294
  262. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +0 -262
  263. package/src/rules/no-sensitive-data-in-analytics/index.ts +0 -73
  264. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +0 -42
  265. package/src/rules/no-sensitive-data-in-cache/index.ts +0 -59
  266. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +0 -32
  267. package/src/rules/no-sql-injection/index.ts +0 -424
  268. package/src/rules/no-sql-injection/no-sql-injection.test.ts +0 -303
  269. package/src/rules/no-timing-attack/index.ts +0 -552
  270. package/src/rules/no-timing-attack/no-timing-attack.test.ts +0 -348
  271. package/src/rules/no-toctou-vulnerability/index.ts +0 -250
  272. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +0 -60
  273. package/src/rules/no-tracking-without-consent/index.ts +0 -78
  274. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +0 -34
  275. package/src/rules/no-unchecked-loop-condition/index.ts +0 -781
  276. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +0 -459
  277. package/src/rules/no-unencrypted-local-storage/index.ts +0 -73
  278. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +0 -41
  279. package/src/rules/no-unencrypted-transmission/index.ts +0 -296
  280. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +0 -287
  281. package/src/rules/no-unescaped-url-parameter/index.ts +0 -424
  282. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +0 -263
  283. package/src/rules/no-unlimited-resource-allocation/index.ts +0 -767
  284. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +0 -544
  285. package/src/rules/no-unsafe-deserialization/index.ts +0 -593
  286. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +0 -310
  287. package/src/rules/no-unsafe-dynamic-require/index.ts +0 -125
  288. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +0 -151
  289. package/src/rules/no-unsafe-regex-construction/index.ts +0 -370
  290. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +0 -181
  291. package/src/rules/no-unsanitized-html/index.ts +0 -400
  292. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +0 -488
  293. package/src/rules/no-unvalidated-deeplinks/index.ts +0 -73
  294. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +0 -29
  295. package/src/rules/no-unvalidated-user-input/index.ts +0 -498
  296. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +0 -463
  297. package/src/rules/no-verbose-error-messages/index.ts +0 -83
  298. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +0 -34
  299. package/src/rules/no-weak-crypto/index.ts +0 -447
  300. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +0 -297
  301. package/src/rules/no-weak-password-recovery/index.ts +0 -509
  302. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +0 -184
  303. package/src/rules/no-xpath-injection/index.ts +0 -596
  304. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +0 -405
  305. package/src/rules/no-xxe-injection/index.ts +0 -342
  306. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +0 -122
  307. package/src/rules/no-zip-slip/index.ts +0 -526
  308. package/src/rules/no-zip-slip/no-zip-slip.test.ts +0 -305
  309. package/src/rules/require-backend-authorization/index.ts +0 -71
  310. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +0 -31
  311. package/src/rules/require-code-minification/index.ts +0 -54
  312. package/src/rules/require-code-minification/require-code-minification.test.ts +0 -30
  313. package/src/rules/require-csp-headers/index.ts +0 -74
  314. package/src/rules/require-csp-headers/require-csp-headers.test.ts +0 -34
  315. package/src/rules/require-data-minimization/index.ts +0 -65
  316. package/src/rules/require-data-minimization/require-data-minimization.test.ts +0 -31
  317. package/src/rules/require-dependency-integrity/index.ts +0 -78
  318. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +0 -44
  319. package/src/rules/require-https-only/index.ts +0 -75
  320. package/src/rules/require-https-only/require-https-only.test.ts +0 -26
  321. package/src/rules/require-mime-type-validation/index.ts +0 -77
  322. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +0 -32
  323. package/src/rules/require-network-timeout/index.ts +0 -58
  324. package/src/rules/require-network-timeout/require-network-timeout.test.ts +0 -26
  325. package/src/rules/require-package-lock/index.ts +0 -75
  326. package/src/rules/require-package-lock/require-package-lock.test.ts +0 -27
  327. package/src/rules/require-secure-credential-storage/index.ts +0 -60
  328. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +0 -26
  329. package/src/rules/require-secure-defaults/index.ts +0 -54
  330. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +0 -26
  331. package/src/rules/require-secure-deletion/index.ts +0 -52
  332. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +0 -29
  333. package/src/rules/require-storage-encryption/index.ts +0 -60
  334. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +0 -26
  335. package/src/rules/require-url-validation/index.ts +0 -85
  336. package/src/rules/require-url-validation/require-url-validation.test.ts +0 -32
  337. package/src/types/index.ts +0 -235
@@ -0,0 +1,487 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noXpathInjection = void 0;
4
+ const eslint_devkit_1 = require("@interlace/eslint-devkit");
5
+ const eslint_devkit_2 = require("@interlace/eslint-devkit");
6
+ const eslint_devkit_3 = require("@interlace/eslint-devkit");
7
+ exports.noXpathInjection = (0, eslint_devkit_1.createRule)({
8
+ name: 'no-xpath-injection',
9
+ meta: {
10
+ type: 'problem',
11
+ docs: {
12
+ description: 'Detects XPath injection vulnerabilities',
13
+ },
14
+ fixable: 'code',
15
+ hasSuggestions: true,
16
+ messages: {
17
+ xpathInjection: (0, eslint_devkit_2.formatLLMMessage)({
18
+ icon: eslint_devkit_2.MessageIcons.SECURITY,
19
+ issueName: 'XPath Injection',
20
+ cwe: 'CWE-643',
21
+ description: 'XPath injection vulnerability detected',
22
+ severity: '{{severity}}',
23
+ fix: '{{safeAlternative}}',
24
+ documentationLink: 'https://cwe.mitre.org/data/definitions/643.html',
25
+ }),
26
+ unsafeXpathConcatenation: (0, eslint_devkit_2.formatLLMMessage)({
27
+ icon: eslint_devkit_2.MessageIcons.SECURITY,
28
+ issueName: 'Unsafe XPath Concatenation',
29
+ cwe: 'CWE-643',
30
+ description: 'Unsafe string concatenation in XPath expression',
31
+ severity: 'HIGH',
32
+ fix: 'Use parameterized XPath or escape user input',
33
+ documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
34
+ }),
35
+ unvalidatedXpathInput: (0, eslint_devkit_2.formatLLMMessage)({
36
+ icon: eslint_devkit_2.MessageIcons.SECURITY,
37
+ issueName: 'Unvalidated XPath Input',
38
+ cwe: 'CWE-643',
39
+ description: 'XPath query uses unvalidated user input',
40
+ severity: 'MEDIUM',
41
+ fix: 'Validate and sanitize XPath input before use',
42
+ documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
43
+ }),
44
+ dangerousXpathExpression: (0, eslint_devkit_2.formatLLMMessage)({
45
+ icon: eslint_devkit_2.MessageIcons.SECURITY,
46
+ issueName: 'Dangerous XPath Expression',
47
+ cwe: 'CWE-643',
48
+ description: 'XPath expression allows dangerous operations',
49
+ severity: 'MEDIUM',
50
+ fix: 'Restrict XPath to safe patterns and validate expressions',
51
+ documentationLink: 'https://cwe.mitre.org/data/definitions/643.html',
52
+ }),
53
+ useParameterizedXpath: (0, eslint_devkit_2.formatLLMMessage)({
54
+ icon: eslint_devkit_2.MessageIcons.INFO,
55
+ issueName: 'Use Parameterized XPath',
56
+ description: 'Use parameterized XPath queries',
57
+ severity: 'LOW',
58
+ fix: 'Construct XPath with proper escaping and validation',
59
+ documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
60
+ }),
61
+ escapeXpathInput: (0, eslint_devkit_2.formatLLMMessage)({
62
+ icon: eslint_devkit_2.MessageIcons.INFO,
63
+ issueName: 'Escape XPath Input',
64
+ description: 'Escape special characters in XPath input',
65
+ severity: 'LOW',
66
+ fix: 'Use xpath.escape() or equivalent escaping function',
67
+ documentationLink: 'https://www.npmjs.com/package/xpath-escape',
68
+ }),
69
+ validateXpathQueries: (0, eslint_devkit_2.formatLLMMessage)({
70
+ icon: eslint_devkit_2.MessageIcons.INFO,
71
+ issueName: 'Validate XPath Queries',
72
+ description: 'Validate XPath queries against allowed patterns',
73
+ severity: 'LOW',
74
+ fix: 'Whitelist allowed XPath operations and validate syntax',
75
+ documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
76
+ }),
77
+ strategyParameterizedQueries: (0, eslint_devkit_2.formatLLMMessage)({
78
+ icon: eslint_devkit_2.MessageIcons.STRATEGY,
79
+ issueName: 'Parameterized Queries Strategy',
80
+ description: 'Use parameterized XPath construction',
81
+ severity: 'LOW',
82
+ fix: 'Build XPath queries programmatically with escaped parameters',
83
+ documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
84
+ }),
85
+ strategyInputValidation: (0, eslint_devkit_2.formatLLMMessage)({
86
+ icon: eslint_devkit_2.MessageIcons.STRATEGY,
87
+ issueName: 'Input Validation Strategy',
88
+ description: 'Validate XPath input at application boundary',
89
+ severity: 'LOW',
90
+ fix: 'Validate XPath syntax and restrict to safe operations',
91
+ documentationLink: 'https://cwe.mitre.org/data/definitions/643.html',
92
+ }),
93
+ strategySafeConstruction: (0, eslint_devkit_2.formatLLMMessage)({
94
+ icon: eslint_devkit_2.MessageIcons.STRATEGY,
95
+ issueName: 'Safe Construction Strategy',
96
+ description: 'Use safe XPath construction libraries',
97
+ severity: 'LOW',
98
+ fix: 'Use libraries that provide safe XPath building',
99
+ documentationLink: 'https://www.npmjs.com/package/xpath-builder',
100
+ })
101
+ },
102
+ schema: [
103
+ {
104
+ type: 'object',
105
+ properties: {
106
+ xpathFunctions: {
107
+ type: 'array',
108
+ items: { type: 'string' },
109
+ default: ['evaluate', 'selectSingleNode', 'selectNodes', 'xpath', 'select'],
110
+ },
111
+ safeXpathConstructors: {
112
+ type: 'array',
113
+ items: { type: 'string' },
114
+ default: ['buildXPath', 'createXPath', 'safeXPath', 'xpathBuilder'],
115
+ },
116
+ xpathValidationFunctions: {
117
+ type: 'array',
118
+ items: { type: 'string' },
119
+ default: ['validateXPath', 'escapeXPath', 'sanitizeXPath', 'cleanXPath'],
120
+ },
121
+ trustedSanitizers: {
122
+ type: 'array',
123
+ items: { type: 'string' },
124
+ default: [],
125
+ description: 'Additional function names to consider as XPath sanitizers',
126
+ },
127
+ trustedAnnotations: {
128
+ type: 'array',
129
+ items: { type: 'string' },
130
+ default: [],
131
+ description: 'Additional JSDoc annotations to consider as safe markers',
132
+ },
133
+ strictMode: {
134
+ type: 'boolean',
135
+ default: false,
136
+ description: 'Disable all false positive detection (strict mode)',
137
+ },
138
+ },
139
+ additionalProperties: false,
140
+ },
141
+ ],
142
+ },
143
+ defaultOptions: [
144
+ {
145
+ xpathFunctions: ['evaluate', 'selectSingleNode', 'selectNodes', 'xpath', 'select'],
146
+ safeXpathConstructors: ['buildXPath', 'createXPath', 'safeXPath', 'xpathBuilder'],
147
+ xpathValidationFunctions: ['validateXPath', 'escapeXPath', 'sanitizeXPath', 'cleanXPath'],
148
+ trustedSanitizers: [],
149
+ trustedAnnotations: ['@xpath-safe'],
150
+ strictMode: false,
151
+ },
152
+ ],
153
+ create(context) {
154
+ const options = context.options[0] || {};
155
+ const { xpathFunctions = ['evaluate', 'selectSingleNode', 'selectNodes', 'xpath', 'select'], safeXpathConstructors = ['buildXPath', 'createXPath', 'safeXPath', 'xpathBuilder'], xpathValidationFunctions = ['validateXPath', 'escapeXPath', 'sanitizeXPath', 'cleanXPath'], trustedSanitizers = [], trustedAnnotations = [], strictMode = false, } = options;
156
+ const sourceCode = context.sourceCode || context.sourceCode;
157
+ const filename = context.filename || context.getFilename();
158
+ // Create safety checker for false positive detection
159
+ const safetyChecker = (0, eslint_devkit_3.createSafetyChecker)({
160
+ trustedSanitizers,
161
+ trustedAnnotations,
162
+ trustedOrmPatterns: [],
163
+ strictMode,
164
+ });
165
+ // Track variables that have been validated/sanitized
166
+ const validatedVariables = new Set();
167
+ /**
168
+ * Check if this is an XPath-related operation
169
+ */
170
+ const isXpathOperation = (node) => {
171
+ const callee = node.callee;
172
+ // Check for XPath method calls
173
+ if (callee.type === 'MemberExpression' &&
174
+ callee.property.type === 'Identifier' &&
175
+ xpathFunctions.includes(callee.property.name)) {
176
+ return true;
177
+ }
178
+ // Check for XPath library calls
179
+ if (callee.type === 'Identifier' && xpathFunctions.includes(callee.name)) {
180
+ return true;
181
+ }
182
+ return false;
183
+ };
184
+ /**
185
+ * Check if XPath expression contains dangerous patterns
186
+ */
187
+ const containsDangerousXpath = (xpathText) => {
188
+ // Dangerous XPath patterns that allow traversal or injection
189
+ const dangerousPatterns = [
190
+ /\.\./, // Parent directory traversal
191
+ /\/\*/, // All children selector
192
+ /\[.*\*\]/, // Wildcard in predicates
193
+ /\/\//, // Descendant-or-self axis (can be dangerous in some contexts)
194
+ /text\(\)/, // Content extraction
195
+ /comment\(\)/, // Comment extraction
196
+ /processing-instruction\(\)/, // Processing instruction extraction
197
+ ];
198
+ return dangerousPatterns.some(pattern => pattern.test(xpathText));
199
+ };
200
+ /**
201
+ * Check if string contains XPath interpolation
202
+ */
203
+ const containsXpathInterpolation = (text) => {
204
+ return /\$\{[^}]+\}/.test(text) || /'[^']*\+[^+]*'/.test(text) || /"[^"]*\+[^+]*"/.test(text);
205
+ };
206
+ /**
207
+ * Check if XPath input is from untrusted source
208
+ */
209
+ const isUntrustedXpathInput = (inputNode) => {
210
+ if (inputNode.type === 'MemberExpression') {
211
+ // Check patterns like req.query.*, req.body.*, req.params.*
212
+ if (inputNode.object.type === 'MemberExpression' &&
213
+ inputNode.object.object.type === 'Identifier' &&
214
+ inputNode.object.object.name === 'req' &&
215
+ inputNode.object.property.type === 'Identifier' &&
216
+ ['query', 'body', 'params', 'param'].includes(inputNode.object.property.name)) {
217
+ return true;
218
+ }
219
+ // Check patterns like req.*
220
+ if (inputNode.object.type === 'Identifier' && inputNode.object.name === 'req') {
221
+ return true;
222
+ }
223
+ }
224
+ if (inputNode.type !== 'Identifier') {
225
+ return false;
226
+ }
227
+ const varName = inputNode.name.toLowerCase();
228
+ if (['req', 'request', 'query', 'params', 'input', 'user', 'search'].some(keyword => varName.includes(keyword))) {
229
+ return true;
230
+ }
231
+ // Check if it comes from function parameters
232
+ let current = inputNode;
233
+ while (current) {
234
+ if (current.type === 'FunctionDeclaration' ||
235
+ current.type === 'FunctionExpression' ||
236
+ current.type === 'ArrowFunctionExpression') {
237
+ const func = current;
238
+ return func.params.some((param) => {
239
+ if (param.type === 'Identifier') {
240
+ return param.name === inputNode.name;
241
+ }
242
+ return false;
243
+ });
244
+ }
245
+ current = current.parent;
246
+ }
247
+ return false;
248
+ };
249
+ /**
250
+ * Check if XPath input has been validated
251
+ */
252
+ const isXpathInputValidated = (inputNode) => {
253
+ let current = inputNode;
254
+ while (current) {
255
+ if (current.type === 'CallExpression' &&
256
+ current.callee.type === 'Identifier' &&
257
+ xpathValidationFunctions.includes(current.callee.name)) {
258
+ return true;
259
+ }
260
+ current = current.parent;
261
+ }
262
+ return false;
263
+ };
264
+ /**
265
+ * Check for safe annotation on containing statement or variable declaration
266
+ */
267
+ const hasSafeAnnotationOnStatement = (node) => {
268
+ let current = node;
269
+ // Walk up to find VariableDeclaration, ExpressionStatement, FunctionDeclaration, or containing statement
270
+ while (current) {
271
+ if (current.type === 'VariableDeclaration' ||
272
+ current.type === 'ExpressionStatement' ||
273
+ current.type === 'FunctionDeclaration') {
274
+ // Check for JSDoc comments before this statement
275
+ const comments = sourceCode.getCommentsBefore(current);
276
+ for (const comment of comments) {
277
+ if (comment.type === 'Block' && comment.value.includes('@xpath-safe')) {
278
+ return true;
279
+ }
280
+ }
281
+ }
282
+ current = current.parent;
283
+ }
284
+ return false;
285
+ };
286
+ /**
287
+ * Check if XPath is constructed safely
288
+ */
289
+ const isSafeXpathConstruction = (node) => {
290
+ let current = node;
291
+ while (current) {
292
+ if (current.type === 'CallExpression' &&
293
+ current.callee.type === 'Identifier' &&
294
+ safeXpathConstructors.includes(current.callee.name)) {
295
+ return true;
296
+ }
297
+ current = current.parent;
298
+ }
299
+ return false;
300
+ };
301
+ return {
302
+ // Check XPath function calls
303
+ CallExpression(node) {
304
+ if (!isXpathOperation(node)) {
305
+ return;
306
+ }
307
+ const args = node.arguments;
308
+ if (args.length === 0) {
309
+ return;
310
+ }
311
+ // Check first argument (usually the XPath expression)
312
+ const xpathArg = args[0];
313
+ if (xpathArg.type === 'Literal' && typeof xpathArg.value === 'string') {
314
+ const xpathText = xpathArg.value;
315
+ // Check for dangerous XPath patterns
316
+ if (containsDangerousXpath(xpathText)) {
317
+ // FALSE POSITIVE REDUCTION: Skip if annotated as safe
318
+ if ((0, eslint_devkit_3.hasSafeAnnotation)(xpathArg, context, trustedAnnotations) || hasSafeAnnotationOnStatement(node)) {
319
+ return;
320
+ }
321
+ context.report({
322
+ node: xpathArg,
323
+ messageId: 'dangerousXpathExpression',
324
+ data: {
325
+ filePath: filename,
326
+ line: String(node.loc?.start.line ?? 0),
327
+ },
328
+ });
329
+ }
330
+ }
331
+ else if (xpathArg.type === 'Identifier') {
332
+ // Check if XPath comes from untrusted input
333
+ if (isUntrustedXpathInput(xpathArg) && !isXpathInputValidated(xpathArg) &&
334
+ !(xpathArg.type === 'Identifier' && validatedVariables.has(xpathArg.name))) {
335
+ // FALSE POSITIVE REDUCTION
336
+ if ((0, eslint_devkit_3.hasSafeAnnotation)(xpathArg, context, trustedAnnotations) || safetyChecker.isSafe(xpathArg, context) || hasSafeAnnotationOnStatement(node)) {
337
+ return;
338
+ }
339
+ context.report({
340
+ node: xpathArg,
341
+ messageId: 'unvalidatedXpathInput',
342
+ data: {
343
+ filePath: filename,
344
+ line: String(node.loc?.start.line ?? 0),
345
+ },
346
+ });
347
+ }
348
+ }
349
+ },
350
+ // Check template literals for XPath expressions
351
+ TemplateLiteral(node) {
352
+ const fullText = sourceCode.getText(node);
353
+ // Check if this looks like an XPath expression
354
+ if (!fullText.includes('/') && !fullText.includes('[') && !fullText.includes('@')) {
355
+ return;
356
+ }
357
+ // Check for interpolation in XPath-like expressions
358
+ if (containsXpathInterpolation(fullText)) {
359
+ // Check if any interpolated values are untrusted
360
+ const hasUntrustedInterpolation = node.expressions.some((expr) => isUntrustedXpathInput(expr) && !isXpathInputValidated(expr) && !(expr.type === 'Identifier' && validatedVariables.has(expr.name)));
361
+ if (hasUntrustedInterpolation) {
362
+ // FALSE POSITIVE REDUCTION: Check for safe annotation
363
+ if (hasSafeAnnotationOnStatement(node)) {
364
+ return;
365
+ }
366
+ context.report({
367
+ node,
368
+ messageId: 'unsafeXpathConcatenation',
369
+ data: {
370
+ filePath: filename,
371
+ line: String(node.loc?.start.line ?? 0),
372
+ },
373
+ suggest: [
374
+ {
375
+ messageId: 'useParameterizedXpath',
376
+ fix: () => null
377
+ },
378
+ ],
379
+ });
380
+ }
381
+ }
382
+ // Check for dangerous patterns in template literals
383
+ if (containsDangerousXpath(fullText)) {
384
+ // FALSE POSITIVE REDUCTION: Check for safe annotation
385
+ if (hasSafeAnnotationOnStatement(node)) {
386
+ return;
387
+ }
388
+ context.report({
389
+ node,
390
+ messageId: 'dangerousXpathExpression',
391
+ data: {
392
+ filePath: filename,
393
+ line: String(node.loc?.start.line ?? 0),
394
+ },
395
+ });
396
+ }
397
+ },
398
+ // Check binary expressions (string concatenation)
399
+ BinaryExpression(node) {
400
+ if (node.operator !== '+') {
401
+ return;
402
+ }
403
+ const fullText = sourceCode.getText(node);
404
+ // Check if this looks like XPath construction
405
+ if (!fullText.includes('/') && !fullText.includes('[')) {
406
+ return;
407
+ }
408
+ // Check if either side contains XPath-like patterns
409
+ const leftText = sourceCode.getText(node.left);
410
+ const rightText = sourceCode.getText(node.right);
411
+ if ((leftText.includes('/') || leftText.includes('[')) ||
412
+ (rightText.includes('/') || rightText.includes('['))) {
413
+ // Check if untrusted input is involved
414
+ const leftUntrusted = isUntrustedXpathInput(node.left) && !isXpathInputValidated(node.left) && !(node.left.type === 'Identifier' && validatedVariables.has(node.left.name));
415
+ const rightUntrusted = isUntrustedXpathInput(node.right) && !isXpathInputValidated(node.right) && !(node.right.type === 'Identifier' && validatedVariables.has(node.right.name));
416
+ if (leftUntrusted || rightUntrusted) {
417
+ // FALSE POSITIVE REDUCTION
418
+ if (safetyChecker.isSafe(node, context) || hasSafeAnnotationOnStatement(node)) {
419
+ return;
420
+ }
421
+ context.report({
422
+ node,
423
+ messageId: 'xpathInjection',
424
+ data: {
425
+ filePath: filename,
426
+ line: String(node.loc?.start.line ?? 0),
427
+ severity: 'HIGH',
428
+ safeAlternative: 'Use parameterized XPath construction with input validation',
429
+ },
430
+ });
431
+ }
432
+ }
433
+ },
434
+ // Check variable assignments with XPath expressions
435
+ VariableDeclarator(node) {
436
+ if (!node.init || node.id.type !== 'Identifier') {
437
+ return;
438
+ }
439
+ const varName = node.id.name;
440
+ // Track variables that are assigned the result of sanitization functions
441
+ if (node.init.type === 'CallExpression' &&
442
+ node.init.callee.type === 'Identifier' &&
443
+ (xpathValidationFunctions.includes(node.init.callee.name) || trustedSanitizers.includes(node.init.callee.name))) {
444
+ validatedVariables.add(varName);
445
+ }
446
+ const varNameLower = varName.toLowerCase();
447
+ if (!varNameLower.includes('xpath') && !varNameLower.includes('query') && !varNameLower.includes('path')) {
448
+ return;
449
+ }
450
+ // Check if assigned value contains dangerous XPath
451
+ if (node.init.type === 'Literal' && typeof node.init.value === 'string') {
452
+ if (containsDangerousXpath(node.init.value)) {
453
+ // FALSE POSITIVE REDUCTION
454
+ if (safetyChecker.isSafe(node.init, context) || hasSafeAnnotationOnStatement(node)) {
455
+ return;
456
+ }
457
+ context.report({
458
+ node: node.init,
459
+ messageId: 'dangerousXpathExpression',
460
+ data: {
461
+ filePath: filename,
462
+ line: String(node.loc?.start.line ?? 0),
463
+ },
464
+ });
465
+ }
466
+ }
467
+ else if (isUntrustedXpathInput(node.init) && !isSafeXpathConstruction(node.init)) {
468
+ /* c8 ignore start -- safetyChecker requires JSDoc annotations not testable via RuleTester */
469
+ if (safetyChecker.isSafe(node.init, context)) {
470
+ return;
471
+ }
472
+ /* c8 ignore stop */
473
+ context.report({
474
+ node: node.init,
475
+ messageId: 'xpathInjection',
476
+ data: {
477
+ filePath: filename,
478
+ line: String(node.loc?.start.line ?? 0),
479
+ severity: 'MEDIUM',
480
+ safeAlternative: 'Use safe XPath construction methods',
481
+ },
482
+ });
483
+ }
484
+ }
485
+ };
486
+ },
487
+ });
@@ -0,0 +1,7 @@
1
+ export interface Options {
2
+ /** Parser options that indicate safe configuration */
3
+ safeParserOptions?: string[];
4
+ /** Functions that validate/sanitize XML input */
5
+ xmlValidationFunctions?: string[];
6
+ }
7
+ export declare const noXxeInjection: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;