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.
- package/README.md +1 -0
- package/package.json +3 -10
- package/src/index.ts +605 -0
- package/src/rules/__tests__/integration-demo.test.ts +290 -0
- package/src/rules/__tests__/integration-llm.test.ts +89 -0
- package/src/rules/database-injection/database-injection.test.ts +456 -0
- package/src/rules/database-injection/index.ts +488 -0
- package/src/rules/detect-child-process/detect-child-process.test.ts +207 -0
- package/src/rules/detect-child-process/index.ts +634 -0
- package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +416 -0
- package/src/rules/detect-eval-with-expression/index.ts +463 -0
- package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +28 -0
- package/src/rules/detect-mixed-content/index.ts +52 -0
- package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +269 -0
- package/src/rules/detect-non-literal-fs-filename/index.ts +551 -0
- package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +189 -0
- package/src/rules/detect-non-literal-regexp/index.ts +490 -0
- package/src/rules/detect-object-injection/detect-object-injection.test.ts +440 -0
- package/src/rules/detect-object-injection/index.ts +674 -0
- package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +32 -0
- package/src/rules/detect-suspicious-dependencies/index.ts +84 -0
- package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +31 -0
- package/src/rules/detect-weak-password-validation/index.ts +68 -0
- package/src/rules/no-allow-arbitrary-loads/index.ts +54 -0
- package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +28 -0
- package/src/rules/no-arbitrary-file-access/index.ts +238 -0
- package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +119 -0
- package/src/rules/no-buffer-overread/index.ts +724 -0
- package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +313 -0
- package/src/rules/no-clickjacking/index.ts +481 -0
- package/src/rules/no-clickjacking/no-clickjacking.test.ts +253 -0
- package/src/rules/no-client-side-auth-logic/index.ts +81 -0
- package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +33 -0
- package/src/rules/no-credentials-in-query-params/index.ts +69 -0
- package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +33 -0
- package/src/rules/no-credentials-in-storage-api/index.ts +64 -0
- package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +31 -0
- package/src/rules/no-data-in-temp-storage/index.ts +75 -0
- package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +33 -0
- package/src/rules/no-debug-code-in-production/index.ts +59 -0
- package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +26 -0
- package/src/rules/no-directive-injection/index.ts +551 -0
- package/src/rules/no-directive-injection/no-directive-injection.test.ts +305 -0
- package/src/rules/no-disabled-certificate-validation/index.ts +72 -0
- package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +33 -0
- package/src/rules/no-document-cookie/index.ts +113 -0
- package/src/rules/no-document-cookie/no-document-cookie.test.ts +382 -0
- package/src/rules/no-dynamic-dependency-loading/index.ts +60 -0
- package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +27 -0
- package/src/rules/no-electron-security-issues/index.ts +504 -0
- package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +324 -0
- package/src/rules/no-exposed-debug-endpoints/index.ts +73 -0
- package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +40 -0
- package/src/rules/no-exposed-sensitive-data/index.ts +428 -0
- package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +75 -0
- package/src/rules/no-format-string-injection/index.ts +801 -0
- package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +437 -0
- package/src/rules/no-graphql-injection/index.ts +508 -0
- package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +371 -0
- package/src/rules/no-hardcoded-credentials/index.ts +478 -0
- package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +639 -0
- package/src/rules/no-hardcoded-session-tokens/index.ts +69 -0
- package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +42 -0
- package/src/rules/no-http-urls/index.ts +131 -0
- package/src/rules/no-http-urls/no-http-urls.test.ts +60 -0
- package/src/rules/no-improper-sanitization/index.ts +502 -0
- package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +156 -0
- package/src/rules/no-improper-type-validation/index.ts +572 -0
- package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +372 -0
- package/src/rules/no-insecure-comparison/index.ts +232 -0
- package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +218 -0
- package/src/rules/no-insecure-cookie-settings/index.ts +391 -0
- package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +409 -0
- package/src/rules/no-insecure-jwt/index.ts +467 -0
- package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +259 -0
- package/src/rules/no-insecure-redirects/index.ts +267 -0
- package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +108 -0
- package/src/rules/no-insecure-websocket/index.ts +72 -0
- package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +42 -0
- package/src/rules/no-insufficient-postmessage-validation/index.ts +497 -0
- package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +360 -0
- package/src/rules/no-insufficient-random/index.ts +288 -0
- package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +246 -0
- package/src/rules/no-ldap-injection/index.ts +547 -0
- package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +317 -0
- package/src/rules/no-missing-authentication/index.ts +408 -0
- package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +350 -0
- package/src/rules/no-missing-cors-check/index.ts +453 -0
- package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +392 -0
- package/src/rules/no-missing-csrf-protection/index.ts +229 -0
- package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +222 -0
- package/src/rules/no-missing-security-headers/index.ts +266 -0
- package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +98 -0
- package/src/rules/no-password-in-url/index.ts +64 -0
- package/src/rules/no-password-in-url/no-password-in-url.test.ts +27 -0
- package/src/rules/no-permissive-cors/index.ts +78 -0
- package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +28 -0
- package/src/rules/no-pii-in-logs/index.ts +83 -0
- package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +26 -0
- package/src/rules/no-postmessage-origin-wildcard/index.ts +67 -0
- package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +27 -0
- package/src/rules/no-privilege-escalation/index.ts +403 -0
- package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +306 -0
- package/src/rules/no-redos-vulnerable-regex/index.ts +379 -0
- package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +83 -0
- package/src/rules/no-sensitive-data-exposure/index.ts +294 -0
- package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +262 -0
- package/src/rules/no-sensitive-data-in-analytics/index.ts +73 -0
- package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +42 -0
- package/src/rules/no-sensitive-data-in-cache/index.ts +59 -0
- package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +32 -0
- package/src/rules/no-sql-injection/index.ts +424 -0
- package/src/rules/no-sql-injection/no-sql-injection.test.ts +303 -0
- package/src/rules/no-timing-attack/index.ts +552 -0
- package/src/rules/no-timing-attack/no-timing-attack.test.ts +348 -0
- package/src/rules/no-toctou-vulnerability/index.ts +250 -0
- package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +60 -0
- package/src/rules/no-tracking-without-consent/index.ts +78 -0
- package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +34 -0
- package/src/rules/no-unchecked-loop-condition/index.ts +781 -0
- package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +459 -0
- package/src/rules/no-unencrypted-local-storage/index.ts +73 -0
- package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +41 -0
- package/src/rules/no-unencrypted-transmission/index.ts +296 -0
- package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +287 -0
- package/src/rules/no-unescaped-url-parameter/index.ts +424 -0
- package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +263 -0
- package/src/rules/no-unlimited-resource-allocation/index.ts +767 -0
- package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +544 -0
- package/src/rules/no-unsafe-deserialization/index.ts +593 -0
- package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +310 -0
- package/src/rules/no-unsafe-dynamic-require/index.ts +125 -0
- package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +151 -0
- package/src/rules/no-unsafe-regex-construction/index.ts +370 -0
- package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +181 -0
- package/src/rules/no-unsanitized-html/index.ts +400 -0
- package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +488 -0
- package/src/rules/no-unvalidated-deeplinks/index.ts +73 -0
- package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +29 -0
- package/src/rules/no-unvalidated-user-input/index.ts +498 -0
- package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +463 -0
- package/src/rules/no-verbose-error-messages/index.ts +83 -0
- package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +34 -0
- package/src/rules/no-weak-crypto/index.ts +447 -0
- package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +297 -0
- package/src/rules/no-weak-password-recovery/index.ts +509 -0
- package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +184 -0
- package/src/rules/no-xpath-injection/index.ts +596 -0
- package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +405 -0
- package/src/rules/no-xxe-injection/index.ts +342 -0
- package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +122 -0
- package/src/rules/no-zip-slip/index.ts +526 -0
- package/src/rules/no-zip-slip/no-zip-slip.test.ts +305 -0
- package/src/rules/require-backend-authorization/index.ts +71 -0
- package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +31 -0
- package/src/rules/require-code-minification/index.ts +54 -0
- package/src/rules/require-code-minification/require-code-minification.test.ts +30 -0
- package/src/rules/require-csp-headers/index.ts +74 -0
- package/src/rules/require-csp-headers/require-csp-headers.test.ts +34 -0
- package/src/rules/require-data-minimization/index.ts +65 -0
- package/src/rules/require-data-minimization/require-data-minimization.test.ts +31 -0
- package/src/rules/require-dependency-integrity/index.ts +78 -0
- package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +44 -0
- package/src/rules/require-https-only/index.ts +75 -0
- package/src/rules/require-https-only/require-https-only.test.ts +26 -0
- package/src/rules/require-mime-type-validation/index.ts +77 -0
- package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +32 -0
- package/src/rules/require-network-timeout/index.ts +58 -0
- package/src/rules/require-network-timeout/require-network-timeout.test.ts +26 -0
- package/src/rules/require-package-lock/index.ts +75 -0
- package/src/rules/require-package-lock/require-package-lock.test.ts +27 -0
- package/src/rules/require-secure-credential-storage/index.ts +60 -0
- package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +26 -0
- package/src/rules/require-secure-defaults/index.ts +54 -0
- package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +26 -0
- package/src/rules/require-secure-deletion/index.ts +52 -0
- package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +29 -0
- package/src/rules/require-storage-encryption/index.ts +60 -0
- package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +26 -0
- package/src/rules/require-url-validation/index.ts +85 -0
- package/src/rules/require-url-validation/require-url-validation.test.ts +32 -0
- package/src/types/{index.d.ts → index.ts} +157 -53
- package/src/index.d.ts +0 -32
- package/src/index.js +0 -465
- package/src/rules/database-injection/index.d.ts +0 -13
- package/src/rules/database-injection/index.js +0 -406
- package/src/rules/detect-child-process/index.d.ts +0 -11
- package/src/rules/detect-child-process/index.js +0 -529
- package/src/rules/detect-eval-with-expression/index.d.ts +0 -9
- package/src/rules/detect-eval-with-expression/index.js +0 -392
- package/src/rules/detect-mixed-content/index.d.ts +0 -8
- package/src/rules/detect-mixed-content/index.js +0 -44
- package/src/rules/detect-non-literal-fs-filename/index.d.ts +0 -7
- package/src/rules/detect-non-literal-fs-filename/index.js +0 -454
- package/src/rules/detect-non-literal-regexp/index.d.ts +0 -9
- package/src/rules/detect-non-literal-regexp/index.js +0 -403
- package/src/rules/detect-object-injection/index.d.ts +0 -11
- package/src/rules/detect-object-injection/index.js +0 -560
- package/src/rules/detect-suspicious-dependencies/index.d.ts +0 -8
- package/src/rules/detect-suspicious-dependencies/index.js +0 -71
- package/src/rules/detect-weak-password-validation/index.d.ts +0 -6
- package/src/rules/detect-weak-password-validation/index.js +0 -58
- package/src/rules/no-allow-arbitrary-loads/index.d.ts +0 -8
- package/src/rules/no-allow-arbitrary-loads/index.js +0 -47
- package/src/rules/no-arbitrary-file-access/index.d.ts +0 -13
- package/src/rules/no-arbitrary-file-access/index.js +0 -195
- package/src/rules/no-buffer-overread/index.d.ts +0 -29
- package/src/rules/no-buffer-overread/index.js +0 -606
- package/src/rules/no-clickjacking/index.d.ts +0 -10
- package/src/rules/no-clickjacking/index.js +0 -396
- package/src/rules/no-client-side-auth-logic/index.d.ts +0 -6
- package/src/rules/no-client-side-auth-logic/index.js +0 -69
- package/src/rules/no-credentials-in-query-params/index.d.ts +0 -8
- package/src/rules/no-credentials-in-query-params/index.js +0 -57
- package/src/rules/no-credentials-in-storage-api/index.d.ts +0 -6
- package/src/rules/no-credentials-in-storage-api/index.js +0 -54
- package/src/rules/no-data-in-temp-storage/index.d.ts +0 -6
- package/src/rules/no-data-in-temp-storage/index.js +0 -64
- package/src/rules/no-debug-code-in-production/index.d.ts +0 -8
- package/src/rules/no-debug-code-in-production/index.js +0 -51
- package/src/rules/no-directive-injection/index.d.ts +0 -12
- package/src/rules/no-directive-injection/index.js +0 -457
- package/src/rules/no-disabled-certificate-validation/index.d.ts +0 -6
- package/src/rules/no-disabled-certificate-validation/index.js +0 -61
- package/src/rules/no-document-cookie/index.d.ts +0 -5
- package/src/rules/no-document-cookie/index.js +0 -89
- package/src/rules/no-dynamic-dependency-loading/index.d.ts +0 -8
- package/src/rules/no-dynamic-dependency-loading/index.js +0 -51
- package/src/rules/no-electron-security-issues/index.d.ts +0 -10
- package/src/rules/no-electron-security-issues/index.js +0 -423
- package/src/rules/no-exposed-debug-endpoints/index.d.ts +0 -6
- package/src/rules/no-exposed-debug-endpoints/index.js +0 -62
- package/src/rules/no-exposed-sensitive-data/index.d.ts +0 -11
- package/src/rules/no-exposed-sensitive-data/index.js +0 -340
- package/src/rules/no-format-string-injection/index.d.ts +0 -17
- package/src/rules/no-format-string-injection/index.js +0 -660
- package/src/rules/no-graphql-injection/index.d.ts +0 -12
- package/src/rules/no-graphql-injection/index.js +0 -411
- package/src/rules/no-hardcoded-credentials/index.d.ts +0 -26
- package/src/rules/no-hardcoded-credentials/index.js +0 -376
- package/src/rules/no-hardcoded-session-tokens/index.d.ts +0 -6
- package/src/rules/no-hardcoded-session-tokens/index.js +0 -59
- package/src/rules/no-http-urls/index.d.ts +0 -12
- package/src/rules/no-http-urls/index.js +0 -114
- package/src/rules/no-improper-sanitization/index.d.ts +0 -12
- package/src/rules/no-improper-sanitization/index.js +0 -411
- package/src/rules/no-improper-type-validation/index.d.ts +0 -10
- package/src/rules/no-improper-type-validation/index.js +0 -475
- package/src/rules/no-insecure-comparison/index.d.ts +0 -7
- package/src/rules/no-insecure-comparison/index.js +0 -193
- package/src/rules/no-insecure-cookie-settings/index.d.ts +0 -9
- package/src/rules/no-insecure-cookie-settings/index.js +0 -306
- package/src/rules/no-insecure-jwt/index.d.ts +0 -10
- package/src/rules/no-insecure-jwt/index.js +0 -380
- package/src/rules/no-insecure-redirects/index.d.ts +0 -7
- package/src/rules/no-insecure-redirects/index.js +0 -216
- package/src/rules/no-insecure-websocket/index.d.ts +0 -6
- package/src/rules/no-insecure-websocket/index.js +0 -61
- package/src/rules/no-insufficient-postmessage-validation/index.d.ts +0 -14
- package/src/rules/no-insufficient-postmessage-validation/index.js +0 -392
- package/src/rules/no-insufficient-random/index.d.ts +0 -9
- package/src/rules/no-insufficient-random/index.js +0 -208
- package/src/rules/no-ldap-injection/index.d.ts +0 -10
- package/src/rules/no-ldap-injection/index.js +0 -455
- package/src/rules/no-missing-authentication/index.d.ts +0 -13
- package/src/rules/no-missing-authentication/index.js +0 -333
- package/src/rules/no-missing-cors-check/index.d.ts +0 -9
- package/src/rules/no-missing-cors-check/index.js +0 -399
- package/src/rules/no-missing-csrf-protection/index.d.ts +0 -11
- package/src/rules/no-missing-csrf-protection/index.js +0 -180
- package/src/rules/no-missing-security-headers/index.d.ts +0 -7
- package/src/rules/no-missing-security-headers/index.js +0 -218
- package/src/rules/no-password-in-url/index.d.ts +0 -8
- package/src/rules/no-password-in-url/index.js +0 -54
- package/src/rules/no-permissive-cors/index.d.ts +0 -8
- package/src/rules/no-permissive-cors/index.js +0 -65
- package/src/rules/no-pii-in-logs/index.d.ts +0 -8
- package/src/rules/no-pii-in-logs/index.js +0 -70
- package/src/rules/no-postmessage-origin-wildcard/index.d.ts +0 -8
- package/src/rules/no-postmessage-origin-wildcard/index.js +0 -56
- package/src/rules/no-privilege-escalation/index.d.ts +0 -13
- package/src/rules/no-privilege-escalation/index.js +0 -321
- package/src/rules/no-redos-vulnerable-regex/index.d.ts +0 -7
- package/src/rules/no-redos-vulnerable-regex/index.js +0 -306
- package/src/rules/no-sensitive-data-exposure/index.d.ts +0 -11
- package/src/rules/no-sensitive-data-exposure/index.js +0 -250
- package/src/rules/no-sensitive-data-in-analytics/index.d.ts +0 -8
- package/src/rules/no-sensitive-data-in-analytics/index.js +0 -62
- package/src/rules/no-sensitive-data-in-cache/index.d.ts +0 -8
- package/src/rules/no-sensitive-data-in-cache/index.js +0 -52
- package/src/rules/no-sql-injection/index.d.ts +0 -10
- package/src/rules/no-sql-injection/index.js +0 -335
- package/src/rules/no-timing-attack/index.d.ts +0 -10
- package/src/rules/no-timing-attack/index.js +0 -447
- package/src/rules/no-toctou-vulnerability/index.d.ts +0 -7
- package/src/rules/no-toctou-vulnerability/index.js +0 -208
- package/src/rules/no-tracking-without-consent/index.d.ts +0 -6
- package/src/rules/no-tracking-without-consent/index.js +0 -67
- package/src/rules/no-unchecked-loop-condition/index.d.ts +0 -12
- package/src/rules/no-unchecked-loop-condition/index.js +0 -646
- package/src/rules/no-unencrypted-local-storage/index.d.ts +0 -8
- package/src/rules/no-unencrypted-local-storage/index.js +0 -61
- package/src/rules/no-unencrypted-transmission/index.d.ts +0 -11
- package/src/rules/no-unencrypted-transmission/index.js +0 -236
- package/src/rules/no-unescaped-url-parameter/index.d.ts +0 -9
- package/src/rules/no-unescaped-url-parameter/index.js +0 -355
- package/src/rules/no-unlimited-resource-allocation/index.d.ts +0 -12
- package/src/rules/no-unlimited-resource-allocation/index.js +0 -643
- package/src/rules/no-unsafe-deserialization/index.d.ts +0 -10
- package/src/rules/no-unsafe-deserialization/index.js +0 -491
- package/src/rules/no-unsafe-dynamic-require/index.d.ts +0 -5
- package/src/rules/no-unsafe-dynamic-require/index.js +0 -106
- package/src/rules/no-unsafe-regex-construction/index.d.ts +0 -9
- package/src/rules/no-unsafe-regex-construction/index.js +0 -291
- package/src/rules/no-unsanitized-html/index.d.ts +0 -9
- package/src/rules/no-unsanitized-html/index.js +0 -335
- package/src/rules/no-unvalidated-deeplinks/index.d.ts +0 -6
- package/src/rules/no-unvalidated-deeplinks/index.js +0 -62
- package/src/rules/no-unvalidated-user-input/index.d.ts +0 -9
- package/src/rules/no-unvalidated-user-input/index.js +0 -420
- package/src/rules/no-verbose-error-messages/index.d.ts +0 -8
- package/src/rules/no-verbose-error-messages/index.js +0 -68
- package/src/rules/no-weak-crypto/index.d.ts +0 -11
- package/src/rules/no-weak-crypto/index.js +0 -351
- package/src/rules/no-weak-password-recovery/index.d.ts +0 -12
- package/src/rules/no-weak-password-recovery/index.js +0 -424
- package/src/rules/no-xpath-injection/index.d.ts +0 -10
- package/src/rules/no-xpath-injection/index.js +0 -487
- package/src/rules/no-xxe-injection/index.d.ts +0 -7
- package/src/rules/no-xxe-injection/index.js +0 -266
- package/src/rules/no-zip-slip/index.d.ts +0 -9
- package/src/rules/no-zip-slip/index.js +0 -445
- package/src/rules/require-backend-authorization/index.d.ts +0 -6
- package/src/rules/require-backend-authorization/index.js +0 -60
- package/src/rules/require-code-minification/index.d.ts +0 -8
- package/src/rules/require-code-minification/index.js +0 -47
- package/src/rules/require-csp-headers/index.d.ts +0 -6
- package/src/rules/require-csp-headers/index.js +0 -64
- package/src/rules/require-data-minimization/index.d.ts +0 -8
- package/src/rules/require-data-minimization/index.js +0 -53
- package/src/rules/require-dependency-integrity/index.d.ts +0 -6
- package/src/rules/require-dependency-integrity/index.js +0 -64
- package/src/rules/require-https-only/index.d.ts +0 -8
- package/src/rules/require-https-only/index.js +0 -62
- package/src/rules/require-mime-type-validation/index.d.ts +0 -6
- package/src/rules/require-mime-type-validation/index.js +0 -66
- package/src/rules/require-network-timeout/index.d.ts +0 -8
- package/src/rules/require-network-timeout/index.js +0 -50
- package/src/rules/require-package-lock/index.d.ts +0 -8
- package/src/rules/require-package-lock/index.js +0 -63
- package/src/rules/require-secure-credential-storage/index.d.ts +0 -8
- package/src/rules/require-secure-credential-storage/index.js +0 -50
- package/src/rules/require-secure-defaults/index.d.ts +0 -8
- package/src/rules/require-secure-defaults/index.js +0 -47
- package/src/rules/require-secure-deletion/index.d.ts +0 -8
- package/src/rules/require-secure-deletion/index.js +0 -44
- package/src/rules/require-storage-encryption/index.d.ts +0 -8
- package/src/rules/require-storage-encryption/index.js +0 -50
- package/src/rules/require-url-validation/index.d.ts +0 -6
- package/src/rules/require-url-validation/index.js +0 -72
- package/src/types/index.js +0 -17
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive tests for database-injection rule
|
|
3
|
+
* Security: CWE-89 (SQL Injection), CWE-943 (NoSQL Injection)
|
|
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 { databaseInjection } 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
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('database-injection', () => {
|
|
26
|
+
describe('Valid Code', () => {
|
|
27
|
+
ruleTester.run('valid - safe database queries', databaseInjection, {
|
|
28
|
+
valid: [
|
|
29
|
+
// Use case: Safe SQL query using parameterized placeholders (?) instead of string interpolation
|
|
30
|
+
// This prevents SQL injection by separating query structure from user data
|
|
31
|
+
{
|
|
32
|
+
code: 'db.query("SELECT * FROM users WHERE id = ?", [userId]);',
|
|
33
|
+
},
|
|
34
|
+
// Use case: Safe parameterized INSERT query with multiple placeholders
|
|
35
|
+
// User input is passed as an array, ensuring proper escaping and validation
|
|
36
|
+
{
|
|
37
|
+
code: 'db.query("INSERT INTO users (name, email) VALUES (?, ?)", [name, email]);',
|
|
38
|
+
},
|
|
39
|
+
// Use case: Safe ORM query using Prisma's query builder
|
|
40
|
+
// ORMs handle parameterization internally, preventing injection attacks
|
|
41
|
+
{
|
|
42
|
+
code: 'prisma.user.findUnique({ where: { id: userId } });',
|
|
43
|
+
},
|
|
44
|
+
// Use case: Safe ORM query using Sequelize or similar ORM
|
|
45
|
+
// Object-based query API prevents SQL injection through proper escaping
|
|
46
|
+
{
|
|
47
|
+
code: 'User.findOne({ where: { id: userId } });',
|
|
48
|
+
},
|
|
49
|
+
// Use case: Safe NoSQL query using MongoDB's object-based query syntax
|
|
50
|
+
// MongoDB driver handles input sanitization when using object notation
|
|
51
|
+
{
|
|
52
|
+
code: 'db.collection("users").find({ id: userId });',
|
|
53
|
+
},
|
|
54
|
+
// Use case: Safe MongoDB query with ObjectId conversion
|
|
55
|
+
// Using proper MongoDB methods prevents NoSQL injection
|
|
56
|
+
{
|
|
57
|
+
code: 'MongoClient.db.collection("users").findOne({ _id: ObjectId(userId) });',
|
|
58
|
+
},
|
|
59
|
+
// Use case: Harmless string literal without SQL keywords
|
|
60
|
+
// Not a database query, so no injection risk
|
|
61
|
+
{
|
|
62
|
+
code: 'const text = "This is not a query";',
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
invalid: [],
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe('Invalid Code - SQL Injection', () => {
|
|
70
|
+
ruleTester.run('invalid - SQL injection patterns', databaseInjection, {
|
|
71
|
+
valid: [],
|
|
72
|
+
invalid: [
|
|
73
|
+
// Use case: SQL injection via template literal with unsanitized request.body data
|
|
74
|
+
// Attacker can manipulate req.body.id to inject malicious SQL (e.g., "1 OR 1=1")
|
|
75
|
+
{
|
|
76
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${req.body.id}`);',
|
|
77
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
78
|
+
},
|
|
79
|
+
// Use case: SQL injection via template literal with untrusted variable
|
|
80
|
+
// Variable userId could contain malicious SQL if not properly validated
|
|
81
|
+
{
|
|
82
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
83
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
84
|
+
},
|
|
85
|
+
// Use case: SQL injection in INSERT statement via template literal
|
|
86
|
+
// Attacker can inject SQL through the name variable to manipulate the INSERT query
|
|
87
|
+
{
|
|
88
|
+
code: 'db.query(`INSERT INTO users (name) VALUES (${name})`);',
|
|
89
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
90
|
+
},
|
|
91
|
+
// Use case: SQL injection in UPDATE statement with multiple interpolated variables
|
|
92
|
+
// Both name and id variables can be exploited to modify the query logic
|
|
93
|
+
{
|
|
94
|
+
code: 'db.query(`UPDATE users SET name = ${name} WHERE id = ${id}`);',
|
|
95
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
96
|
+
},
|
|
97
|
+
// Use case: SQL injection via string concatenation with request.body data
|
|
98
|
+
// Attacker can break out of the quoted string in req.body.name (e.g., "' OR '1'='1")
|
|
99
|
+
// Note: Multiple concatenations may report multiple errors
|
|
100
|
+
{
|
|
101
|
+
code: 'const query = "SELECT * FROM users WHERE name = \'" + req.body.name + "\'";',
|
|
102
|
+
errors: [
|
|
103
|
+
{ messageId: 'databaseInjection' },
|
|
104
|
+
{ messageId: 'databaseInjection' }
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
// Use case: SQL injection via string concatenation with untrusted variable
|
|
108
|
+
// userName variable could contain SQL escape sequences to break query logic
|
|
109
|
+
{
|
|
110
|
+
code: 'const query = "SELECT * FROM users WHERE name = \'" + userName + "\'";',
|
|
111
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
112
|
+
},
|
|
113
|
+
// Use case: SQL injection via string concatenation in direct query execution
|
|
114
|
+
// req.params.id is concatenated directly, allowing SQL injection attacks
|
|
115
|
+
{
|
|
116
|
+
code: 'db.query("SELECT * FROM users WHERE id = " + req.params.id);',
|
|
117
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('Invalid Code - NoSQL Injection', () => {
|
|
124
|
+
ruleTester.run('invalid - NoSQL injection patterns', databaseInjection, {
|
|
125
|
+
valid: [],
|
|
126
|
+
invalid: [
|
|
127
|
+
// Use case: NoSQL injection via MongoDB $where operator with request.body data
|
|
128
|
+
// Attacker can inject JavaScript code through req.body.name to execute arbitrary queries
|
|
129
|
+
// Example: req.body.name = '"; return true; //'
|
|
130
|
+
{
|
|
131
|
+
code: 'const query = `this.name === "${req.body.name}"`;',
|
|
132
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
133
|
+
},
|
|
134
|
+
// Use case: NoSQL injection via MongoDB JavaScript query with untrusted variable
|
|
135
|
+
// userName could contain malicious JavaScript to break query logic
|
|
136
|
+
{
|
|
137
|
+
code: 'const query = `this.name === "${userName}"`;',
|
|
138
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
139
|
+
},
|
|
140
|
+
// Use case: NoSQL injection using inequality operator with request.query data
|
|
141
|
+
// Attacker can inject JavaScript through req.query.email to bypass authentication
|
|
142
|
+
{
|
|
143
|
+
code: 'const query = `this.email != "${req.query.email}"`;',
|
|
144
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
145
|
+
},
|
|
146
|
+
// Use case: NoSQL injection via MongoDB $where operator with URL parameters
|
|
147
|
+
// The $where operator allows arbitrary JavaScript execution, making it highly dangerous
|
|
148
|
+
{
|
|
149
|
+
code: 'const query = `$where === "${req.params.filter}"`;',
|
|
150
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe('Suggestions', () => {
|
|
157
|
+
ruleTester.run('suggestions for fixes', databaseInjection, {
|
|
158
|
+
valid: [],
|
|
159
|
+
invalid: [
|
|
160
|
+
// Use case: Verify that the rule provides helpful suggestions for fixing SQL injection
|
|
161
|
+
// This tests the suggestion mechanism, which should recommend parameterized queries or ORMs
|
|
162
|
+
{
|
|
163
|
+
code: 'const query = `SELECT * FROM users WHERE id = ${userId}`;',
|
|
164
|
+
errors: [
|
|
165
|
+
{
|
|
166
|
+
messageId: 'databaseInjection',
|
|
167
|
+
// Note: Rule may not provide suggestions in all cases
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe('Options', () => {
|
|
176
|
+
ruleTester.run('options testing', databaseInjection, {
|
|
177
|
+
valid: [
|
|
178
|
+
// Use case: When detectNoSQL option is disabled, NoSQL queries should not be flagged
|
|
179
|
+
// This allows teams to focus only on SQL injection if they don't use NoSQL databases
|
|
180
|
+
{
|
|
181
|
+
code: 'db.collection("users").find({ name: userName });',
|
|
182
|
+
options: [{ detectNoSQL: false }],
|
|
183
|
+
},
|
|
184
|
+
// Use case: Variables in trustedSources list are considered safe
|
|
185
|
+
// This allows whitelisting specific variables that are known to be sanitized
|
|
186
|
+
{
|
|
187
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${trustedId}`);',
|
|
188
|
+
options: [{ trustedSources: ['trustedId'] }],
|
|
189
|
+
},
|
|
190
|
+
// Use case: Constants (all uppercase identifiers) are assumed safe
|
|
191
|
+
// Constants typically hold configuration values, not user input
|
|
192
|
+
{
|
|
193
|
+
code: 'db.query(`SELECT * FROM users WHERE status = ${ACTIVE_STATUS}`);',
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
invalid: [
|
|
197
|
+
// Use case: Verify that detectNoSQL option doesn't disable SQL injection detection
|
|
198
|
+
// What's wrong: userId is interpolated into a SQL query (potential injection)
|
|
199
|
+
// What this tests: Setting detectNoSQL=false only disables NoSQL checks, SQL checks remain active
|
|
200
|
+
{
|
|
201
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
202
|
+
options: [{ detectNoSQL: false }],
|
|
203
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
204
|
+
},
|
|
205
|
+
// Use case: Verify that high-risk taint sources cannot be whitelisted
|
|
206
|
+
// What's wrong: req.body.id comes directly from user request (untrusted input in SQL query)
|
|
207
|
+
// What this tests: Even with req.body.id in trustedSources, the rule still flags it as dangerous
|
|
208
|
+
// Why: Request data (req.body/query/params) is ALWAYS considered tainted for security
|
|
209
|
+
{
|
|
210
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${req.body.id}`);',
|
|
211
|
+
options: [{ trustedSources: ['req.body.id'] }],
|
|
212
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
describe('Edge Cases', () => {
|
|
219
|
+
ruleTester.run('edge cases', databaseInjection, {
|
|
220
|
+
valid: [
|
|
221
|
+
// Use case: Static SQL query without any dynamic values
|
|
222
|
+
// Safe because there's no user input interpolated into the query
|
|
223
|
+
{
|
|
224
|
+
code: 'db.query(`SELECT * FROM users`);',
|
|
225
|
+
},
|
|
226
|
+
// Use case: String concatenation without SQL keywords
|
|
227
|
+
// Not a database query, just regular string manipulation
|
|
228
|
+
{
|
|
229
|
+
code: 'const result = "hello" + userInput;',
|
|
230
|
+
},
|
|
231
|
+
// Use case: NoSQL query with literal values only
|
|
232
|
+
// Safe because the query uses hardcoded string, not user input
|
|
233
|
+
{
|
|
234
|
+
code: 'db.collection("users").find({ status: "active" });',
|
|
235
|
+
},
|
|
236
|
+
// Use case: Template literal with NoSQL patterns but only static strings
|
|
237
|
+
// No dynamic expressions, so no injection risk despite NoSQL syntax
|
|
238
|
+
{
|
|
239
|
+
code: 'const query = `this.name === "safeValue"`;',
|
|
240
|
+
},
|
|
241
|
+
// Use case: Template literal in non-database context
|
|
242
|
+
// Just a greeting message, not a database query despite having expressions
|
|
243
|
+
{
|
|
244
|
+
code: 'const message = `Hello ${userName}!`;',
|
|
245
|
+
},
|
|
246
|
+
// Use case: NoSQL pattern with constant (uppercase) value
|
|
247
|
+
// Constants are assumed safe as they're configuration values, not user input
|
|
248
|
+
{
|
|
249
|
+
code: 'const query = `this.name === "${ACTIVE_STATUS}"`;',
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
invalid: [
|
|
253
|
+
// Use case: SQL injection when query function is destructured from module
|
|
254
|
+
// Tests that the rule detects vulnerable patterns even with complex object destructuring
|
|
255
|
+
{
|
|
256
|
+
code: 'const { query } = require("db"); query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
257
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
describe('Uncovered Lines', () => {
|
|
264
|
+
// Lines 175, 181: High and medium confidence taint sources
|
|
265
|
+
ruleTester.run('line 175 - high confidence taint sources', databaseInjection, {
|
|
266
|
+
valid: [],
|
|
267
|
+
invalid: [
|
|
268
|
+
// Use case: SQL injection from HTTP request body (Express.js pattern)
|
|
269
|
+
// req.body is the most common source of untrusted user input in web applications
|
|
270
|
+
{
|
|
271
|
+
code: 'db.query(`SELECT * FROM users WHERE name = ${req.body.name}`);',
|
|
272
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
273
|
+
},
|
|
274
|
+
// Use case: SQL injection from URL query parameters
|
|
275
|
+
// req.query contains URL parameters (e.g., ?email=...), fully controlled by attacker
|
|
276
|
+
{
|
|
277
|
+
code: 'db.query(`SELECT * FROM users WHERE email = ${req.query.email}`);',
|
|
278
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
279
|
+
},
|
|
280
|
+
// Use case: SQL injection from URL path parameters
|
|
281
|
+
// req.params contains route parameters (e.g., /users/:id), can be manipulated
|
|
282
|
+
{
|
|
283
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${req.params.id}`);',
|
|
284
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
285
|
+
},
|
|
286
|
+
// Use case: SQL injection from request.body (alternative naming)
|
|
287
|
+
// Some frameworks use 'request' instead of 'req', same high risk
|
|
288
|
+
{
|
|
289
|
+
code: 'db.query(`SELECT * FROM users WHERE name = ${request.body.name}`);',
|
|
290
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
291
|
+
},
|
|
292
|
+
// Use case: SQL injection from standalone params object
|
|
293
|
+
// Shorthand for request parameters, equally dangerous
|
|
294
|
+
{
|
|
295
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${params.id}`);',
|
|
296
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
297
|
+
},
|
|
298
|
+
// Use case: SQL injection from standalone query object
|
|
299
|
+
// Shorthand for query parameters, common in destructured handlers
|
|
300
|
+
{
|
|
301
|
+
code: 'db.query(`SELECT * FROM users WHERE email = ${query.email}`);',
|
|
302
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
303
|
+
},
|
|
304
|
+
// Use case: SQL injection from standalone body object
|
|
305
|
+
// Destructured request body, still contains untrusted user input
|
|
306
|
+
{
|
|
307
|
+
code: 'db.query(`SELECT * FROM users WHERE name = ${body.name}`);',
|
|
308
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
309
|
+
},
|
|
310
|
+
// Use case: SQL injection from generic input object
|
|
311
|
+
// Common naming pattern for user-provided data
|
|
312
|
+
{
|
|
313
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${input.id}`);',
|
|
314
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
315
|
+
},
|
|
316
|
+
// Use case: SQL injection from variable named userInput
|
|
317
|
+
// Explicitly indicates untrusted user data by naming convention
|
|
318
|
+
{
|
|
319
|
+
code: 'db.query(`SELECT * FROM users WHERE name = ${userInput}`);',
|
|
320
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
321
|
+
},
|
|
322
|
+
],
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// Line 181: Medium confidence taint sources
|
|
326
|
+
ruleTester.run('line 181 - medium confidence taint sources', databaseInjection, {
|
|
327
|
+
valid: [],
|
|
328
|
+
invalid: [
|
|
329
|
+
// Use case: SQL injection from React/UI component props
|
|
330
|
+
// Props can be controlled by parent components, potentially from user input
|
|
331
|
+
{
|
|
332
|
+
code: 'db.query(`SELECT * FROM users WHERE name = ${props.name}`);',
|
|
333
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
334
|
+
},
|
|
335
|
+
// Use case: SQL injection from application state
|
|
336
|
+
// State may be populated from user actions or external sources
|
|
337
|
+
{
|
|
338
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${state.id}`);',
|
|
339
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
340
|
+
},
|
|
341
|
+
// Use case: SQL injection from context object
|
|
342
|
+
// Context often carries user session data or preferences
|
|
343
|
+
{
|
|
344
|
+
code: 'db.query(`SELECT * FROM users WHERE email = ${context.email}`);',
|
|
345
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
346
|
+
},
|
|
347
|
+
// Use case: SQL injection from event data
|
|
348
|
+
// Event handlers receive data from user interactions (clicks, inputs, etc.)
|
|
349
|
+
{
|
|
350
|
+
code: 'db.query(`SELECT * FROM users WHERE name = ${event.name}`);',
|
|
351
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
352
|
+
},
|
|
353
|
+
// Use case: SQL injection from generic data object
|
|
354
|
+
// Generic 'data' objects often contain user-provided or external information
|
|
355
|
+
{
|
|
356
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${data.id}`);',
|
|
357
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
358
|
+
},
|
|
359
|
+
],
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Lines 287-289: NoSQL operation detection
|
|
363
|
+
ruleTester.run('line 287-289 - NoSQL operation with tainted args', databaseInjection, {
|
|
364
|
+
valid: [],
|
|
365
|
+
invalid: [
|
|
366
|
+
// Use case: NoSQL injection via MongoDB find() with untrusted request data
|
|
367
|
+
// What's wrong: req.body.name can contain MongoDB operators like {$ne: null} to bypass filters
|
|
368
|
+
{
|
|
369
|
+
code: 'db.collection("users").find({ name: req.body.name });',
|
|
370
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
371
|
+
},
|
|
372
|
+
// Use case: NoSQL injection via MongoDB findOne() with URL parameters
|
|
373
|
+
// What's wrong: Attacker can inject MongoDB query operators through req.params.id
|
|
374
|
+
{
|
|
375
|
+
code: 'MongoClient.db.collection("users").findOne({ _id: req.params.id });',
|
|
376
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
377
|
+
},
|
|
378
|
+
// Use case: NoSQL injection via MongoDB updateOne() with tainted query filter
|
|
379
|
+
// What's wrong: The query filter contains req.query.name, allowing operator injection
|
|
380
|
+
// Note: Even though the update operation is benign, the filter is vulnerable
|
|
381
|
+
{
|
|
382
|
+
code: 'db.collection("users").updateOne({ name: req.query.name }, { $set: { status: "active" } });',
|
|
383
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
384
|
+
},
|
|
385
|
+
],
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
describe('Strategy Options', () => {
|
|
390
|
+
ruleTester.run('strategy parameterize', databaseInjection, {
|
|
391
|
+
valid: [],
|
|
392
|
+
invalid: [
|
|
393
|
+
// Use case: Test that 'parameterize' strategy provides specific fix guidance
|
|
394
|
+
// What this tests: With strategy='parameterize', rule suggests using parameterized queries
|
|
395
|
+
// Expected: Two messages - one for the vulnerability, one for the specific fix strategy
|
|
396
|
+
{
|
|
397
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
398
|
+
options: [{ strategy: 'parameterize' }],
|
|
399
|
+
errors: [
|
|
400
|
+
{ messageId: 'databaseInjection' },
|
|
401
|
+
{ messageId: 'strategyParameterize' }
|
|
402
|
+
],
|
|
403
|
+
},
|
|
404
|
+
],
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
ruleTester.run('strategy orm', databaseInjection, {
|
|
408
|
+
valid: [],
|
|
409
|
+
invalid: [
|
|
410
|
+
// Use case: Test that 'orm' strategy provides ORM-specific fix guidance
|
|
411
|
+
// What this tests: With strategy='orm', rule suggests using ORM query builders
|
|
412
|
+
// Expected: Two messages - vulnerability detection and ORM recommendation
|
|
413
|
+
{
|
|
414
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
415
|
+
options: [{ strategy: 'orm' }],
|
|
416
|
+
errors: [
|
|
417
|
+
{ messageId: 'databaseInjection' },
|
|
418
|
+
{ messageId: 'strategyORM' }
|
|
419
|
+
],
|
|
420
|
+
},
|
|
421
|
+
],
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
ruleTester.run('strategy sanitize', databaseInjection, {
|
|
425
|
+
valid: [],
|
|
426
|
+
invalid: [
|
|
427
|
+
// Use case: Test that 'sanitize' strategy provides input sanitization guidance
|
|
428
|
+
// What this tests: With strategy='sanitize', rule suggests input validation/escaping
|
|
429
|
+
// Expected: Two messages - vulnerability detection and sanitization recommendation
|
|
430
|
+
{
|
|
431
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
432
|
+
options: [{ strategy: 'sanitize' }],
|
|
433
|
+
errors: [
|
|
434
|
+
{ messageId: 'databaseInjection' },
|
|
435
|
+
{ messageId: 'strategySanitize' }
|
|
436
|
+
],
|
|
437
|
+
},
|
|
438
|
+
],
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
ruleTester.run('strategy auto (default)', databaseInjection, {
|
|
442
|
+
valid: [],
|
|
443
|
+
invalid: [
|
|
444
|
+
// Use case: Test that 'auto' strategy provides generic fix guidance
|
|
445
|
+
// What this tests: With strategy='auto' (default), rule detects but doesn't prescribe specific fix
|
|
446
|
+
// Expected: Only one message for the vulnerability, no strategy-specific guidance
|
|
447
|
+
{
|
|
448
|
+
code: 'db.query(`SELECT * FROM users WHERE id = ${userId}`);',
|
|
449
|
+
options: [{ strategy: 'auto' }],
|
|
450
|
+
errors: [{ messageId: 'databaseInjection' }],
|
|
451
|
+
},
|
|
452
|
+
],
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
|