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.
- package/CHANGELOG.md +51 -1
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/index.d.ts +32 -0
- package/src/index.js +416 -0
- package/src/rules/detect-child-process/index.d.ts +11 -0
- package/src/rules/detect-child-process/index.js +529 -0
- package/src/rules/detect-eval-with-expression/index.d.ts +9 -0
- package/src/rules/detect-eval-with-expression/index.js +392 -0
- package/src/rules/detect-mixed-content/index.d.ts +8 -0
- package/src/rules/detect-mixed-content/index.js +44 -0
- package/src/rules/detect-non-literal-fs-filename/index.d.ts +7 -0
- package/src/rules/detect-non-literal-fs-filename/index.js +454 -0
- package/src/rules/detect-non-literal-regexp/index.d.ts +9 -0
- package/src/rules/detect-non-literal-regexp/index.js +403 -0
- package/src/rules/detect-object-injection/index.d.ts +11 -0
- package/src/rules/detect-object-injection/index.js +560 -0
- package/src/rules/detect-suspicious-dependencies/index.d.ts +8 -0
- package/src/rules/detect-suspicious-dependencies/index.js +71 -0
- package/src/rules/detect-weak-password-validation/index.d.ts +6 -0
- package/src/rules/detect-weak-password-validation/index.js +58 -0
- package/src/rules/no-allow-arbitrary-loads/index.d.ts +8 -0
- package/src/rules/no-allow-arbitrary-loads/index.js +47 -0
- package/src/rules/no-arbitrary-file-access/index.d.ts +13 -0
- package/src/rules/no-arbitrary-file-access/index.js +195 -0
- package/src/rules/no-buffer-overread/index.d.ts +29 -0
- package/src/rules/no-buffer-overread/index.js +606 -0
- package/src/rules/no-clickjacking/index.d.ts +10 -0
- package/src/rules/no-clickjacking/index.js +396 -0
- package/src/rules/no-client-side-auth-logic/index.d.ts +6 -0
- package/src/rules/no-client-side-auth-logic/index.js +69 -0
- package/src/rules/no-credentials-in-query-params/index.d.ts +8 -0
- package/src/rules/no-credentials-in-query-params/index.js +57 -0
- package/src/rules/no-data-in-temp-storage/index.d.ts +6 -0
- package/src/rules/no-data-in-temp-storage/index.js +64 -0
- package/src/rules/no-debug-code-in-production/index.d.ts +8 -0
- package/src/rules/no-debug-code-in-production/index.js +51 -0
- package/src/rules/no-directive-injection/index.d.ts +12 -0
- package/src/rules/no-directive-injection/index.js +457 -0
- package/src/rules/no-disabled-certificate-validation/index.d.ts +6 -0
- package/src/rules/no-disabled-certificate-validation/index.js +61 -0
- package/src/rules/no-dynamic-dependency-loading/index.d.ts +8 -0
- package/src/rules/no-dynamic-dependency-loading/index.js +51 -0
- package/src/rules/no-electron-security-issues/index.d.ts +10 -0
- package/src/rules/no-electron-security-issues/index.js +423 -0
- package/src/rules/no-exposed-debug-endpoints/index.d.ts +6 -0
- package/src/rules/no-exposed-debug-endpoints/index.js +62 -0
- package/src/rules/no-exposed-sensitive-data/index.d.ts +11 -0
- package/src/rules/no-exposed-sensitive-data/index.js +340 -0
- package/src/rules/no-format-string-injection/index.d.ts +17 -0
- package/src/rules/no-format-string-injection/index.js +660 -0
- package/src/rules/no-graphql-injection/index.d.ts +12 -0
- package/src/rules/no-graphql-injection/index.js +411 -0
- package/src/rules/no-hardcoded-credentials/index.d.ts +26 -0
- package/src/rules/no-hardcoded-credentials/index.js +376 -0
- package/src/rules/no-hardcoded-session-tokens/index.d.ts +6 -0
- package/src/rules/no-hardcoded-session-tokens/index.js +59 -0
- package/src/rules/no-http-urls/index.d.ts +12 -0
- package/src/rules/no-http-urls/index.js +114 -0
- package/src/rules/no-improper-sanitization/index.d.ts +12 -0
- package/src/rules/no-improper-sanitization/index.js +411 -0
- package/src/rules/no-improper-type-validation/index.d.ts +10 -0
- package/src/rules/no-improper-type-validation/index.js +475 -0
- package/src/rules/no-insecure-comparison/index.d.ts +7 -0
- package/src/rules/no-insecure-comparison/index.js +193 -0
- package/src/rules/no-insecure-redirects/index.d.ts +7 -0
- package/src/rules/no-insecure-redirects/index.js +216 -0
- package/src/rules/no-insecure-websocket/index.d.ts +6 -0
- package/src/rules/no-insecure-websocket/index.js +61 -0
- package/src/rules/no-ldap-injection/index.d.ts +10 -0
- package/src/rules/no-ldap-injection/index.js +455 -0
- package/src/rules/no-missing-authentication/index.d.ts +13 -0
- package/src/rules/no-missing-authentication/index.js +333 -0
- package/src/rules/no-missing-cors-check/index.d.ts +9 -0
- package/src/rules/no-missing-cors-check/index.js +399 -0
- package/src/rules/no-missing-csrf-protection/index.d.ts +11 -0
- package/src/rules/no-missing-csrf-protection/index.js +180 -0
- package/src/rules/no-missing-security-headers/index.d.ts +7 -0
- package/src/rules/no-missing-security-headers/index.js +218 -0
- package/src/rules/no-password-in-url/index.d.ts +8 -0
- package/src/rules/no-password-in-url/index.js +54 -0
- package/src/rules/no-permissive-cors/index.d.ts +8 -0
- package/src/rules/no-permissive-cors/index.js +65 -0
- package/src/rules/no-pii-in-logs/index.d.ts +8 -0
- package/src/rules/no-pii-in-logs/index.js +70 -0
- package/src/rules/no-privilege-escalation/index.d.ts +13 -0
- package/src/rules/no-privilege-escalation/index.js +321 -0
- package/src/rules/no-redos-vulnerable-regex/index.d.ts +7 -0
- package/src/rules/no-redos-vulnerable-regex/index.js +306 -0
- package/src/rules/no-sensitive-data-exposure/index.d.ts +11 -0
- package/src/rules/no-sensitive-data-exposure/index.js +250 -0
- package/src/rules/no-sensitive-data-in-analytics/index.d.ts +8 -0
- package/src/rules/no-sensitive-data-in-analytics/index.js +62 -0
- package/src/rules/no-sensitive-data-in-cache/index.d.ts +8 -0
- package/src/rules/no-sensitive-data-in-cache/index.js +52 -0
- package/src/rules/no-toctou-vulnerability/index.d.ts +7 -0
- package/src/rules/no-toctou-vulnerability/index.js +208 -0
- package/src/rules/no-tracking-without-consent/index.d.ts +6 -0
- package/src/rules/no-tracking-without-consent/index.js +67 -0
- package/src/rules/no-unchecked-loop-condition/index.d.ts +12 -0
- package/src/rules/no-unchecked-loop-condition/index.js +646 -0
- package/src/rules/no-unencrypted-transmission/index.d.ts +11 -0
- package/src/rules/no-unencrypted-transmission/index.js +236 -0
- package/src/rules/no-unescaped-url-parameter/index.d.ts +9 -0
- package/src/rules/no-unescaped-url-parameter/index.js +355 -0
- package/src/rules/no-unlimited-resource-allocation/index.d.ts +12 -0
- package/src/rules/no-unlimited-resource-allocation/index.js +643 -0
- package/src/rules/no-unsafe-deserialization/index.d.ts +10 -0
- package/src/rules/no-unsafe-deserialization/index.js +491 -0
- package/src/rules/no-unsafe-dynamic-require/index.d.ts +5 -0
- package/src/rules/no-unsafe-dynamic-require/index.js +106 -0
- package/src/rules/no-unsafe-regex-construction/index.d.ts +9 -0
- package/src/rules/no-unsafe-regex-construction/index.js +291 -0
- package/src/rules/no-unvalidated-deeplinks/index.d.ts +6 -0
- package/src/rules/no-unvalidated-deeplinks/index.js +62 -0
- package/src/rules/no-unvalidated-user-input/index.d.ts +9 -0
- package/src/rules/no-unvalidated-user-input/index.js +420 -0
- package/src/rules/no-verbose-error-messages/index.d.ts +8 -0
- package/src/rules/no-verbose-error-messages/index.js +68 -0
- package/src/rules/no-weak-password-recovery/index.d.ts +12 -0
- package/src/rules/no-weak-password-recovery/index.js +424 -0
- package/src/rules/no-xpath-injection/index.d.ts +10 -0
- package/src/rules/no-xpath-injection/index.js +487 -0
- package/src/rules/no-xxe-injection/index.d.ts +7 -0
- package/src/rules/no-xxe-injection/index.js +266 -0
- package/src/rules/no-zip-slip/index.d.ts +9 -0
- package/src/rules/no-zip-slip/index.js +445 -0
- package/src/rules/require-backend-authorization/index.d.ts +6 -0
- package/src/rules/require-backend-authorization/index.js +60 -0
- package/src/rules/require-code-minification/index.d.ts +8 -0
- package/src/rules/require-code-minification/index.js +47 -0
- package/src/rules/require-csp-headers/index.d.ts +6 -0
- package/src/rules/require-csp-headers/index.js +64 -0
- package/src/rules/require-data-minimization/index.d.ts +8 -0
- package/src/rules/require-data-minimization/index.js +53 -0
- package/src/rules/require-dependency-integrity/index.d.ts +6 -0
- package/src/rules/require-dependency-integrity/index.js +64 -0
- package/src/rules/require-https-only/index.d.ts +8 -0
- package/src/rules/require-https-only/index.js +62 -0
- package/src/rules/require-mime-type-validation/index.d.ts +6 -0
- package/src/rules/require-mime-type-validation/index.js +66 -0
- package/src/rules/require-network-timeout/index.d.ts +8 -0
- package/src/rules/require-network-timeout/index.js +50 -0
- package/src/rules/require-package-lock/index.d.ts +8 -0
- package/src/rules/require-package-lock/index.js +63 -0
- package/src/rules/require-secure-credential-storage/index.d.ts +8 -0
- package/src/rules/require-secure-credential-storage/index.js +50 -0
- package/src/rules/require-secure-defaults/index.d.ts +8 -0
- package/src/rules/require-secure-defaults/index.js +47 -0
- package/src/rules/require-secure-deletion/index.d.ts +8 -0
- package/src/rules/require-secure-deletion/index.js +44 -0
- package/src/rules/require-storage-encryption/index.d.ts +8 -0
- package/src/rules/require-storage-encryption/index.js +50 -0
- package/src/rules/require-url-validation/index.d.ts +6 -0
- package/src/rules/require-url-validation/index.js +72 -0
- package/src/types/index.d.ts +106 -0
- package/src/types/index.js +16 -0
- package/src/index.ts +0 -605
- package/src/rules/__tests__/integration-demo.test.ts +0 -290
- package/src/rules/__tests__/integration-llm.test.ts +0 -89
- package/src/rules/database-injection/database-injection.test.ts +0 -456
- package/src/rules/database-injection/index.ts +0 -488
- package/src/rules/detect-child-process/detect-child-process.test.ts +0 -207
- package/src/rules/detect-child-process/index.ts +0 -634
- package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +0 -416
- package/src/rules/detect-eval-with-expression/index.ts +0 -463
- package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +0 -28
- package/src/rules/detect-mixed-content/index.ts +0 -52
- package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +0 -269
- package/src/rules/detect-non-literal-fs-filename/index.ts +0 -551
- package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +0 -189
- package/src/rules/detect-non-literal-regexp/index.ts +0 -490
- package/src/rules/detect-object-injection/detect-object-injection.test.ts +0 -440
- package/src/rules/detect-object-injection/index.ts +0 -674
- package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +0 -32
- package/src/rules/detect-suspicious-dependencies/index.ts +0 -84
- package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +0 -31
- package/src/rules/detect-weak-password-validation/index.ts +0 -68
- package/src/rules/no-allow-arbitrary-loads/index.ts +0 -54
- package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +0 -28
- package/src/rules/no-arbitrary-file-access/index.ts +0 -238
- package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +0 -119
- package/src/rules/no-buffer-overread/index.ts +0 -724
- package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +0 -313
- package/src/rules/no-clickjacking/index.ts +0 -481
- package/src/rules/no-clickjacking/no-clickjacking.test.ts +0 -253
- package/src/rules/no-client-side-auth-logic/index.ts +0 -81
- package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +0 -33
- package/src/rules/no-credentials-in-query-params/index.ts +0 -69
- package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +0 -33
- package/src/rules/no-credentials-in-storage-api/index.ts +0 -64
- package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +0 -31
- package/src/rules/no-data-in-temp-storage/index.ts +0 -75
- package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +0 -33
- package/src/rules/no-debug-code-in-production/index.ts +0 -59
- package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +0 -26
- package/src/rules/no-directive-injection/index.ts +0 -551
- package/src/rules/no-directive-injection/no-directive-injection.test.ts +0 -305
- package/src/rules/no-disabled-certificate-validation/index.ts +0 -72
- package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +0 -33
- package/src/rules/no-document-cookie/index.ts +0 -113
- package/src/rules/no-document-cookie/no-document-cookie.test.ts +0 -382
- package/src/rules/no-dynamic-dependency-loading/index.ts +0 -60
- package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +0 -27
- package/src/rules/no-electron-security-issues/index.ts +0 -504
- package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +0 -324
- package/src/rules/no-exposed-debug-endpoints/index.ts +0 -73
- package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +0 -40
- package/src/rules/no-exposed-sensitive-data/index.ts +0 -428
- package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +0 -75
- package/src/rules/no-format-string-injection/index.ts +0 -801
- package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +0 -437
- package/src/rules/no-graphql-injection/index.ts +0 -508
- package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +0 -371
- package/src/rules/no-hardcoded-credentials/index.ts +0 -478
- package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +0 -639
- package/src/rules/no-hardcoded-session-tokens/index.ts +0 -69
- package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +0 -42
- package/src/rules/no-http-urls/index.ts +0 -131
- package/src/rules/no-http-urls/no-http-urls.test.ts +0 -60
- package/src/rules/no-improper-sanitization/index.ts +0 -502
- package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +0 -156
- package/src/rules/no-improper-type-validation/index.ts +0 -572
- package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +0 -372
- package/src/rules/no-insecure-comparison/index.ts +0 -232
- package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +0 -218
- package/src/rules/no-insecure-cookie-settings/index.ts +0 -391
- package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +0 -409
- package/src/rules/no-insecure-jwt/index.ts +0 -467
- package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +0 -259
- package/src/rules/no-insecure-redirects/index.ts +0 -267
- package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +0 -108
- package/src/rules/no-insecure-websocket/index.ts +0 -72
- package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +0 -42
- package/src/rules/no-insufficient-postmessage-validation/index.ts +0 -497
- package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +0 -360
- package/src/rules/no-insufficient-random/index.ts +0 -288
- package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +0 -246
- package/src/rules/no-ldap-injection/index.ts +0 -547
- package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +0 -317
- package/src/rules/no-missing-authentication/index.ts +0 -408
- package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +0 -350
- package/src/rules/no-missing-cors-check/index.ts +0 -453
- package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +0 -392
- package/src/rules/no-missing-csrf-protection/index.ts +0 -229
- package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +0 -222
- package/src/rules/no-missing-security-headers/index.ts +0 -266
- package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +0 -98
- package/src/rules/no-password-in-url/index.ts +0 -64
- package/src/rules/no-password-in-url/no-password-in-url.test.ts +0 -27
- package/src/rules/no-permissive-cors/index.ts +0 -78
- package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +0 -28
- package/src/rules/no-pii-in-logs/index.ts +0 -83
- package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +0 -26
- package/src/rules/no-postmessage-origin-wildcard/index.ts +0 -67
- package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +0 -27
- package/src/rules/no-privilege-escalation/index.ts +0 -403
- package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +0 -306
- package/src/rules/no-redos-vulnerable-regex/index.ts +0 -379
- package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +0 -83
- package/src/rules/no-sensitive-data-exposure/index.ts +0 -294
- package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +0 -262
- package/src/rules/no-sensitive-data-in-analytics/index.ts +0 -73
- package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +0 -42
- package/src/rules/no-sensitive-data-in-cache/index.ts +0 -59
- package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +0 -32
- package/src/rules/no-sql-injection/index.ts +0 -424
- package/src/rules/no-sql-injection/no-sql-injection.test.ts +0 -303
- package/src/rules/no-timing-attack/index.ts +0 -552
- package/src/rules/no-timing-attack/no-timing-attack.test.ts +0 -348
- package/src/rules/no-toctou-vulnerability/index.ts +0 -250
- package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +0 -60
- package/src/rules/no-tracking-without-consent/index.ts +0 -78
- package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +0 -34
- package/src/rules/no-unchecked-loop-condition/index.ts +0 -781
- package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +0 -459
- package/src/rules/no-unencrypted-local-storage/index.ts +0 -73
- package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +0 -41
- package/src/rules/no-unencrypted-transmission/index.ts +0 -296
- package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +0 -287
- package/src/rules/no-unescaped-url-parameter/index.ts +0 -424
- package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +0 -263
- package/src/rules/no-unlimited-resource-allocation/index.ts +0 -767
- package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +0 -544
- package/src/rules/no-unsafe-deserialization/index.ts +0 -593
- package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +0 -310
- package/src/rules/no-unsafe-dynamic-require/index.ts +0 -125
- package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +0 -151
- package/src/rules/no-unsafe-regex-construction/index.ts +0 -370
- package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +0 -181
- package/src/rules/no-unsanitized-html/index.ts +0 -400
- package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +0 -488
- package/src/rules/no-unvalidated-deeplinks/index.ts +0 -73
- package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +0 -29
- package/src/rules/no-unvalidated-user-input/index.ts +0 -498
- package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +0 -463
- package/src/rules/no-verbose-error-messages/index.ts +0 -83
- package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +0 -34
- package/src/rules/no-weak-crypto/index.ts +0 -447
- package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +0 -297
- package/src/rules/no-weak-password-recovery/index.ts +0 -509
- package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +0 -184
- package/src/rules/no-xpath-injection/index.ts +0 -596
- package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +0 -405
- package/src/rules/no-xxe-injection/index.ts +0 -342
- package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +0 -122
- package/src/rules/no-zip-slip/index.ts +0 -526
- package/src/rules/no-zip-slip/no-zip-slip.test.ts +0 -305
- package/src/rules/require-backend-authorization/index.ts +0 -71
- package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +0 -31
- package/src/rules/require-code-minification/index.ts +0 -54
- package/src/rules/require-code-minification/require-code-minification.test.ts +0 -30
- package/src/rules/require-csp-headers/index.ts +0 -74
- package/src/rules/require-csp-headers/require-csp-headers.test.ts +0 -34
- package/src/rules/require-data-minimization/index.ts +0 -65
- package/src/rules/require-data-minimization/require-data-minimization.test.ts +0 -31
- package/src/rules/require-dependency-integrity/index.ts +0 -78
- package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +0 -44
- package/src/rules/require-https-only/index.ts +0 -75
- package/src/rules/require-https-only/require-https-only.test.ts +0 -26
- package/src/rules/require-mime-type-validation/index.ts +0 -77
- package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +0 -32
- package/src/rules/require-network-timeout/index.ts +0 -58
- package/src/rules/require-network-timeout/require-network-timeout.test.ts +0 -26
- package/src/rules/require-package-lock/index.ts +0 -75
- package/src/rules/require-package-lock/require-package-lock.test.ts +0 -27
- package/src/rules/require-secure-credential-storage/index.ts +0 -60
- package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +0 -26
- package/src/rules/require-secure-defaults/index.ts +0 -54
- package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +0 -26
- package/src/rules/require-secure-deletion/index.ts +0 -52
- package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +0 -29
- package/src/rules/require-storage-encryption/index.ts +0 -60
- package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +0 -26
- package/src/rules/require-url-validation/index.ts +0 -85
- package/src/rules/require-url-validation/require-url-validation.test.ts +0 -32
- package/src/types/index.ts +0 -235
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Comprehensive tests for no-directive-injection rule
|
|
3
|
-
* Security: CWE-96 (Improper Neutralization of Directives in Statically Saved Code)
|
|
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 { noDirectiveInjection } 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+) with JSX support
|
|
17
|
-
const ruleTester = new RuleTester({
|
|
18
|
-
languageOptions: {
|
|
19
|
-
parser,
|
|
20
|
-
ecmaVersion: 2022,
|
|
21
|
-
sourceType: 'module',
|
|
22
|
-
parserOptions: {
|
|
23
|
-
ecmaFeatures: {
|
|
24
|
-
jsx: true,
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
describe('no-directive-injection', () => {
|
|
31
|
-
describe('Valid Code', () => {
|
|
32
|
-
ruleTester.run('valid - safe directive usage', noDirectiveInjection, {
|
|
33
|
-
valid: [
|
|
34
|
-
// Safe innerHTML with text content (not innerHTML)
|
|
35
|
-
{
|
|
36
|
-
code: 'element.textContent = userInput;',
|
|
37
|
-
},
|
|
38
|
-
// Trusted directive names (string literal, not user input)
|
|
39
|
-
{
|
|
40
|
-
code: 'Vue.directive("my-directive", { /* safe */ });',
|
|
41
|
-
},
|
|
42
|
-
// Static HTML (no user input variables)
|
|
43
|
-
{
|
|
44
|
-
code: '<div dangerouslySetInnerHTML={{ __html: "static content" }} />',
|
|
45
|
-
},
|
|
46
|
-
// innerHTML with non-user input
|
|
47
|
-
{
|
|
48
|
-
code: 'element.innerHTML = staticContent;',
|
|
49
|
-
},
|
|
50
|
-
// Handlebars compile with non-user input
|
|
51
|
-
{
|
|
52
|
-
code: 'const compiled = Handlebars.compile(staticTemplate);',
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
invalid: [],
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
describe('Invalid Code - dangerouslySetInnerHTML', () => {
|
|
60
|
-
ruleTester.run('invalid - dangerous innerHTML usage', noDirectiveInjection, {
|
|
61
|
-
valid: [],
|
|
62
|
-
invalid: [
|
|
63
|
-
// userInput is a recognized user input variable
|
|
64
|
-
{
|
|
65
|
-
code: '<div dangerouslySetInnerHTML={{ __html: userInput }} />',
|
|
66
|
-
errors: [
|
|
67
|
-
{
|
|
68
|
-
messageId: 'dangerousInnerHTML',
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
},
|
|
72
|
-
// req.body.content contains 'body' which is a user input variable
|
|
73
|
-
{
|
|
74
|
-
code: '<div dangerouslySetInnerHTML={{ __html: req.body.content }} />',
|
|
75
|
-
errors: [
|
|
76
|
-
{
|
|
77
|
-
messageId: 'dangerousInnerHTML',
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe('Invalid Code - Template Injection', () => {
|
|
86
|
-
ruleTester.run('invalid - template injection in JSX', noDirectiveInjection, {
|
|
87
|
-
valid: [],
|
|
88
|
-
invalid: [
|
|
89
|
-
// Template literal with userInput in dangerouslySetInnerHTML
|
|
90
|
-
// Only triggers dangerousInnerHTML (JSX context doesn't trigger templateInjection via TemplateLiteral visitor)
|
|
91
|
-
{
|
|
92
|
-
code: '<div dangerouslySetInnerHTML={{ __html: `Hello ${userInput}!` }} />',
|
|
93
|
-
errors: [
|
|
94
|
-
{
|
|
95
|
-
messageId: 'dangerousInnerHTML',
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
messageId: 'templateInjection',
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
],
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe('Invalid Code - innerHTML Assignments', () => {
|
|
107
|
-
ruleTester.run('invalid - unsafe innerHTML assignments', noDirectiveInjection, {
|
|
108
|
-
valid: [],
|
|
109
|
-
invalid: [
|
|
110
|
-
{
|
|
111
|
-
code: 'element.innerHTML = userInput;',
|
|
112
|
-
errors: [
|
|
113
|
-
{
|
|
114
|
-
messageId: 'dangerousInnerHTML',
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
code: 'document.getElementById("content").innerHTML = req.body.html;',
|
|
120
|
-
errors: [
|
|
121
|
-
{
|
|
122
|
-
messageId: 'dangerousInnerHTML',
|
|
123
|
-
},
|
|
124
|
-
],
|
|
125
|
-
},
|
|
126
|
-
],
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe('Invalid Code - Dynamic Component Binding', () => {
|
|
131
|
-
ruleTester.run('invalid - unsafe component binding', noDirectiveInjection, {
|
|
132
|
-
valid: [],
|
|
133
|
-
invalid: [
|
|
134
|
-
// JSX is={userInput} - userInput is in user input variables
|
|
135
|
-
// Rule only detects Identifiers (not MemberExpressions like req.query.x)
|
|
136
|
-
{
|
|
137
|
-
code: '<div is={userInput}></div>',
|
|
138
|
-
errors: [
|
|
139
|
-
{
|
|
140
|
-
messageId: 'unsafeComponentBinding',
|
|
141
|
-
},
|
|
142
|
-
],
|
|
143
|
-
},
|
|
144
|
-
// data is in user input variables
|
|
145
|
-
{
|
|
146
|
-
code: '<div is={data}></div>',
|
|
147
|
-
errors: [
|
|
148
|
-
{
|
|
149
|
-
messageId: 'unsafeComponentBinding',
|
|
150
|
-
},
|
|
151
|
-
],
|
|
152
|
-
},
|
|
153
|
-
],
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
describe('Invalid Code - Template Compilation', () => {
|
|
158
|
-
ruleTester.run('invalid - unsafe template compilation', noDirectiveInjection, {
|
|
159
|
-
valid: [],
|
|
160
|
-
invalid: [
|
|
161
|
-
// Handlebars.compile with userInput variable
|
|
162
|
-
{
|
|
163
|
-
code: 'const compiled = Handlebars.compile(userInput);',
|
|
164
|
-
errors: [
|
|
165
|
-
{
|
|
166
|
-
messageId: 'userControlledTemplate',
|
|
167
|
-
},
|
|
168
|
-
],
|
|
169
|
-
},
|
|
170
|
-
// _.template with variable containing "input"
|
|
171
|
-
{
|
|
172
|
-
code: 'const template = _.template(userInput);',
|
|
173
|
-
errors: [
|
|
174
|
-
{
|
|
175
|
-
messageId: 'userControlledTemplate',
|
|
176
|
-
},
|
|
177
|
-
],
|
|
178
|
-
},
|
|
179
|
-
],
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
describe('Invalid Code - Dynamic Directive Creation', () => {
|
|
184
|
-
ruleTester.run('invalid - dynamic directive creation', noDirectiveInjection, {
|
|
185
|
-
valid: [],
|
|
186
|
-
invalid: [
|
|
187
|
-
// Vue.directive with userInput as directive name
|
|
188
|
-
{
|
|
189
|
-
code: 'Vue.directive(userInput, directiveDefinition);',
|
|
190
|
-
errors: [
|
|
191
|
-
{
|
|
192
|
-
messageId: 'unsafeDirectiveName',
|
|
193
|
-
},
|
|
194
|
-
],
|
|
195
|
-
},
|
|
196
|
-
// directive() with userInput as directive name
|
|
197
|
-
{
|
|
198
|
-
code: 'directive(userInput, function() { /* ... */ });',
|
|
199
|
-
errors: [
|
|
200
|
-
{
|
|
201
|
-
messageId: 'dynamicDirectiveCreation',
|
|
202
|
-
},
|
|
203
|
-
],
|
|
204
|
-
},
|
|
205
|
-
],
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
describe('Valid Code - False Positives Reduced', () => {
|
|
210
|
-
ruleTester.run('valid - false positives reduced', noDirectiveInjection, {
|
|
211
|
-
valid: [
|
|
212
|
-
// safeHtml is not a user input variable, so it's valid
|
|
213
|
-
{
|
|
214
|
-
code: '<div dangerouslySetInnerHTML={{ __html: safeHtml }} />',
|
|
215
|
-
},
|
|
216
|
-
// safeTemplate doesn't contain user input variable names
|
|
217
|
-
{
|
|
218
|
-
code: 'const compiled = Handlebars.compile(safeTemplate);',
|
|
219
|
-
},
|
|
220
|
-
// Trusted directive names (string literal)
|
|
221
|
-
{
|
|
222
|
-
code: 'Vue.directive("my-safe-directive", definition);',
|
|
223
|
-
},
|
|
224
|
-
// Static HTML string doesn't trigger
|
|
225
|
-
{
|
|
226
|
-
code: 'element.innerHTML = "<strong>Safe</strong>";',
|
|
227
|
-
},
|
|
228
|
-
],
|
|
229
|
-
invalid: [],
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
describe('Configuration Options', () => {
|
|
234
|
-
ruleTester.run('config - user input variables', noDirectiveInjection, {
|
|
235
|
-
valid: [
|
|
236
|
-
// customVar is not in default user input variables
|
|
237
|
-
{
|
|
238
|
-
code: '<div dangerouslySetInnerHTML={{ __html: customVar }} />',
|
|
239
|
-
},
|
|
240
|
-
],
|
|
241
|
-
invalid: [
|
|
242
|
-
// requestData contains 'request' which is in user input variables
|
|
243
|
-
{
|
|
244
|
-
code: '<div dangerouslySetInnerHTML={{ __html: requestData }} />',
|
|
245
|
-
errors: [
|
|
246
|
-
{
|
|
247
|
-
messageId: 'dangerousInnerHTML',
|
|
248
|
-
},
|
|
249
|
-
],
|
|
250
|
-
},
|
|
251
|
-
],
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
describe('Complex Directive Injection Scenarios', () => {
|
|
256
|
-
ruleTester.run('complex - real-world directive injection attacks', noDirectiveInjection, {
|
|
257
|
-
valid: [],
|
|
258
|
-
invalid: [
|
|
259
|
-
// innerHTML assignment with template literal containing user input
|
|
260
|
-
{
|
|
261
|
-
code: 'element.innerHTML = `<div>${userInput}</div>`;',
|
|
262
|
-
errors: [
|
|
263
|
-
{ messageId: 'dangerousInnerHTML' },
|
|
264
|
-
{ messageId: 'templateInjection' },
|
|
265
|
-
],
|
|
266
|
-
},
|
|
267
|
-
// Dangerous template literal inside dangerouslySetInnerHTML (Now properly detected by fix)
|
|
268
|
-
{
|
|
269
|
-
code: '<div dangerouslySetInnerHTML={{ __html: `Hello ${userInput}!` }} />',
|
|
270
|
-
errors: [
|
|
271
|
-
{ messageId: 'dangerousInnerHTML' },
|
|
272
|
-
{ messageId: 'templateInjection' },
|
|
273
|
-
],
|
|
274
|
-
},
|
|
275
|
-
// Multiple dangerous patterns
|
|
276
|
-
{
|
|
277
|
-
code: `
|
|
278
|
-
element.innerHTML = req.body.html;
|
|
279
|
-
const tpl = Handlebars.compile(userInput);
|
|
280
|
-
`,
|
|
281
|
-
errors: [
|
|
282
|
-
{ messageId: 'dangerousInnerHTML' },
|
|
283
|
-
{ messageId: 'userControlledTemplate' },
|
|
284
|
-
],
|
|
285
|
-
},
|
|
286
|
-
],
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
ruleTester.run('invalid - namespaced attributes', noDirectiveInjection, {
|
|
290
|
-
valid: [],
|
|
291
|
-
invalid: [
|
|
292
|
-
// v:bind with user input
|
|
293
|
-
{
|
|
294
|
-
code: '<div v:bind={userInput}></div>',
|
|
295
|
-
errors: [{ messageId: 'directiveInjection' }],
|
|
296
|
-
},
|
|
297
|
-
// ng:model with user input
|
|
298
|
-
{
|
|
299
|
-
code: '<input ng:model={userInput} />',
|
|
300
|
-
errors: [{ messageId: 'directiveInjection' }],
|
|
301
|
-
},
|
|
302
|
-
],
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
});
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Prevent disabled SSL/TLS certificate validation
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { createRule, formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
|
|
6
|
-
import type { TSESTree } from '@interlace/eslint-devkit';
|
|
7
|
-
|
|
8
|
-
type MessageIds = 'violationDetected';
|
|
9
|
-
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -- Rule has no configurable options
|
|
11
|
-
export interface Options {}
|
|
12
|
-
|
|
13
|
-
type RuleOptions = [Options?];
|
|
14
|
-
|
|
15
|
-
export const noDisabledCertificateValidation = createRule<RuleOptions, MessageIds>({
|
|
16
|
-
name: 'no-disabled-certificate-validation',
|
|
17
|
-
meta: {
|
|
18
|
-
type: 'problem',
|
|
19
|
-
docs: {
|
|
20
|
-
description: 'Prevent disabled SSL/TLS certificate validation',
|
|
21
|
-
},
|
|
22
|
-
messages: {
|
|
23
|
-
violationDetected: formatLLMMessage({
|
|
24
|
-
icon: MessageIcons.SECURITY,
|
|
25
|
-
issueName: 'Disabled Certificate Validation',
|
|
26
|
-
cwe: 'CWE-295',
|
|
27
|
-
description: 'SSL/TLS certificate validation is disabled - man-in-the-middle attack possible',
|
|
28
|
-
severity: 'CRITICAL',
|
|
29
|
-
fix: 'Remove rejectUnauthorized: false or verify: false, fix certificate issues properly',
|
|
30
|
-
documentationLink: 'https://cwe.mitre.org/data/definitions/295.html',
|
|
31
|
-
})
|
|
32
|
-
},
|
|
33
|
-
schema: [],
|
|
34
|
-
},
|
|
35
|
-
defaultOptions: [],
|
|
36
|
-
create(context) {
|
|
37
|
-
function report(node: TSESTree.Node) {
|
|
38
|
-
context.report({ node, messageId: 'violationDetected' });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const dangerousProperties = ['rejectUnauthorized', 'strictSSL', 'verify'];
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
Property(node: TSESTree.Property) {
|
|
45
|
-
// Check for dangerous SSL options set to false
|
|
46
|
-
if (node.key.type === 'Identifier' &&
|
|
47
|
-
dangerousProperties.includes(node.key.name) &&
|
|
48
|
-
node.value.type === 'Literal' &&
|
|
49
|
-
node.value.value === false) {
|
|
50
|
-
report(node);
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
AssignmentExpression(node: TSESTree.AssignmentExpression) {
|
|
55
|
-
// Check for NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
|
56
|
-
if (node.left.type === 'MemberExpression' &&
|
|
57
|
-
node.left.object.type === 'MemberExpression' &&
|
|
58
|
-
node.left.object.object.type === 'Identifier' &&
|
|
59
|
-
node.left.object.object.name === 'process' &&
|
|
60
|
-
node.left.object.property.type === 'Identifier' &&
|
|
61
|
-
node.left.object.property.name === 'env' &&
|
|
62
|
-
node.left.property.type === 'Identifier' &&
|
|
63
|
-
node.left.property.name === 'NODE_TLS_REJECT_UNAUTHORIZED') {
|
|
64
|
-
|
|
65
|
-
if (node.right.type === 'Literal' && node.right.value === '0') {
|
|
66
|
-
report(node);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
},
|
|
72
|
-
});
|
package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Tests for no-disabled-certificate-validation
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { RuleTester } from '@typescript-eslint/rule-tester';
|
|
6
|
-
import { noDisabledCertificateValidation } from './index';
|
|
7
|
-
|
|
8
|
-
const ruleTester = new RuleTester({
|
|
9
|
-
languageOptions: {
|
|
10
|
-
ecmaVersion: 2022,
|
|
11
|
-
sourceType: 'module',
|
|
12
|
-
},
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
ruleTester.run('no-disabled-certificate-validation', noDisabledCertificateValidation, {
|
|
16
|
-
valid: [
|
|
17
|
-
// Proper SSL configuration
|
|
18
|
-
{ code: "const options = { rejectUnauthorized: true }" },
|
|
19
|
-
{ code: "const config = { strictSSL: true }" },
|
|
20
|
-
{ code: "const settings = { verify: true }" },
|
|
21
|
-
// Non-SSL code
|
|
22
|
-
{ code: "const x = 1" },
|
|
23
|
-
],
|
|
24
|
-
|
|
25
|
-
invalid: [
|
|
26
|
-
// Disabled certificate validation
|
|
27
|
-
{ code: "const options = { rejectUnauthorized: false }", errors: [{ messageId: 'violationDetected' }] },
|
|
28
|
-
{ code: "https.request({ strictSSL: false })", errors: [{ messageId: 'violationDetected' }] },
|
|
29
|
-
{ code: "const config = { verify: false }", errors: [{ messageId: 'violationDetected' }] },
|
|
30
|
-
// Environment variable disable
|
|
31
|
-
{ code: "process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'", errors: [{ messageId: 'violationDetected' }] },
|
|
32
|
-
],
|
|
33
|
-
});
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ESLint Rule: no-document-cookie
|
|
3
|
-
* Prevent direct usage of document.cookie
|
|
4
|
-
*/
|
|
5
|
-
import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
|
|
6
|
-
import { createRule } from '@interlace/eslint-devkit';
|
|
7
|
-
import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
|
|
8
|
-
|
|
9
|
-
type MessageIds = 'noDocumentCookie';
|
|
10
|
-
|
|
11
|
-
export interface Options {
|
|
12
|
-
/** Allow reading document.cookie for parsing */
|
|
13
|
-
allowReading?: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
type RuleOptions = [Options?];
|
|
17
|
-
|
|
18
|
-
export const noDocumentCookie = createRule<RuleOptions, MessageIds>({
|
|
19
|
-
name: 'no-document-cookie',
|
|
20
|
-
meta: {
|
|
21
|
-
type: 'problem',
|
|
22
|
-
docs: {
|
|
23
|
-
description: 'Prevent direct usage of document.cookie - use Cookie Store API or cookie libraries instead',
|
|
24
|
-
},
|
|
25
|
-
hasSuggestions: false,
|
|
26
|
-
messages: {
|
|
27
|
-
noDocumentCookie: formatLLMMessage({
|
|
28
|
-
icon: MessageIcons.WARNING,
|
|
29
|
-
issueName: 'Document Cookie',
|
|
30
|
-
description: 'Avoid direct document.cookie usage',
|
|
31
|
-
severity: 'MEDIUM',
|
|
32
|
-
fix: 'Use Cookie Store API or cookie library instead',
|
|
33
|
-
documentationLink: 'https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-document-cookie.md',
|
|
34
|
-
}),
|
|
35
|
-
},
|
|
36
|
-
schema: [
|
|
37
|
-
{
|
|
38
|
-
type: 'object',
|
|
39
|
-
properties: {
|
|
40
|
-
allowReading: {
|
|
41
|
-
type: 'boolean',
|
|
42
|
-
default: true,
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
additionalProperties: false,
|
|
46
|
-
},
|
|
47
|
-
],
|
|
48
|
-
},
|
|
49
|
-
defaultOptions: [{ allowReading: true }],
|
|
50
|
-
|
|
51
|
-
create(context: TSESLint.RuleContext<MessageIds, RuleOptions>) {
|
|
52
|
-
const [options] = context.options;
|
|
53
|
-
const { allowReading = true } = options || {};
|
|
54
|
-
|
|
55
|
-
function isDocumentCookieAccess(node: TSESTree.MemberExpression): boolean {
|
|
56
|
-
// Check if this is accessing document.cookie
|
|
57
|
-
return (
|
|
58
|
-
node.object.type === 'Identifier' &&
|
|
59
|
-
node.object.name === 'document' &&
|
|
60
|
-
((node.property.type === 'Identifier' && node.property.name === 'cookie') ||
|
|
61
|
-
(node.computed && node.property.type === 'Literal' && node.property.value === 'cookie'))
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function isAssignmentToCookie(node: TSESTree.MemberExpression): boolean {
|
|
66
|
-
// Check if this is an assignment to document.cookie
|
|
67
|
-
const parent = node.parent;
|
|
68
|
-
|
|
69
|
-
// Check direct assignment
|
|
70
|
-
if (parent?.type === 'AssignmentExpression' && parent.left === node) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Check compound assignment (+=, -=, etc.)
|
|
75
|
-
if (parent?.type === 'AssignmentExpression' &&
|
|
76
|
-
parent.operator &&
|
|
77
|
-
parent.operator.includes('=') &&
|
|
78
|
-
parent.left === node) {
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Variable declarator (const/let/var x = document.cookie) - this is reading, not assigning
|
|
83
|
-
if (parent?.type === 'VariableDeclarator' && parent.init === node) {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
MemberExpression(node: TSESTree.MemberExpression) {
|
|
92
|
-
if (isDocumentCookieAccess(node)) {
|
|
93
|
-
const isAssigning = isAssignmentToCookie(node);
|
|
94
|
-
|
|
95
|
-
// If allowReading is true, only flag assignments
|
|
96
|
-
// If allowReading is false, flag everything
|
|
97
|
-
if (allowReading && !isAssigning) {
|
|
98
|
-
return; // Allow reading when option is enabled
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Flag document.cookie usage
|
|
102
|
-
context.report({
|
|
103
|
-
node,
|
|
104
|
-
messageId: 'noDocumentCookie',
|
|
105
|
-
data: {
|
|
106
|
-
operation: isAssigning ? 'assignment to' : 'reading from',
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
},
|
|
113
|
-
});
|