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,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint Rule: no-xxe-injection
|
|
3
|
+
* Detects XML External Entity (XXE) injection vulnerabilities (CWE-611)
|
|
4
|
+
*
|
|
5
|
+
* XXE injection occurs when XML parsers process external entity references,
|
|
6
|
+
* allowing attackers to:
|
|
7
|
+
* - Read sensitive local files
|
|
8
|
+
* - Make HTTP requests to internal services
|
|
9
|
+
* - Cause DoS through entity expansion (billion laughs)
|
|
10
|
+
* - Perform SSRF attacks
|
|
11
|
+
*
|
|
12
|
+
* False Positive Reduction:
|
|
13
|
+
* This rule uses security utilities to reduce false positives by detecting:
|
|
14
|
+
* - Safe XML libraries (libxmljs with secure config, xmldom with entity resolution disabled)
|
|
15
|
+
* - Proper parser configuration
|
|
16
|
+
* - JSDoc annotations (@safe, @xxe-safe)
|
|
17
|
+
* - Input validation and sanitization
|
|
18
|
+
*/
|
|
19
|
+
import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
|
|
20
|
+
import { createRule } from '@interlace/eslint-devkit';
|
|
21
|
+
import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
|
|
22
|
+
|
|
23
|
+
type MessageIds =
|
|
24
|
+
| 'xxeInjection'
|
|
25
|
+
| 'unsafeXmlParser'
|
|
26
|
+
| 'externalEntityEnabled'
|
|
27
|
+
| 'untrustedXmlSource';
|
|
28
|
+
|
|
29
|
+
export interface Options {
|
|
30
|
+
/** Parser options that indicate safe configuration */
|
|
31
|
+
safeParserOptions?: string[];
|
|
32
|
+
|
|
33
|
+
/** Functions that validate/sanitize XML input */
|
|
34
|
+
xmlValidationFunctions?: string[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type RuleOptions = [Options?];
|
|
38
|
+
|
|
39
|
+
export const noXxeInjection = createRule<RuleOptions, MessageIds>({
|
|
40
|
+
name: 'no-xxe-injection',
|
|
41
|
+
meta: {
|
|
42
|
+
type: 'problem',
|
|
43
|
+
docs: {
|
|
44
|
+
description: 'Detect XML External Entity (XXE) injection vulnerabilities',
|
|
45
|
+
url: 'https://cwe.mitre.org/data/definitions/611.html',
|
|
46
|
+
},
|
|
47
|
+
messages: {
|
|
48
|
+
xxeInjection: formatLLMMessage({
|
|
49
|
+
icon: MessageIcons.SECURITY,
|
|
50
|
+
issueName: 'XXE Injection',
|
|
51
|
+
cwe: 'CWE-611',
|
|
52
|
+
description: 'XML contains dangerous entity declarations',
|
|
53
|
+
severity: 'CRITICAL',
|
|
54
|
+
fix: 'Remove SYSTEM/PUBLIC entity declarations or use safe XML parser',
|
|
55
|
+
documentationLink: 'https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing',
|
|
56
|
+
}),
|
|
57
|
+
unsafeXmlParser: formatLLMMessage({
|
|
58
|
+
icon: MessageIcons.SECURITY,
|
|
59
|
+
issueName: 'Unsafe XML Parser',
|
|
60
|
+
cwe: 'CWE-611',
|
|
61
|
+
description: 'Using unsafe XML parser without secure configuration',
|
|
62
|
+
severity: 'HIGH',
|
|
63
|
+
fix: 'Use libxmljs with noent: false or xmldom with entityResolver: null',
|
|
64
|
+
documentationLink: 'https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html',
|
|
65
|
+
}),
|
|
66
|
+
externalEntityEnabled: formatLLMMessage({
|
|
67
|
+
icon: MessageIcons.SECURITY,
|
|
68
|
+
issueName: 'External Entity Processing',
|
|
69
|
+
cwe: 'CWE-611',
|
|
70
|
+
description: 'External entity processing is enabled',
|
|
71
|
+
severity: 'CRITICAL',
|
|
72
|
+
fix: 'Disable external entity processing',
|
|
73
|
+
documentationLink: 'https://cwe.mitre.org/data/definitions/611.html',
|
|
74
|
+
}),
|
|
75
|
+
untrustedXmlSource: formatLLMMessage({
|
|
76
|
+
icon: MessageIcons.SECURITY,
|
|
77
|
+
issueName: 'Untrusted XML Source',
|
|
78
|
+
cwe: 'CWE-611',
|
|
79
|
+
description: 'XML from untrusted source without validation',
|
|
80
|
+
severity: 'HIGH',
|
|
81
|
+
fix: 'Validate and sanitize XML input before parsing',
|
|
82
|
+
documentationLink: 'https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html',
|
|
83
|
+
}),
|
|
84
|
+
},
|
|
85
|
+
schema: [
|
|
86
|
+
{
|
|
87
|
+
type: 'object',
|
|
88
|
+
properties: {
|
|
89
|
+
safeParserOptions: {
|
|
90
|
+
type: 'array',
|
|
91
|
+
items: { type: 'string' },
|
|
92
|
+
},
|
|
93
|
+
xmlValidationFunctions: {
|
|
94
|
+
type: 'array',
|
|
95
|
+
items: { type: 'string' },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
additionalProperties: false,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
defaultOptions: [
|
|
103
|
+
{
|
|
104
|
+
safeParserOptions: ['noent', 'resolveExternals', 'expandEntityReferences', 'entityResolver'],
|
|
105
|
+
xmlValidationFunctions: ['validateXml', 'sanitizeXml', 'cleanXml', 'parseXmlSafe'],
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
create(
|
|
109
|
+
context: TSESLint.RuleContext<MessageIds, RuleOptions>,
|
|
110
|
+
[options]: RuleOptions,
|
|
111
|
+
) {
|
|
112
|
+
const {
|
|
113
|
+
safeParserOptions = ['noent', 'resolveExternals', 'expandEntityReferences', 'entityResolver'],
|
|
114
|
+
xmlValidationFunctions = ['validateXml', 'sanitizeXml', 'cleanXml', 'parseXmlSafe'],
|
|
115
|
+
} = options || {};
|
|
116
|
+
|
|
117
|
+
const filename = context.filename || context.getFilename();
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Check if this is an XML parsing operation
|
|
121
|
+
*/
|
|
122
|
+
const isXmlParsingCall = (node: TSESTree.CallExpression): boolean => {
|
|
123
|
+
const callee = node.callee;
|
|
124
|
+
|
|
125
|
+
// Check for XML library method calls
|
|
126
|
+
if (callee.type === 'MemberExpression' &&
|
|
127
|
+
callee.property.type === 'Identifier' &&
|
|
128
|
+
['parse', 'parseFromString', 'parseString', 'parseXmlString', 'parseXML'].includes(callee.property.name)) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Check for constructor calls
|
|
133
|
+
if (callee.type === 'Identifier' &&
|
|
134
|
+
['DOMParser', 'XMLHttpRequest', 'ActiveXObject'].includes(callee.name)) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return false;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Check if parser options are secure
|
|
143
|
+
*/
|
|
144
|
+
const hasSecureParserOptions = (optionsNode: TSESTree.Node): boolean => {
|
|
145
|
+
if (optionsNode.type !== 'ObjectExpression') {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Check for secure options
|
|
150
|
+
for (const prop of optionsNode.properties) {
|
|
151
|
+
if (prop.type === 'Property' &&
|
|
152
|
+
prop.key.type === 'Identifier' &&
|
|
153
|
+
safeParserOptions.includes(prop.key.name)) {
|
|
154
|
+
|
|
155
|
+
// Check if the value is secure
|
|
156
|
+
if (prop.value.type === 'Literal' && prop.value.value === false) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
if (prop.value.type === 'Literal' && prop.value.value === null) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return false;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Check if parser options enable dangerous features
|
|
170
|
+
*/
|
|
171
|
+
const hasDangerousParserOptions = (optionsNode: TSESTree.Node): boolean => {
|
|
172
|
+
if (optionsNode.type !== 'ObjectExpression') {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Check for dangerous options
|
|
177
|
+
for (const prop of optionsNode.properties) {
|
|
178
|
+
if (prop.type === 'Property' &&
|
|
179
|
+
prop.key.type === 'Identifier' &&
|
|
180
|
+
['resolveExternals', 'expandEntityReferences', 'noent'].includes(prop.key.name)) {
|
|
181
|
+
|
|
182
|
+
// Check if the value enables dangerous features
|
|
183
|
+
if (prop.value.type === 'Literal' && prop.value.value === true) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return false;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Check if input has been validated
|
|
194
|
+
*/
|
|
195
|
+
const isXmlInputValidated = (xmlSource: TSESTree.Node): boolean => {
|
|
196
|
+
// Check if the input comes from a validation function
|
|
197
|
+
let current: TSESTree.Node | undefined = xmlSource;
|
|
198
|
+
|
|
199
|
+
while (current) {
|
|
200
|
+
if (current.type === 'CallExpression' &&
|
|
201
|
+
current.callee.type === 'Identifier' &&
|
|
202
|
+
xmlValidationFunctions.includes(current.callee.name)) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
current = current.parent as TSESTree.Node;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return false;
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Check if XML contains dangerous entity declarations
|
|
213
|
+
*/
|
|
214
|
+
const containsDangerousEntities = (xmlText: string): boolean => {
|
|
215
|
+
return /<!ENTITY/i.test(xmlText) &&
|
|
216
|
+
/SYSTEM\s+["']/i.test(xmlText);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Check if input source is untrusted
|
|
221
|
+
*/
|
|
222
|
+
const isUntrustedXmlSource = (xmlSource: TSESTree.Node): boolean => {
|
|
223
|
+
// Check for user input sources
|
|
224
|
+
if (xmlSource.type === 'Identifier') {
|
|
225
|
+
const varName = xmlSource.name.toLowerCase();
|
|
226
|
+
|
|
227
|
+
// Consider variables with safe/validated names as trusted
|
|
228
|
+
if (['clean', 'safe', 'validated', 'sanitized', 'validatedxml', 'sanitizedxml'].some(safe =>
|
|
229
|
+
varName.includes(safe)
|
|
230
|
+
)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return ['req', 'request', 'body', 'query', 'params', 'input', 'xml', 'data'].some(keyword =>
|
|
235
|
+
varName.includes(keyword)
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Check for file system reads (potentially untrusted)
|
|
240
|
+
let current: TSESTree.Node | undefined = xmlSource;
|
|
241
|
+
while (current) {
|
|
242
|
+
if (current.type === 'CallExpression' &&
|
|
243
|
+
current.callee.type === 'MemberExpression' &&
|
|
244
|
+
current.callee.property.type === 'Identifier' &&
|
|
245
|
+
['readFileSync', 'readFile', 'createReadStream'].includes(current.callee.property.name)) {
|
|
246
|
+
return true; // File input is potentially untrusted
|
|
247
|
+
}
|
|
248
|
+
current = current.parent as TSESTree.Node;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return false;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
return {
|
|
255
|
+
// Check XML parsing calls
|
|
256
|
+
CallExpression(node: TSESTree.CallExpression) {
|
|
257
|
+
if (!isXmlParsingCall(node)) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const args = node.arguments;
|
|
262
|
+
if (args.length === 0) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Check XML input source
|
|
267
|
+
const xmlInput = args[0];
|
|
268
|
+
const isUntrusted = isUntrustedXmlSource(xmlInput);
|
|
269
|
+
const isValidated = isXmlInputValidated(xmlInput);
|
|
270
|
+
|
|
271
|
+
// Check if this parser call uses secure options
|
|
272
|
+
const hasSecureOptions = args.length >= 2 && hasSecureParserOptions(args[1]);
|
|
273
|
+
|
|
274
|
+
// CRITICAL: Untrusted XML input without validation (only if parser is not secure)
|
|
275
|
+
if (isUntrusted && !isValidated && !hasSecureOptions) {
|
|
276
|
+
context.report({
|
|
277
|
+
node: xmlInput,
|
|
278
|
+
messageId: 'untrustedXmlSource',
|
|
279
|
+
data: {
|
|
280
|
+
filePath: filename,
|
|
281
|
+
line: String(node.loc?.start.line ?? 0),
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Check for dangerous parser options
|
|
287
|
+
if (args.length >= 2) {
|
|
288
|
+
const optionsArg = args[1];
|
|
289
|
+
|
|
290
|
+
if (hasDangerousParserOptions(optionsArg)) {
|
|
291
|
+
context.report({
|
|
292
|
+
node: optionsArg,
|
|
293
|
+
messageId: 'externalEntityEnabled',
|
|
294
|
+
data: {
|
|
295
|
+
filePath: filename,
|
|
296
|
+
line: String(node.loc?.start.line ?? 0),
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// DOMParser method safety is covered by constructor detection
|
|
303
|
+
// No need to report unsafeXmlParser for individual method calls
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
// Check XML parser constructor calls
|
|
308
|
+
NewExpression(node: TSESTree.NewExpression) {
|
|
309
|
+
const callee = node.callee;
|
|
310
|
+
if (callee.type !== 'Identifier' ||
|
|
311
|
+
!['DOMParser', 'XMLHttpRequest', 'ActiveXObject'].includes(callee.name)) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Constructor calls for XML parsers are considered unsafe
|
|
316
|
+
context.report({
|
|
317
|
+
node,
|
|
318
|
+
messageId: 'unsafeXmlParser',
|
|
319
|
+
data: {
|
|
320
|
+
filePath: filename,
|
|
321
|
+
line: String(node.loc?.start.line ?? 0),
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
// Check for dangerous XML literals
|
|
327
|
+
Literal(node: TSESTree.Literal) {
|
|
328
|
+
if (typeof node.value === 'string' && containsDangerousEntities(node.value)) {
|
|
329
|
+
context.report({
|
|
330
|
+
node,
|
|
331
|
+
messageId: 'xxeInjection',
|
|
332
|
+
data: {
|
|
333
|
+
filePath: filename,
|
|
334
|
+
line: String(node.loc?.start.line ?? 0),
|
|
335
|
+
safeAlternative: 'Use sanitized XML or remove entity declarations',
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
};
|
|
341
|
+
},
|
|
342
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive tests for no-xxe-injection rule
|
|
3
|
+
* Security: CWE-611 (XML External Entity 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 { noXxeInjection } 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('no-xxe-injection', () => {
|
|
26
|
+
describe('Valid Code - Secure XML Parsing', () => {
|
|
27
|
+
ruleTester.run('valid - secure XML parsing', noXxeInjection, {
|
|
28
|
+
valid: [
|
|
29
|
+
// Secure libxmljs usage with noent: false
|
|
30
|
+
'const libxml = require("libxmljs"); const doc = libxml.parseXmlString(xmlString, { noent: false });',
|
|
31
|
+
|
|
32
|
+
// Secure xmldom usage with entityResolver: null
|
|
33
|
+
'const parser = new xmldom.DOMParser({ entityResolver: null });',
|
|
34
|
+
|
|
35
|
+
// Non-XML parsing (should not trigger)
|
|
36
|
+
'const data = JSON.parse(jsonString);',
|
|
37
|
+
|
|
38
|
+
// Safe string literals without entities
|
|
39
|
+
'const xml = "<root><child>Hello</child></root>";',
|
|
40
|
+
|
|
41
|
+
// Trusted libraries with custom config
|
|
42
|
+
'myXmlParser.parse(xml, { noent: false });',
|
|
43
|
+
|
|
44
|
+
// Validated/sanitized inputs
|
|
45
|
+
{
|
|
46
|
+
code: 'const cleanXml = validateXml(req.body); parser.parse(cleanXml);',
|
|
47
|
+
options: [{ xmlValidationFunctions: ['validateXml'] }],
|
|
48
|
+
},
|
|
49
|
+
'const safeXml = sanitizeXmlInput(userInput); libxmljs.parseXmlString(safeXml, { noent: false });',
|
|
50
|
+
|
|
51
|
+
// Internal/trusted XML sources
|
|
52
|
+
'const configXml = fs.readFileSync("./config.xml", "utf8");',
|
|
53
|
+
],
|
|
54
|
+
invalid: [],
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('Invalid Code - XXE Vulnerabilities', () => {
|
|
59
|
+
ruleTester.run('invalid - XXE injection vulnerabilities', noXxeInjection, {
|
|
60
|
+
valid: [],
|
|
61
|
+
invalid: [
|
|
62
|
+
// Dangerous parser options - external entities enabled
|
|
63
|
+
{
|
|
64
|
+
code: 'parser.parse(xmlString, { resolveExternals: true });',
|
|
65
|
+
errors: [
|
|
66
|
+
{ messageId: 'untrustedXmlSource' },
|
|
67
|
+
{ messageId: 'externalEntityEnabled' },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
code: 'libxmljs.parseXmlString(xml, { noent: true });',
|
|
72
|
+
errors: [
|
|
73
|
+
{ messageId: 'untrustedXmlSource' },
|
|
74
|
+
{ messageId: 'externalEntityEnabled' },
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
code: 'parser.parse(xml, { expandEntityReferences: true });',
|
|
79
|
+
errors: [
|
|
80
|
+
{ messageId: 'untrustedXmlSource' },
|
|
81
|
+
{ messageId: 'externalEntityEnabled' },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
// Untrusted XML sources from user input
|
|
86
|
+
{
|
|
87
|
+
code: 'const userXml = req.query.xml; libxmljs.parseXmlString(userXml);',
|
|
88
|
+
errors: [{ messageId: 'untrustedXmlSource' }],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
code: 'const xmlData = fs.readFileSync(userFile, "utf8"); const doc = DOMParser.parse(xmlData);',
|
|
92
|
+
errors: [{ messageId: 'untrustedXmlSource' }],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
code: 'const input = req.body; parser.parse(input);',
|
|
96
|
+
errors: [{ messageId: 'untrustedXmlSource' }],
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
// Unsafe XML parsers without proper configuration
|
|
100
|
+
{
|
|
101
|
+
code: 'const parser = new DOMParser(); const doc = parser.parseFromString(xmlString, "text/xml");',
|
|
102
|
+
errors: [
|
|
103
|
+
{ messageId: 'unsafeXmlParser' },
|
|
104
|
+
{ messageId: 'untrustedXmlSource' },
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
code: 'new DOMParser();',
|
|
109
|
+
errors: [{ messageId: 'unsafeXmlParser' }],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
code: 'new XMLHttpRequest();',
|
|
113
|
+
errors: [{ messageId: 'unsafeXmlParser' }],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
code: 'new ActiveXObject("Microsoft.XMLDOM");',
|
|
117
|
+
errors: [{ messageId: 'unsafeXmlParser' }],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
});
|