@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,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Avoid Eval Or Dynamic Code Execution
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: prevents Remote Code Execution (RCE) vulnerabilities
|
|
5
|
+
tags: eval, code-execution, rce, injection, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Avoid Eval Or Dynamic Code Execution
|
|
9
|
+
|
|
10
|
+
Executing code dynamically based on user input (e.g., using Script Engines or Reflection) is extremely dangerous. It allows attackers to execute arbitrary commands on the host system, leading to full server compromise.
|
|
11
|
+
|
|
12
|
+
**Incorrect (dynamic code execution):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Using JavaScript engine with user input
|
|
16
|
+
val engine = ScriptEngineManager().getEngineByName("javascript")
|
|
17
|
+
val userInput = request.getParameter("formula")
|
|
18
|
+
val result = engine.eval(userInput) // RCE vulnerability!
|
|
19
|
+
|
|
20
|
+
// Reflection with user-provided class names
|
|
21
|
+
val className = request.getParameter("type")
|
|
22
|
+
val instance = Class.forName(className).getDeclaredConstructor().newInstance()
|
|
23
|
+
// Attacker can pass "java.lang.ProcessBuilder"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Correct (safe alternatives):**
|
|
27
|
+
|
|
28
|
+
```kotlin
|
|
29
|
+
// Use a specialized safe expression parser (e.g., exp4j)
|
|
30
|
+
val expression = ExpressionBuilder(userInput)
|
|
31
|
+
.variables("x")
|
|
32
|
+
.build()
|
|
33
|
+
val result = expression.setVariable("x", 10.0).evaluate()
|
|
34
|
+
|
|
35
|
+
// Use a predefined map for dynamic behavior
|
|
36
|
+
val operations = mapOf<String, (Int, Int) -> Int>(
|
|
37
|
+
"add" to { a, b -> a + b },
|
|
38
|
+
"subtract" to { a, b -> a - b }
|
|
39
|
+
)
|
|
40
|
+
val operation = operations[userInput] ?: throw IllegalArgumentException("Invalid operation")
|
|
41
|
+
val result = operation(10, 5)
|
|
42
|
+
|
|
43
|
+
// For mapping types, use a factory with an allowlist
|
|
44
|
+
fun createService(type: String): Service = when(type) {
|
|
45
|
+
"email" -> EmailService()
|
|
46
|
+
"sms" -> SmsService()
|
|
47
|
+
else -> throw IllegalArgumentException("Unsupported type")
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Never use with user input:**
|
|
52
|
+
- `ScriptEngine.eval()`
|
|
53
|
+
- `Runtime.getRuntime().exec()` without extreme sanitization (prefer `ProcessBuilder`)
|
|
54
|
+
- `Class.forName(userInput)`
|
|
55
|
+
- SpEL (Spring Expression Language) with untrusted input
|
|
56
|
+
|
|
57
|
+
**Tools:** SonarQube (S1523), Semgrep, detekt, Manual Security Audit
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Escape Data By Output Context
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: ensures data is safely encoded for its specific target environment (HTML, JavaScript, URL, etc.)
|
|
5
|
+
tags: xss, escaping, context, encoding, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Escape Data By Output Context
|
|
9
|
+
|
|
10
|
+
Using the wrong escaping strategy is as dangerous as not escaping at all. For example, HTML entity encoding (like `<`) in a JavaScript string context will not prevent an attacker from breaking out of the string.
|
|
11
|
+
|
|
12
|
+
**Incorrect (wrong encoding for context):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// WRONG: Using HTML escaping for a JavaScript variable
|
|
16
|
+
val escaped = HtmlUtils.htmlEscape(userInput)
|
|
17
|
+
val responseHtml = "<script>var name = '$escaped';</script>"
|
|
18
|
+
// Still vulnerable to breaking out of the quote if userInput contains ' or \
|
|
19
|
+
|
|
20
|
+
// WRONG: No header sanitization
|
|
21
|
+
response.setHeader("X-User-Note", userInput)
|
|
22
|
+
// Potential HTTP Header Injection (CRLF injection)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (context-appropriate encoding):**
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
import org.owasp.encoder.Encode
|
|
29
|
+
import java.net.URLEncoder
|
|
30
|
+
|
|
31
|
+
// 1. HTML Content Context (Normal text inside tags)
|
|
32
|
+
val safeHtml = Encode.forHtml(userInput)
|
|
33
|
+
val pTag = "<p>$safeHtml</p>"
|
|
34
|
+
|
|
35
|
+
// 2. JavaScript Context (User data inside a script tag)
|
|
36
|
+
val safeJsValue = Encode.forJavaScript(userInput)
|
|
37
|
+
val script = "<script>var username = '$safeJsValue';</script>"
|
|
38
|
+
|
|
39
|
+
// 3. URL Parameter Context (Used in a query string)
|
|
40
|
+
val safeUrlParam = URLEncoder.encode(userInput, "UTF-8")
|
|
41
|
+
val redirectUrl = "/search?q=$safeUrlParam"
|
|
42
|
+
|
|
43
|
+
// 4. HTTP Header Context (Preventing CRLF injection)
|
|
44
|
+
val safeHeader = userInput.replace("[\r\n]".toRegex(), "")
|
|
45
|
+
response.setHeader("X-Custom-Data", safeHeader)
|
|
46
|
+
|
|
47
|
+
// 5. Email Header Context
|
|
48
|
+
val safeSubject = emailSubject.replace("[\r\n]".toRegex(), "")
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Context Rules:**
|
|
52
|
+
- **Inside HTML body:** Use HTML Entity encoding.
|
|
53
|
+
- **Inside HTML attribute:** Use HTML Attribute encoding.
|
|
54
|
+
- **Inside `<script>` tags:** Use JavaScript literal encoding or JSON stringification.
|
|
55
|
+
- **Inside CSS:** Use CSS hex escaping.
|
|
56
|
+
- **Inside URL:** Use URL encoding (percent-encoding).
|
|
57
|
+
|
|
58
|
+
**Tools:** OWASP Java Encoder (Recommended), Spring `HtmlUtils`, Ktor `encodeURLQueryComponent`, SonarQube (S2245)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Output Encoding For Dynamic JS/JSON
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents code injection when transferring data from backend to frontend scripts
|
|
5
|
+
tags: xss, javascript, json, encoding, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Output Encoding For Dynamic JS/JSON
|
|
9
|
+
|
|
10
|
+
When Kotlin backends generate HTML that includes inline JavaScript or JSON data blocks, user-controlled data must be properly encoded to prevent attackers from injecting malicious scripts.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unescaped data in inline JS):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// VULNERABLE: Direct string interpolation in JS
|
|
16
|
+
val username = request.getParameter("name") // Input: admin"; alert('xss'); "
|
|
17
|
+
val html = """
|
|
18
|
+
<script>
|
|
19
|
+
var currentUser = "$username";
|
|
20
|
+
</script>
|
|
21
|
+
"""
|
|
22
|
+
call.respondText(html, ContentType.Text.Html)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (proper JSON or JS encoding):**
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
import com.fasterxml.jackson.databind.ObjectMapper
|
|
29
|
+
import org.owasp.encoder.Encode
|
|
30
|
+
|
|
31
|
+
// 1. Using Jackson for safe JSON serialization (Best for objects)
|
|
32
|
+
val mapper = ObjectMapper()
|
|
33
|
+
val userData = mapOf("name" to username, "id" to userId)
|
|
34
|
+
val safeJson = mapper.writeValueAsString(userData)
|
|
35
|
+
|
|
36
|
+
val html = """
|
|
37
|
+
<script>
|
|
38
|
+
var userData = $safeJson; // safeJson is wrapped in quotes if it's a string, or is an object
|
|
39
|
+
</script>
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
// 2. Using OWASP Encoder for specific JS literal strings
|
|
43
|
+
val safeJsString = Encode.forJavaScript(username)
|
|
44
|
+
val htmlLiteral = "<script>var name = '$safeJsString';</script>"
|
|
45
|
+
|
|
46
|
+
// 3. Recommended: Use HTML Data Attributes instead of inline JS
|
|
47
|
+
val htmlDataAttr = """
|
|
48
|
+
<div id="user-context" data-user-info='${Encode.forHtmlAttribute(safeJson)}'></div>
|
|
49
|
+
"""
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Key Strategies:**
|
|
53
|
+
- **Prefer Data Attributes:** Instead of inline `<script>`, put your data in `data-*` attributes of HTML elements and read them from your external JS file.
|
|
54
|
+
- **Use JSON Parsers:** Use `Jackson` or `Kotlinx.Serialization` to convert objects to JSON. They handle most escaping issues, but you still need to be careful about the `</script>` tag inside strings.
|
|
55
|
+
- **Escape `</script>`:** Even inside a quoted JS string, the browser might interpret `</script>` as the end of the script block. Secure encoders will escape the `/` or use unicode sequences.
|
|
56
|
+
|
|
57
|
+
**Tools:** Jackson, Kotlinx.Serialization, OWASP Java Encoder, Manual Review
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Always Validate Client Data Server-side
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: ensures input validation cannot be bypassed by attackers
|
|
5
|
+
tags: validation, server-side, input, sanitization, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Always Validate Client Data Server-side
|
|
9
|
+
|
|
10
|
+
Client-side validation (browser or mobile apps) is for User Experience (UX) only. It can be easily bypassed using tools like Proxy, cURL, or Postman. All data entering the server must be strictly validated server-side.
|
|
11
|
+
|
|
12
|
+
**Incorrect (trusting client validation):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// No server validation - trusting the mobile app
|
|
16
|
+
@PostMapping("/api/transfer")
|
|
17
|
+
fun transfer(@RequestBody data: TransferRequest): ResponseEntity<Any> {
|
|
18
|
+
// amount could be negative or extremely large!
|
|
19
|
+
transferService.execute(data.fromAccount, data.toAccount, data.amount)
|
|
20
|
+
return ResponseEntity.ok(SuccessResponse())
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Correct (comprehensive server validation):**
|
|
25
|
+
|
|
26
|
+
```kotlin
|
|
27
|
+
import jakarta.validation.constraints.*
|
|
28
|
+
|
|
29
|
+
data class TransferRequest(
|
|
30
|
+
@get:NotBlank val toAccount: String,
|
|
31
|
+
@get:Positive @get:Max(1000000) val amount: Double
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
@PostMapping("/api/transfer")
|
|
35
|
+
fun transfer(@Valid @RequestBody data: TransferRequest): ResponseEntity<Any> {
|
|
36
|
+
// 1. Data Format/Constraint validation (handled by @Valid)
|
|
37
|
+
|
|
38
|
+
// 2. Business logic validation
|
|
39
|
+
if (!accountService.exists(data.toAccount)) {
|
|
40
|
+
throw AccountNotFoundException(data.toAccount)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 3. Authorization validation
|
|
44
|
+
if (!authService.canTransferFrom(currentUserId, data.fromAccount)) {
|
|
45
|
+
throw AccessDeniedException("Unauthorized account access")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
transferService.execute(data.fromAccount, data.toAccount, data.amount)
|
|
49
|
+
return ResponseEntity.ok(SuccessResponse())
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Validation Strategies:**
|
|
54
|
+
- **JSR-303 / Bean Validation:** Use annotations like `@NotNull`, `@Size`, `@Pattern`, `@Min`, `@Max`.
|
|
55
|
+
- **Schema Validation:** Use libraries like `Konform` or `Kvalidation` if not using Spring.
|
|
56
|
+
- **Fail Fast:** Reject invalid data as early as possible in the request lifecycle.
|
|
57
|
+
- **Sanitization:** Strip dangerous characters (e.g., HTML tags if not expected) to prevent XSS.
|
|
58
|
+
|
|
59
|
+
**Tools:** Hibernate Validator, Konform (for Kotlin focus), SonarQube, Manual Security Audit
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: TLS Encryption For All Connections
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: protects data in transit from interception and tampering
|
|
5
|
+
tags: tls, encryption, https, transport, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## TLS Encryption For All Connections
|
|
9
|
+
|
|
10
|
+
All network communications, whether between the client and server or between internal services, must be encrypted using TLS. Unencrypted connections (HTTP, raw JDBC) allow attackers to perform Man-in-the-Middle (MitM) attacks to steal sensitive data.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unencrypted connections):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// VULNERABLE: Using HTTP instead of HTTPS
|
|
16
|
+
val client = HttpClient(CIO)
|
|
17
|
+
client.get("http://api.production.sun-asterisk.vn/data")
|
|
18
|
+
|
|
19
|
+
// VULNERABLE: Unencrypted database connection
|
|
20
|
+
val url = "jdbc:postgresql://db.sun-asterisk.vn:5432/mydb"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (TLS everywhere):**
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// 1. HTTPS for all external API calls
|
|
27
|
+
client.get("https://api.production.sun-asterisk.vn/data")
|
|
28
|
+
|
|
29
|
+
// 2. TLS for Database connections
|
|
30
|
+
val url = "jdbc:postgresql://db.sun-asterisk.vn:5432/mydb?ssl=true"
|
|
31
|
+
|
|
32
|
+
// 3. Enabling HSTS to force browsers to use HTTPS
|
|
33
|
+
// In Ktor:
|
|
34
|
+
install(HSTS) {
|
|
35
|
+
maxAgeInSeconds = 31536000 // 1 year
|
|
36
|
+
includeSubDomains = true
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// 4. Redirecting HTTP to HTTPS
|
|
40
|
+
// In Spring Security:
|
|
41
|
+
// http.requiresChannel().anyRequest().requiresSecure()
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Requirements:**
|
|
45
|
+
- All endpoints must strictly use HTTPS.
|
|
46
|
+
- Plain HTTP requests must be redirected to HTTPS.
|
|
47
|
+
- Use HSTS (`Strict-Transport-Security`) headers to prevent protocol downgrade attacks.
|
|
48
|
+
- Ensure internal service-to-service communication is also encrypted (e.g., using a Service Mesh or internal CAs).
|
|
49
|
+
|
|
50
|
+
**Tools:** OWASP ZAP, SSLyze, Qualys SSL Labs, Manual Review
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Validate mTLS Certificates Before Auth
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: ensures mutual authentication between services, preventing unauthorized service impersonation
|
|
5
|
+
tags: mtls, certificates, authentication, service-mesh, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Validate mTLS Certificates Before Auth
|
|
9
|
+
|
|
10
|
+
In a microservices architecture, Mutual TLS (mTLS) ensures that both the client and the server verify each other's certificates. This prevents unauthorized services from connecting to internal APIs even if they are within the same network.
|
|
11
|
+
|
|
12
|
+
**Incorrect (not enforcing client certificates):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Server accepts any connection without requiring a valid client certificate
|
|
16
|
+
// or doesn't validate the client's identity.
|
|
17
|
+
val server = Netty.createServer(8443) {
|
|
18
|
+
ssl {
|
|
19
|
+
// Only server-side SSL configured
|
|
20
|
+
keyStore = myKeyStore
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (proper mTLS configuration and validation):**
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
// 1. Ktor/Netty configuration for mTLS
|
|
29
|
+
install(HttpsRedirect)
|
|
30
|
+
val server = embeddedServer(Netty, port = 8443) {
|
|
31
|
+
install(Authentication) {
|
|
32
|
+
// Some frameworks support X509 authentication directly
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 2. Manual certificate validation in an Interceptor/Filter
|
|
37
|
+
fun validateClientCert(request: HttpServletRequest) {
|
|
38
|
+
val certs = request.getAttribute("javax.servlet.request.X509Certificate") as? Array<X509Certificate>
|
|
39
|
+
|
|
40
|
+
if (certs == null || certs.isEmpty()) {
|
|
41
|
+
throw BadCredentialsException("Client certificate required")
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
val clientCert = certs[0]
|
|
45
|
+
val subjectDN = clientCert.subjectX500Principal.name
|
|
46
|
+
|
|
47
|
+
// Validate the Subject Common Name (CN) against an authorized list
|
|
48
|
+
val authorizedServices = listOf("CN=payment-service", "CN=order-service")
|
|
49
|
+
if (!authorizedServices.any { subjectDN.contains(it) }) {
|
|
50
|
+
throw AccessDeniedException("Service $subjectDN is not authorized")
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Implementation Steps:**
|
|
56
|
+
- **Trust Store:** Configure your server with a trust store containing the CA certificates that are allowed to sign client certificates.
|
|
57
|
+
- **Client Auth Mode:** Set SSL engine to `REQUIRE` client authentication (not just `WANT`).
|
|
58
|
+
- **Authorization:** Certificate validation (the "m" in mTLS) only handles *authentication*. You still need to *authorize* based on the certificate's subject (e.g., matching the CN to a known service name).
|
|
59
|
+
|
|
60
|
+
**Tools:** Istio/Linkerd (Service Mesh), OpenSSL, Spring Security X.509, Cloudflare mTLS
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Limit Upload File Size And Count
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents Denial of Service (DoS) attacks via disk or memory exhaustion
|
|
5
|
+
tags: upload, file-size, dos, limits, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Limit Upload File Size And Count
|
|
9
|
+
|
|
10
|
+
Allowing unlimited file uploads can quickly lead to server instability or crashes by exhausting disk space, memory, or CPU (during processing). All file upload endpoints must have strict limits on file size, number of files, and file types.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no limits):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Ktor: No multi-part configuration
|
|
16
|
+
@PostMapping("/upload")
|
|
17
|
+
fun upload(@RequestParam("file") file: MultipartFile) {
|
|
18
|
+
// No check on file.size or file.contentType
|
|
19
|
+
save(file)
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (explicit limits):**
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// Ktor Configuration
|
|
27
|
+
install(ContentNegotiation) {
|
|
28
|
+
// Limits can be enforced at the server level
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Spring Boot application.properties
|
|
32
|
+
// spring.servlet.multipart.max-file-size=5MB
|
|
33
|
+
// spring.servlet.multipart.max-request-size=10MB
|
|
34
|
+
|
|
35
|
+
// Manual validation in Controller
|
|
36
|
+
@PostMapping("/upload")
|
|
37
|
+
fun handleUpload(@RequestParam("files") files: Array<MultipartFile>): ResponseEntity<Any> {
|
|
38
|
+
// 1. Limit File Count
|
|
39
|
+
if (files.size > 5) {
|
|
40
|
+
return ResponseEntity.badRequest().body("Max 5 files allowed")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
files.forEach { file ->
|
|
44
|
+
// 2. Limit File Size
|
|
45
|
+
if (file.size > 5 * 1024 * 1024) { // 5MB
|
|
46
|
+
return ResponseEntity.status(413).body("File ${file.originalFilename} is too large")
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 3. Limit Content Type
|
|
50
|
+
val allowedTypes = listOf("image/jpeg", "image/png", "application/pdf")
|
|
51
|
+
if (!allowedTypes.contains(file.contentType)) {
|
|
52
|
+
return ResponseEntity.badRequest().body("Unsupported file type: ${file.contentType}")
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Process files...
|
|
57
|
+
return ResponseEntity.ok("Success")
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Attack Vectors Prevented:**
|
|
62
|
+
- **Disk Exhaustion:** Filling up server storage with massive files.
|
|
63
|
+
- **Memory Exhaustion:** Trying to buffer large files in RAM.
|
|
64
|
+
- **Zip Bomb:** Uploading small compressed files that expand to petabytes (if unzipping on server).
|
|
65
|
+
- **Remote Code Execution:** Restricted via file-type whitelisting (preventing `.php`, `.jsp`, `.sh` uploads).
|
|
66
|
+
|
|
67
|
+
**Tools:** Spring Multipart Config, Ktor MultiPartData, NGINX `client_max_body_size`, Manual Audit
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Apply CSRF Protection
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents Cross-Site Request Forgery (CSRF) attacks by ensuring requests originate from the intended application
|
|
5
|
+
tags: csrf, tokens, forms, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Apply CSRF Protection
|
|
9
|
+
|
|
10
|
+
CSRF attacks force an authenticated user to execute unwanted actions on a web application in which they're currently authenticated (like changing passwords or transferring funds). Modern web frameworks provide built-in protection that must be enabled and properly configured.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no CSRF protection):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Spring Security - disabling CSRF without a valid reason
|
|
16
|
+
override fun configure(http: HttpSecurity) {
|
|
17
|
+
http.csrf().disable() // VULNERABLE if using Cookie-based auth
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Raw HTML form without token
|
|
21
|
+
// <form action="/api/transfer" method="POST"> ... </form>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Correct (CSRF protection enabled):**
|
|
25
|
+
|
|
26
|
+
```kotlin
|
|
27
|
+
// Spring Security (enabled by default)
|
|
28
|
+
@Configuration
|
|
29
|
+
@EnableWebSecurity
|
|
30
|
+
class SecurityConfig : WebSecurityConfigurerAdapter() {
|
|
31
|
+
override fun configure(http: HttpSecurity) {
|
|
32
|
+
http
|
|
33
|
+
.csrf()
|
|
34
|
+
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// In Template (Thymeleaf example)
|
|
39
|
+
// <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
|
|
40
|
+
|
|
41
|
+
// Ktor CSRF Protection
|
|
42
|
+
install(Sessions) {
|
|
43
|
+
cookie<UserSession>("user_session")
|
|
44
|
+
}
|
|
45
|
+
install(CSRF) {
|
|
46
|
+
// Validate that a specific header is present
|
|
47
|
+
checkHeader("X-CSRF-TOKEN")
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**CSRF Defense Strategies:**
|
|
52
|
+
1. **Anti-CSRF Tokens:** Include a unique, secret, and unpredictable token in all state-changing requests (POST, PUT, DELETE).
|
|
53
|
+
2. **SameSite Cookies:** Set `SameSite=Strict` or `Lax` on all session cookies.
|
|
54
|
+
3. **Custom Request Headers:** For APIs, requiring a custom header (like `X-Requested-With`) can block requests from standard `<form>` submissions.
|
|
55
|
+
4. **Verification of Origin:** Validate `Origin` and `Referer` headers on the server.
|
|
56
|
+
|
|
57
|
+
**Tools:** Spring Security CSRF, OWASP ZAP, Burp Suite, Browser DevTools
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Disable Directory Browsing
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents unauthorized file enumeration and system reconnaissance
|
|
5
|
+
tags: directory, listing, file-exposure, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Disable Directory Browsing
|
|
9
|
+
|
|
10
|
+
Directory listing (auto-indexing) allows users to see all files in a directory if an index file is missing. This can expose sensitive configuration files, source code backups, or private user data.
|
|
11
|
+
|
|
12
|
+
**Incorrect (directory listing enabled):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Ktor: Configuring static files without disabling auto-index (if plugin allows it)
|
|
16
|
+
|
|
17
|
+
// NGINX configuration (if serving static files for your app)
|
|
18
|
+
location /static/ {
|
|
19
|
+
autoindex on; // INSECURE: Shows list of files
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (directory listing disabled):**
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// Ktor: Static content doesn't list directories by default
|
|
27
|
+
routing {
|
|
28
|
+
static("/static") {
|
|
29
|
+
resources("static")
|
|
30
|
+
// No auto-indexing here
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Spring Boot (Disabled by default in embedded Tomcat)
|
|
35
|
+
// Ensure no custom configuration enables directory listing.
|
|
36
|
+
|
|
37
|
+
// NGINX (Secure configuration)
|
|
38
|
+
location /static/ {
|
|
39
|
+
autoindex off;
|
|
40
|
+
try_files $uri $uri/ =404;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Use an index file to prevent listing
|
|
44
|
+
// Create an empty index.html in every static directory.
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Why it matters:**
|
|
48
|
+
Exposing a directory structure tells an attacker which files exist, which libraries you use (if `node_modules` or `jar` files are visible), and might reveal "hidden" files like `.env.bak` or `.git/`.
|
|
49
|
+
|
|
50
|
+
**Tools:** Web server configuration (NGINX/Apache), OWASP ZAP, Nikto, Manual Review
|
|
@@ -0,0 +1,51 @@
|
|
|
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, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Set Secure Flag On Session Cookies
|
|
9
|
+
|
|
10
|
+
Without the `Secure` flag, browser cookies can be transmitted over unencrypted HTTP connections, where they can be easily intercepted by attackers (Man-in-the-Middle).
|
|
11
|
+
|
|
12
|
+
**Incorrect (no Secure flag):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Raw Ktor response
|
|
16
|
+
call.response.cookies.append("session", token) // No flags set!
|
|
17
|
+
|
|
18
|
+
// Spring Boot / Servlet
|
|
19
|
+
val cookie = Cookie("session", token)
|
|
20
|
+
response.addCookie(cookie) // Secure flag defaults to false
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (Secure flag set):**
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// Ktor
|
|
27
|
+
call.response.cookies.append(
|
|
28
|
+
name = "session",
|
|
29
|
+
value = token,
|
|
30
|
+
secure = true, // HTTPS only
|
|
31
|
+
httpOnly = true,
|
|
32
|
+
extensions = mapOf("SameSite" to "Strict")
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
// Spring Boot / Servlet
|
|
36
|
+
val cookie = Cookie("session", token).apply {
|
|
37
|
+
isSecure = true // HTTPS only
|
|
38
|
+
isHttpOnly = true
|
|
39
|
+
path = "/"
|
|
40
|
+
}
|
|
41
|
+
response.addCookie(cookie)
|
|
42
|
+
|
|
43
|
+
// Spring Boot Application Configuration (application.properties)
|
|
44
|
+
// server.servlet.session.cookie.secure=true
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Validation:**
|
|
48
|
+
- In production, always ensure `secure = true`.
|
|
49
|
+
- For local development without HTTPS, this may need to be configurable but must be enabled by default for all deployed environments.
|
|
50
|
+
|
|
51
|
+
**Tools:** OWASP ZAP, SonarQube, Manual Security Audit, Browser DevTools
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Set HttpOnly On Session Cookies
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents session cookie theft via Cross-Site Scripting (XSS)
|
|
5
|
+
tags: cookies, httponly, xss, session, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Set HttpOnly On Session Cookies
|
|
9
|
+
|
|
10
|
+
Without the `HttpOnly` flag, the `document.cookie` API can be used to access sensitive session cookies from JavaScript. This allows an attacker to steal active sessions using a Cross-Site Scripting (XSS) vulnerability.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no HttpOnly flag):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Ktor
|
|
16
|
+
call.response.cookies.append("session", token) // No HttpOnly!
|
|
17
|
+
|
|
18
|
+
// Spring Boot / Servlet
|
|
19
|
+
val cookie = Cookie("session", token)
|
|
20
|
+
response.addCookie(cookie) // HttpOnly defaults to false
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (HttpOnly set):**
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// Ktor
|
|
27
|
+
call.response.cookies.append(
|
|
28
|
+
name = "session",
|
|
29
|
+
value = token,
|
|
30
|
+
httpOnly = true, // Prevents JS access
|
|
31
|
+
secure = true,
|
|
32
|
+
extensions = mapOf("SameSite" to "Strict")
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
// Spring Boot / Servlet
|
|
36
|
+
val cookie = Cookie("session", token).apply {
|
|
37
|
+
isHttpOnly = true // Prevents JS access
|
|
38
|
+
isSecure = true
|
|
39
|
+
}
|
|
40
|
+
response.addCookie(cookie)
|
|
41
|
+
|
|
42
|
+
// Spring Boot Application Configuration (application.properties)
|
|
43
|
+
// server.servlet.session.cookie.http-only=true
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Security Impact:**
|
|
47
|
+
Even if your application has an XSS vulnerability, the `HttpOnly` flag prevents the attacker from immediately stealing the session identifier, buying time for detection and defense.
|
|
48
|
+
|
|
49
|
+
**Tools:** OWASP ZAP, Burp Suite, Browser DevTools (Verify "HttpOnly" column checked)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Set SameSite On Session Cookies
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: provides fundamental Cross-Site Request Forgery (CSRF) protection
|
|
5
|
+
tags: cookies, samesite, csrf, session, security, kotlin
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Set SameSite On Session Cookies
|
|
9
|
+
|
|
10
|
+
The `SameSite` attribute tells the browser whether to send cookies in cross-site requests. Setting this to `Strict` or `Lax` provides a strong baseline defense against CSRF attacks.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no SameSite attribute):**
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Ktor
|
|
16
|
+
call.response.cookies.append("session", token) // SameSite not specified
|
|
17
|
+
|
|
18
|
+
// Servlet / Spring Boot (Old versions or manual Cookie setting)
|
|
19
|
+
val cookie = Cookie("session", token)
|
|
20
|
+
response.addCookie(cookie) // No native SameSite setter in standard Servlet API < 6.0
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (SameSite set):**
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// Ktor
|
|
27
|
+
import io.ktor.http.*
|
|
28
|
+
call.response.cookies.append(
|
|
29
|
+
name = "session",
|
|
30
|
+
value = token,
|
|
31
|
+
httpOnly = true,
|
|
32
|
+
secure = true,
|
|
33
|
+
extensions = mapOf("SameSite" to "Strict") // or "Lax"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
// Spring Boot / Spring Security (Recommended approach)
|
|
37
|
+
// Configure in application.properties/yml
|
|
38
|
+
// server.servlet.session.cookie.same-site=strict
|
|
39
|
+
|
|
40
|
+
// Manual Header (if using raw Response and older Servlet API)
|
|
41
|
+
response.setHeader("Set-Cookie", "session=$token; Path=/; HttpOnly; Secure; SameSite=Strict")
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**SameSite Options:**
|
|
45
|
+
|
|
46
|
+
| Value | Behavior |
|
|
47
|
+
|-------|----------|
|
|
48
|
+
| `Strict` | Cookie is only sent if the request originates from the same site. Most secure. |
|
|
49
|
+
| `Lax` | Sent on same-site requests and top-level GET navigations (clicking links). |
|
|
50
|
+
| `None` | Always sent. Requires the `Secure` flag to be set. Use with caution. |
|
|
51
|
+
|
|
52
|
+
**Recommended:** Use `Strict` for all authentication and session handling cookies. Use `Lax` for user-experience-related cookies where cross-site links might need to maintain state.
|
|
53
|
+
|
|
54
|
+
**Tools:** Browser DevTools (Application tab -> Cookies), OWASP ZAP, Manual review
|