@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,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Separate Processing And Data Access
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: enables testable business logic and cleaner architecture
|
|
5
|
+
tags: separation, repository, service, architecture, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Separate Processing And Data Access
|
|
9
|
+
|
|
10
|
+
Mixing business logic with database queries (SQL or ORM calls) creates tight coupling. This makes unit testing difficult because it forces a dependency on a real database and violates the Single Responsibility Principle.
|
|
11
|
+
|
|
12
|
+
**Incorrect (mixed concerns in Service):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
class OrderService {
|
|
16
|
+
public function calculateDiscount($userId) {
|
|
17
|
+
// Business logic mixed with database queries
|
|
18
|
+
$user = DB::table('users')->where('id', $userId)->first();
|
|
19
|
+
$orderCount = DB::table('orders')->where('user_id', $userId)->count();
|
|
20
|
+
|
|
21
|
+
$discount = 0;
|
|
22
|
+
if ($orderCount > 10) $discount += 5;
|
|
23
|
+
if ($user->is_premium) $discount += 10;
|
|
24
|
+
|
|
25
|
+
return $discount;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Correct (separated Service and Repository layers):**
|
|
31
|
+
|
|
32
|
+
```php
|
|
33
|
+
/**
|
|
34
|
+
* Repository - Handles Data Access only
|
|
35
|
+
*/
|
|
36
|
+
class UserRepository {
|
|
37
|
+
public function findById($id): ?User {
|
|
38
|
+
return User::find($id);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class OrderRepository {
|
|
43
|
+
public function getCountByUserId($userId): int {
|
|
44
|
+
return Order::where('user_id', $userId)->count();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Service - Handles Business Logic only
|
|
50
|
+
*/
|
|
51
|
+
class DiscountService {
|
|
52
|
+
public function __construct(
|
|
53
|
+
private UserRepository $userRepo,
|
|
54
|
+
private OrderRepository $orderRepo
|
|
55
|
+
) {}
|
|
56
|
+
|
|
57
|
+
public function calculateDiscount(int $userId): int {
|
|
58
|
+
$user = $this->userRepo->findById($userId);
|
|
59
|
+
$orderCount = $this->orderRepo->getCountByUserId($userId);
|
|
60
|
+
|
|
61
|
+
return $this->compute(user, $orderCount);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private function compute(?User $user, int $count): int {
|
|
65
|
+
$discount = 0;
|
|
66
|
+
if ($count > 10) $discount += 5;
|
|
67
|
+
if ($user?->is_premium) $discount += 10;
|
|
68
|
+
return $discount;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Why separate them?**
|
|
74
|
+
- **Mockability**: You can test the `DiscountService` by mocking the repositories without touching a real database.
|
|
75
|
+
- **Maintainability**: If the database schema changes, you only update the Repository, not the business logic.
|
|
76
|
+
- **Reusability**: Different services can use the same repository methods.
|
|
77
|
+
- **Clarity**: High-level business rules are not obscured by low-level data access details.
|
|
78
|
+
|
|
79
|
+
**Tools:** Architectural review, PHPUnit (Mocking), Laravel Repository Pattern
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Log All Relevant Context On Errors
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: enables rapid debugging and incident resolution
|
|
5
|
+
tags: error-handling, logging, context, debugging, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Log All Relevant Context On Errors
|
|
9
|
+
|
|
10
|
+
When an error occurs, simply logging the message "An error occurred" is insufficient. Effective debugging requires structured logs that include the error cause and the state of the application at that moment.
|
|
11
|
+
|
|
12
|
+
**Incorrect (minimal context):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
Log::error('Error occurred');
|
|
16
|
+
Log::error($e->getMessage()); // Missing stack trace and context
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Correct (structured logging with Monolog/Laravel Context):**
|
|
20
|
+
|
|
21
|
+
```php
|
|
22
|
+
try {
|
|
23
|
+
$this->paymentService->process($order);
|
|
24
|
+
} catch (\Throwable $e) {
|
|
25
|
+
Log::error('Order processing failed', [
|
|
26
|
+
// The Exception itself (Monolog handles the stack trace)
|
|
27
|
+
'exception' => $e,
|
|
28
|
+
|
|
29
|
+
// Business Context
|
|
30
|
+
'order_id' => $order->id,
|
|
31
|
+
'user_id' => auth()->id(),
|
|
32
|
+
'amount' => $order->amount,
|
|
33
|
+
|
|
34
|
+
// Request Metadata
|
|
35
|
+
'url' => request()->fullUrl(),
|
|
36
|
+
'method' => request()->method(),
|
|
37
|
+
'ip' => request()->ip(),
|
|
38
|
+
|
|
39
|
+
// Performance/Timing
|
|
40
|
+
'duration_ms' => round((microtime(true) - $startTime) * 1000, 2),
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
throw $e; // Re-throw if necessary
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Essential Context to Include:**
|
|
48
|
+
1. **The Exception**: Pass the entire exception object to the logger so it can extract the message, file, line, and full stack trace.
|
|
49
|
+
2. **Entity Identifiers**: IDs of the users, orders, or products involved.
|
|
50
|
+
3. **Correlation IDs**: Use unique request IDs (e.g., from `X-Request-ID` header) to trace a single request across multiple logs.
|
|
51
|
+
4. **Input State**: A summary of the input that lead to the error (excluding sensitive data like passwords).
|
|
52
|
+
5. **Environment**: App environment (`production`, `staging`) and server name.
|
|
53
|
+
|
|
54
|
+
**Tools:** Monolog, Sentry, Laravel Logging, New Relic, ELK Stack
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: No Hardcoded Secrets In Repo
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents credential exposure and security breaches
|
|
5
|
+
tags: secrets, credentials, security, git, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## No Hardcoded Secrets In Repo
|
|
9
|
+
|
|
10
|
+
Hardcoding secrets (API keys, database passwords, private tokens) directly in the source code exposes them to anyone with repository access. Once committed, these secrets remain in the Git history even if deleted later.
|
|
11
|
+
|
|
12
|
+
**Incorrect (secrets in code):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Hardcoded API key
|
|
16
|
+
$stripeSecret = 'sk_live_51P...';
|
|
17
|
+
|
|
18
|
+
// Hardcoded database credentials
|
|
19
|
+
$conn = mysqli_connect("localhost", "root", "password123", "my_db");
|
|
20
|
+
|
|
21
|
+
// Using plain text secrets in config files committed to VCS
|
|
22
|
+
return [
|
|
23
|
+
'aws_key' => 'AKIA...',
|
|
24
|
+
'aws_secret' => 'base64_encoded_secret...'
|
|
25
|
+
];
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Correct (environment variables or secrets manager):**
|
|
29
|
+
|
|
30
|
+
```php
|
|
31
|
+
// Using environment variables (via .env file not in VCS)
|
|
32
|
+
$stripeSecret = getenv('STRIPE_SECRET_KEY');
|
|
33
|
+
|
|
34
|
+
// In Laravel (using config which pulls from .env)
|
|
35
|
+
$stripeSecret = config('services.stripe.secret');
|
|
36
|
+
|
|
37
|
+
// Validation at startup or in Service Providers
|
|
38
|
+
if (empty($stripeSecret)) {
|
|
39
|
+
throw new \RuntimeException('STRIPE_SECRET_KEY is required but not set.');
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**.gitignore configuration:**
|
|
44
|
+
Ensure sensitive files are never committed:
|
|
45
|
+
```gitignore
|
|
46
|
+
# .gitignore
|
|
47
|
+
.env
|
|
48
|
+
.env.production
|
|
49
|
+
auth.json
|
|
50
|
+
*.key
|
|
51
|
+
*.pem
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Prevention Strategy:**
|
|
55
|
+
1. Use `.env.example` to list required keys without values.
|
|
56
|
+
2. Use a Secrets Manager (AWS, HashiCorp Vault) for production environments.
|
|
57
|
+
3. Rotate secrets immediately if they are accidentally committed.
|
|
58
|
+
|
|
59
|
+
**Tools:** Gitleaks, TruffleHog, SonarQube, pre-commit hooks
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Boolean Names Is/Has/Should
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: makes conditions instantly readable
|
|
5
|
+
tags: naming, booleans, readability, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Boolean Names Is/Has/Should
|
|
9
|
+
|
|
10
|
+
Boolean variables and methods should use prefixes like `is`, `has`, `should`, `can`, or `will`. This makes conditions and logic flows instantly readable and distinguishes booleans from other data types.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unclear boolean names):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
$active = ($user->status === 'active');
|
|
16
|
+
$admin = checkAdminRole($user);
|
|
17
|
+
$items = (count($cart) > 0);
|
|
18
|
+
$refresh = needsRefresh();
|
|
19
|
+
|
|
20
|
+
if ($active) { ... } // Unclear if $active is an object, string, or boolean
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (boolean prefixes):**
|
|
24
|
+
|
|
25
|
+
```php
|
|
26
|
+
$isActive = ($user->status === 'active');
|
|
27
|
+
$isAdmin = checkAdminRole($user);
|
|
28
|
+
$hasItems = (count($cart) > 0);
|
|
29
|
+
$shouldRefresh = needsRefresh();
|
|
30
|
+
$canEdit = hasPermission($user, 'edit');
|
|
31
|
+
|
|
32
|
+
if ($isActive) { ... } // Instantly readable context
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Common Boolean prefixes:**
|
|
36
|
+
|
|
37
|
+
| Prefix | Use Case | Example |
|
|
38
|
+
|--------|----------|---------|
|
|
39
|
+
| `is` | State or identity | `$isEnabled`, `$isActive`, `$isOwner` |
|
|
40
|
+
| `has` | Possession or existence | `$hasPermission`, `$hasErrors`, `$hasAttachment` |
|
|
41
|
+
| `should` | Boolean logic for decisions | `$shouldRetry`, `$shouldRedirect`, `$shouldSave` |
|
|
42
|
+
| `can` | Permissions or capabilities | `$canDelete`, `$canViewAdmin`, `$canUpload` |
|
|
43
|
+
| `will` | Future state or intent | `$willExpire`, `$willAutoRenew` |
|
|
44
|
+
|
|
45
|
+
**Best Practice for Methods:**
|
|
46
|
+
Always prefer naming boolean-returning methods with these prefixes as well:
|
|
47
|
+
```php
|
|
48
|
+
public function isActive(): bool { ... }
|
|
49
|
+
public function hasPermission(string $perm): bool { ... }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Tools:** PHPStan (check-naming-conventions), PR review
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Separate Parsing From Controllers
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: keeps controllers thin and focused on HTTP orchestration
|
|
5
|
+
tags: controller, parsing, transformation, patterns, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Separate Parsing From Controllers
|
|
9
|
+
|
|
10
|
+
Controllers should be "thin" and focus only on orchestrating HTTP concerns: receiving requests, calling services, and returning responses. Complex data transformation or parsing logic should be extracted into dedicated classes like Resources, Transformers, or Mappers.
|
|
11
|
+
|
|
12
|
+
**Incorrect (transformation logic in Controller):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
class UserController extends Controller {
|
|
16
|
+
public function show($id) {
|
|
17
|
+
$user = User::findOrFail($id);
|
|
18
|
+
|
|
19
|
+
// Complex transformation in controller
|
|
20
|
+
return response()->json([
|
|
21
|
+
'id' => $user->id,
|
|
22
|
+
'full_name' => $user->first_name . ' ' . $user->last_name,
|
|
23
|
+
'email' => strtolower($user->email),
|
|
24
|
+
'member_since' => $user->created_at->format('Y-m-d'),
|
|
25
|
+
'can_delete' => $user->id !== auth()->id()
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Correct (using a Resource or Transformer):**
|
|
32
|
+
|
|
33
|
+
```php
|
|
34
|
+
/**
|
|
35
|
+
* Using Laravel API Resources (Recommended)
|
|
36
|
+
*/
|
|
37
|
+
class UserResource extends JsonResource {
|
|
38
|
+
public function toArray($request) {
|
|
39
|
+
return [
|
|
40
|
+
'id' => $this->id,
|
|
41
|
+
'full_name' => $this->first_name . ' ' . $this->last_name,
|
|
42
|
+
'email' => strtolower($this->email),
|
|
43
|
+
'member_since' => $this->created_at->format('Y-m-d'),
|
|
44
|
+
'can_delete' => $this->id !== auth()->id()
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Clean Controller
|
|
51
|
+
*/
|
|
52
|
+
class UserController extends Controller {
|
|
53
|
+
public function show($id) {
|
|
54
|
+
$user = User::findOrFail($id);
|
|
55
|
+
return new UserResource($user);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Benefits:**
|
|
61
|
+
- **Reusability**: Use the same transformation logic in different controllers or for nested relationships.
|
|
62
|
+
- **Maintainability**: Changing the API response format only requires editing one resource class.
|
|
63
|
+
- **Testability**: You can unit test the Resource/Transformer class independently of the HTTP request.
|
|
64
|
+
- **Separation of Concerns**: Controllers handle "How to respond", Resources handle "What the response looks like".
|
|
65
|
+
|
|
66
|
+
**Tools:** Laravel API Resources, league/fractal, Spatie Data Transfer Objects, PR review
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Ignore Superclass Logic
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: ensures proper inheritance behavior and prevents breaking base logic
|
|
5
|
+
tags: inheritance, override, superclass, oop, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Ignore Superclass Logic
|
|
9
|
+
|
|
10
|
+
When overriding methods in a subclass, ensure that you are not accidentally bypassing critical logic defined in the base class. Unless you intentionally want to replace the entire behavior, you should generally call the parent implementation.
|
|
11
|
+
|
|
12
|
+
**Incorrect (ignoring superclass logic):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
class BaseService {
|
|
16
|
+
public function save($entity) {
|
|
17
|
+
$this->validate($entity);
|
|
18
|
+
$this->beforeSave($entity);
|
|
19
|
+
$this->repository->persist($entity);
|
|
20
|
+
$this->afterSave($entity);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
class UserService extends BaseService {
|
|
25
|
+
public function save($user) {
|
|
26
|
+
// Completely bypasses validation and hooks!
|
|
27
|
+
$this->repository->persist($user);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Correct (calling parent implementation):**
|
|
33
|
+
|
|
34
|
+
```php
|
|
35
|
+
class UserService extends BaseService {
|
|
36
|
+
public function save($user) {
|
|
37
|
+
// Add subclass-specific logic
|
|
38
|
+
$user->updated_at = now();
|
|
39
|
+
|
|
40
|
+
// Call superclass logic to ensure hooks and validation run
|
|
41
|
+
parent::save($user);
|
|
42
|
+
|
|
43
|
+
// Add more specific logic
|
|
44
|
+
$this->notifyAdmins($user);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**When is it acceptable to skip `parent::method()`?**
|
|
50
|
+
- When the base implementation is explicitly designed to be replaced.
|
|
51
|
+
- When the base implementation is an empty placeholder or default behavior that does not apply.
|
|
52
|
+
- **Action**: Always document the reason why the parent logic is being intentionally bypassed.
|
|
53
|
+
|
|
54
|
+
**Tools:** PHPStan (check for missing parent calls), Psalm, PR review
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Hardcode Configuration
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: enables environment-specific deployments without code changes
|
|
5
|
+
tags: configuration, environment, deployment, quality, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Hardcode Configuration
|
|
9
|
+
|
|
10
|
+
Configuration values that vary between environments (Staging, Production, Local) should never be hardcoded in the source code. Hardcoding these values requires code changes and deployments for simple configuration updates and prevents the creation of portable builds.
|
|
11
|
+
|
|
12
|
+
**Incorrect (hardcoded config):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Hardcoded API URLs and limits
|
|
16
|
+
$apiUrl = 'https://api.production.example.com';
|
|
17
|
+
$timeout = 30;
|
|
18
|
+
$maxUploadSize = 10485760; // 10MB
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Correct (externalized config):**
|
|
22
|
+
|
|
23
|
+
```php
|
|
24
|
+
/**
|
|
25
|
+
* Use Environment Variables (.env)
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
// In plain PHP
|
|
29
|
+
$apiUrl = getenv('API_URL') ?: 'http://localhost:8000';
|
|
30
|
+
$timeout = (int)(getenv('API_TIMEOUT') ?: 30);
|
|
31
|
+
|
|
32
|
+
// In Laravel (Recommended: use config files that pull from env)
|
|
33
|
+
// config/services.php
|
|
34
|
+
return [
|
|
35
|
+
'external_api' => [
|
|
36
|
+
'url' => env('EXTERNAL_API_URL', 'https://api.staging.example.com'),
|
|
37
|
+
'timeout' => env('EXTERNAL_API_TIMEOUT', 30),
|
|
38
|
+
]
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
// Usage in Service
|
|
42
|
+
$url = config('services.external_api.url');
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Why externalize configuration?**
|
|
46
|
+
- **Portability**: The same code can run in Dev, Staging, and Production by changing only the `.env` file or environment variables.
|
|
47
|
+
- **Security**: Sensitive configuration (like API keys) is kept out of the codebase (see rule **C041**).
|
|
48
|
+
- **Flexibility**: Change values (like timeouts or feature flags) without re-deploying or re-building the application code.
|
|
49
|
+
|
|
50
|
+
**Best Practices:**
|
|
51
|
+
1. Provide sensible defaults for local development.
|
|
52
|
+
2. Validate required configuration at application startup.
|
|
53
|
+
3. Use a single source of truth for configuration (e.g., Laravel's `config/` directory).
|
|
54
|
+
|
|
55
|
+
**Tools:** PHP Dotenv (`vlucas/phpdotenv`), Laravel/Symfony Config components, PR review
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: URL Redirects Must Be In Allow List
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: prevents open redirect vulnerabilities
|
|
5
|
+
tags: redirect, url, allow-list, validation, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## URL Redirects Must Be In Allow List
|
|
9
|
+
|
|
10
|
+
Open redirect vulnerabilities allow attackers to redirect users to malicious sites, often used in phishing attacks. This occurs when an application takes a URL as input and redirects the user to that URL without proper validation.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unvalidated redirect URL):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Open redirect vulnerability
|
|
16
|
+
$url = $_GET['url'];
|
|
17
|
+
header("Location: " . $url); // Attacker: ?url=https://malicious-site.com
|
|
18
|
+
exit;
|
|
19
|
+
|
|
20
|
+
// Partial validation (can be bypassed)
|
|
21
|
+
if (strpos($_GET['url'], 'example.com') !== false) {
|
|
22
|
+
header("Location: " . $_GET['url']); // Bypass: https://attacker.com?example.com
|
|
23
|
+
exit;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Correct (allow list validation):**
|
|
28
|
+
|
|
29
|
+
```php
|
|
30
|
+
// 1. Using an allow list of hosts
|
|
31
|
+
$url = $_GET['url'] ?? '/';
|
|
32
|
+
$parsed = parse_url($url);
|
|
33
|
+
$allowedHosts = ['example.com', 'sun-asterisk.vn'];
|
|
34
|
+
|
|
35
|
+
if (isset($parsed['host'])) {
|
|
36
|
+
if (!in_array($parsed['host'], $allowedHosts)) {
|
|
37
|
+
header("Location: /error?msg=Invalid+Redirect");
|
|
38
|
+
exit;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 2. Ensuring relative redirect only
|
|
43
|
+
if (strpos($url, '/') === 0 && strpos($url, '//') !== 0) {
|
|
44
|
+
// This is a relative path starting with / but not // (which is an absolute URL)
|
|
45
|
+
header("Location: " . $url);
|
|
46
|
+
exit;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 3. Using Laravel's safe redirect
|
|
50
|
+
return redirect()->away($url); // If host is trusted, or:
|
|
51
|
+
return redirect()->intended('/dashboard'); // Safer
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Protection strategies:**
|
|
55
|
+
1. Maintain an allow list of trusted domains.
|
|
56
|
+
2. Force redirects to be relative URLs (starting with a single `/`).
|
|
57
|
+
3. Always validate the host part using `parse_url()`.
|
|
58
|
+
4. Use framework-specific security helpers (e.g., Laravel's `redirect()`).
|
|
59
|
+
|
|
60
|
+
**Tools:** SonarQube (S5144), Semgrep, PHPStan, Manual Review
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Log Credentials Or Tokens
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents credential exposure in logs
|
|
5
|
+
tags: logging, credentials, tokens, secrets, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Log Credentials Or Tokens
|
|
9
|
+
|
|
10
|
+
Logs are frequently stored in plaintext and accessible by many developers or automated tools. Including sensitive credentials (passwords, API tokens, session IDs) in logs can lead to account takeovers if the logs are ever compromised or accidentally exposed.
|
|
11
|
+
|
|
12
|
+
**Incorrect (logging sensitive data):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Logging user credentials
|
|
16
|
+
Log::info('Login attempt', [
|
|
17
|
+
'username' => $request->username,
|
|
18
|
+
'password' => $request->password // NEVER!
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
// Logging all request headers
|
|
22
|
+
Log::debug('Request headers', $request->headers->all());
|
|
23
|
+
// Authorization header contains Bearer tokens!
|
|
24
|
+
|
|
25
|
+
// Logging full request body
|
|
26
|
+
Log::info('Incoming form data', $request->all());
|
|
27
|
+
// May contain password, credit_card, or secret_key
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Correct (sanitized logging):**
|
|
31
|
+
|
|
32
|
+
```php
|
|
33
|
+
// 1. Omit sensitive fields explicitly
|
|
34
|
+
Log::info('Login attempt', [
|
|
35
|
+
'username' => $request->username,
|
|
36
|
+
// password excluded
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
// 2. Redact sensitive headers
|
|
40
|
+
$headers = $request->headers->all();
|
|
41
|
+
if (isset($headers['authorization'])) {
|
|
42
|
+
$headers['authorization'] = '[REDACTED]';
|
|
43
|
+
}
|
|
44
|
+
Log::debug('Request headers', $headers);
|
|
45
|
+
|
|
46
|
+
// 3. Use an allowlist or a masking helper
|
|
47
|
+
function sanitizeForLog(array $data): array {
|
|
48
|
+
$sensitive = ['password', 'token', 'secret', 'credit_card', 'api_key'];
|
|
49
|
+
foreach ($sensitive as $field) {
|
|
50
|
+
if (isset($data[$field])) {
|
|
51
|
+
$data[$field] = '[REDACTED]';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return $data;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Log::info('Request data', sanitizeForLog($request->all()));
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Never log:**
|
|
61
|
+
- Passwords (plaintext or hashes)
|
|
62
|
+
- API keys, JWT tokens, OAuth tokens
|
|
63
|
+
- Credit card numbers, CVVs
|
|
64
|
+
- Session IDs (`PHPSESSID`)
|
|
65
|
+
- Personal Identifiable Information (PII) like SSNs where not required
|
|
66
|
+
|
|
67
|
+
**Tools:** Monolog (custom formatters), PHPStan, SonarQube, Log analysis tools
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Enforce Authorization At Trusted Service Layer
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: prevents client-side authorization bypass and unauthorized access
|
|
5
|
+
tags: authorization, server-side, middleware, access-control, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Enforce Authorization At Trusted Service Layer
|
|
9
|
+
|
|
10
|
+
Client-side authorization (e.g., hiding a button in JavaScript) is a UI enhancement only and can be easily bypassed by an attacker using the browser console or intercepting network requests. All access control checks must be enforced on the server-side, using trusted data from the authenticated session.
|
|
11
|
+
|
|
12
|
+
**Incorrect (client-side or trusting client-provided state):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// 1. Trusting a hidden field or POST data for permissions
|
|
16
|
+
function deleteUser($userId) {
|
|
17
|
+
if ($_POST['is_admin'] == '1') { // VULNERABLE: Client can send is_admin=1
|
|
18
|
+
DB::table('users')->where('id', $userId)->delete();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// 2. Trusting a role stored in a cookie (that is not a secure session)
|
|
23
|
+
if ($_COOKIE['role'] === 'admin') {
|
|
24
|
+
// ...
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Correct (server-side authorization):**
|
|
29
|
+
|
|
30
|
+
```php
|
|
31
|
+
// 1. Using Middleware (Laravel example)
|
|
32
|
+
Route::delete('/users/{id}', [UserController::class, 'destroy'])
|
|
33
|
+
->middleware('can:delete-users'); // Server-side check via Policy/Gate
|
|
34
|
+
|
|
35
|
+
// 2. Explicit checking in Controller against session user
|
|
36
|
+
public function destroy($id) {
|
|
37
|
+
$user = Auth::user(); // Trusted data from session
|
|
38
|
+
|
|
39
|
+
// Using a Policy (Recommended)
|
|
40
|
+
if ($user->cannot('delete', User::find($id))) {
|
|
41
|
+
abort(403, 'Unauthorized action.');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ... delete logic
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 3. Using Symfony Voters
|
|
48
|
+
// $this->denyAccessUnlessGranted('POST_EDIT', $post);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Never trust:**
|
|
52
|
+
- Client-side checks (JavaScript logic).
|
|
53
|
+
- Hidden form fields or request body parameters for defining user "roles" or "powers".
|
|
54
|
+
- URL parameters for access control (e.g. `?is_admin=true`).
|
|
55
|
+
- Browser storage (LocalStorage/SessionStorage) for authorization state.
|
|
56
|
+
|
|
57
|
+
**Tools:** Laravel Middleware/Gates/Policies, Symfony Voters, PHPUnit (testing auth logic), SonarQube
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Use Default Credentials
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: prevents trivial compromise via known credentials
|
|
5
|
+
tags: credentials, default, passwords, configuration, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Use Default Credentials
|
|
9
|
+
|
|
10
|
+
Default credentials (e.g., `admin/admin`, `root/root`) are publicly known and are the first thing attackers or automated bots try when probing a system. Using them in any environment (even staging) exposes the system to trivial compromise.
|
|
11
|
+
|
|
12
|
+
**Incorrect (default or hardcoded credentials):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Application config with defaults
|
|
16
|
+
return [
|
|
17
|
+
'db' => [
|
|
18
|
+
'username' => 'root',
|
|
19
|
+
'password' => 'root', // Default!
|
|
20
|
+
],
|
|
21
|
+
'admin' => [
|
|
22
|
+
'user' => 'admin',
|
|
23
|
+
'password' => 'admin' // Default!
|
|
24
|
+
]
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
// Docker Compose Example with defaults
|
|
28
|
+
// POSTGRES_PASSWORD: password
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Correct (externalized and unique credentials):**
|
|
32
|
+
|
|
33
|
+
```php
|
|
34
|
+
// Use environment variables or Secrets Manager
|
|
35
|
+
return [
|
|
36
|
+
'db' => [
|
|
37
|
+
'username' => getenv('DB_USERNAME'),
|
|
38
|
+
'password' => getenv('DB_PASSWORD'),
|
|
39
|
+
],
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
// Validation during application boot (e.g. in Laravel AppServiceProvider)
|
|
43
|
+
if (config('app.env') === 'production') {
|
|
44
|
+
$pass = config('database.connections.mysql.password');
|
|
45
|
+
$defaults = ['admin', 'password', 'root', '123456'];
|
|
46
|
+
|
|
47
|
+
if (in_array(strtolower($pass), $defaults)) {
|
|
48
|
+
throw new \RuntimeException('Production is using default/weak credentials. Deployment blocked.');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Never use common defaults:**
|
|
54
|
+
- `admin / admin`
|
|
55
|
+
- `root / root`
|
|
56
|
+
- `guest / guest`
|
|
57
|
+
- `postgres / postgres`
|
|
58
|
+
- `admin / 123456`
|
|
59
|
+
- Any empty passwords in networked environments.
|
|
60
|
+
|
|
61
|
+
**Tools:** Gitleaks, TruffleHog, OWASP ZAP (to check for default admin pages), SonarQube
|