@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,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Output Encoding Before Interpreter Use
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents XSS and other injection attacks in the browser
|
|
5
|
+
tags: xss, encoding, output, html, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Output Encoding Before Interpreter Use
|
|
9
|
+
|
|
10
|
+
Cross-Site Scripting (XSS) and other injection attacks occur when unescaped user-controlled data is interpreted as code by the browser. All data must be encoded or escaped according to the context where it is being displayed.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no encoding):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// XSS vulnerability in plain PHP
|
|
16
|
+
echo "<h1>Results for: " . $_GET['q'] . "</h1>";
|
|
17
|
+
|
|
18
|
+
// Blade "unescaped" output for user input
|
|
19
|
+
{!! $userInput !!}
|
|
20
|
+
|
|
21
|
+
// Injecting into JavaScript without encoding
|
|
22
|
+
echo "<script>const name = '" . $userName . "';</script>";
|
|
23
|
+
// Attacker in $userName: '; alert(1); //
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Correct (context-aware encoding):**
|
|
27
|
+
|
|
28
|
+
```php
|
|
29
|
+
// 1. HTML Body context (plain PHP)
|
|
30
|
+
echo "<h1>Results for: " . htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8') . "</h1>";
|
|
31
|
+
|
|
32
|
+
// 2. Blade (Recommended)
|
|
33
|
+
// Auto-escapes using htmlspecialchars internally
|
|
34
|
+
<h1>Results for: {{ $query }}</h1>
|
|
35
|
+
|
|
36
|
+
// 3. If you MUST output HTML, use a sanitizer (e.g. HTML Purifier)
|
|
37
|
+
$purifier = new HTMLPurifier();
|
|
38
|
+
echo $purifier->purify($userHtml);
|
|
39
|
+
|
|
40
|
+
// 4. JavaScript context
|
|
41
|
+
// Always use json_encode for passing data to JS
|
|
42
|
+
?>
|
|
43
|
+
<script>
|
|
44
|
+
const name = <?php echo json_encode($userName); ?>;
|
|
45
|
+
</script>
|
|
46
|
+
<?php
|
|
47
|
+
|
|
48
|
+
// 5. URL context
|
|
49
|
+
$url = "/profile?user=" . urlencode($username);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Encoding by Context:**
|
|
53
|
+
|
|
54
|
+
| Context | Encoding Method | Result Example |
|
|
55
|
+
|---------|-----------------|----------------|
|
|
56
|
+
| **HTML Body** | `htmlspecialchars()` | `<` becomes `<` |
|
|
57
|
+
| **HTML Attribute** | `htmlspecialchars(..., ENT_QUOTES)` | `"` becomes `"` |
|
|
58
|
+
| **JavaScript** | `json_encode()` | String becomes `"string"` with quotes |
|
|
59
|
+
| **URL Parameter** | `urlencode()` | Spaces become `+` or `%20` |
|
|
60
|
+
|
|
61
|
+
**Tools:** HTML Purifier, Blade Template Engine, PHP_CodeSniffer, SonarQube
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Only Approved Crypto Algorithms
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: ensures cryptographic strength and resistance to collision or brute-force attacks
|
|
5
|
+
tags: cryptography, algorithms, hashing, encryption, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Only Approved Crypto Algorithms
|
|
9
|
+
|
|
10
|
+
Weak cryptographic algorithms like MD5, SHA-1, DES, and AES-ECB are either broken or have known vulnerabilities that make them insecure for modern applications. Always use industry-standard, approved algorithms for hashing and encryption.
|
|
11
|
+
|
|
12
|
+
**Incorrect (weak algorithms):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// WEAK hash (MD5 is broken)
|
|
16
|
+
$hash = md5($password);
|
|
17
|
+
|
|
18
|
+
// WEAK encryption mode (ECB mode does not provide semantic security)
|
|
19
|
+
$encrypted = openssl_encrypt($data, 'aes-256-ecb', $key);
|
|
20
|
+
|
|
21
|
+
// WEAK algorithm
|
|
22
|
+
$encrypted = openssl_encrypt($data, 'des-ede3', $key); // 3DES is deprecated
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (approved algorithms):**
|
|
26
|
+
|
|
27
|
+
```php
|
|
28
|
+
// 1. Password Hashing (Always use password_hash)
|
|
29
|
+
$hash = password_hash($password, PASSWORD_ARGON2ID); // Recommended: Argon2id or BCRYPT
|
|
30
|
+
$isValid = password_verify($password, $hash);
|
|
31
|
+
|
|
32
|
+
// 2. Data Integrity (non-password)
|
|
33
|
+
$hash = hash('sha256', $data);
|
|
34
|
+
|
|
35
|
+
// 3. Strong Authenticated Encryption (GCM mode)
|
|
36
|
+
$iv = random_bytes(openssl_cipher_iv_length('aes-256-gcm'));
|
|
37
|
+
$tag = "";
|
|
38
|
+
$encrypted = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
|
|
39
|
+
// Store $iv, $tag, and $encrypted
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Approved vs Prohibited:**
|
|
43
|
+
|
|
44
|
+
| Purpose | Approved | Prohibited |
|
|
45
|
+
|---------|----------|------------|
|
|
46
|
+
| **Data Hashing** | SHA-256, SHA-3, BLAKE2 | MD5, SHA-1 |
|
|
47
|
+
| **Encryption** | AES-256-GCM, AES-256-CBC (with HMAC) | AES-ECB, DES, 3DES, RC4 |
|
|
48
|
+
| **Passwords** | Argon2id, BCRYPT | MD5, SHA-256, Plain Encryption |
|
|
49
|
+
|
|
50
|
+
**Best Practice:**
|
|
51
|
+
Never roll your own crypto. Use high-level libraries like `libsodium` (built-in to PHP 7.2+) if you need advanced features. For passwords, **only** use the native `password_hash()` functions.
|
|
52
|
+
|
|
53
|
+
**Tools:** PHPStan (check for md5/sha1), SonarQube (S2070, S4790), Semgrep
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use CSPRNG For Security Purposes
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents predictable tokens and session hijacking
|
|
5
|
+
tags: random, csprng, tokens, session, cryptography, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use CSPRNG For Security Purposes
|
|
9
|
+
|
|
10
|
+
Non-cryptographic random generators like `rand()` or `mt_rand()` are predictable. Attackers can guess session tokens, OTPs, and password reset links if they are generated with weak random sources.
|
|
11
|
+
|
|
12
|
+
**Incorrect (predictable random):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// INSECURE - predictable!
|
|
16
|
+
$sessionId = md5(rand());
|
|
17
|
+
|
|
18
|
+
// INSECURE - mt_rand() is faster but not cryptographically secure
|
|
19
|
+
$otp = mt_rand(100000, 999999);
|
|
20
|
+
|
|
21
|
+
// INSECURE - uniqid() is based on current time in microseconds
|
|
22
|
+
$resetToken = uniqid('token_', true);
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (cryptographically secure):**
|
|
26
|
+
|
|
27
|
+
```php
|
|
28
|
+
// Cryptographically secure session ID or token
|
|
29
|
+
$token = bin2hex(random_bytes(32)); // 256-bit entropy
|
|
30
|
+
|
|
31
|
+
// Secure OTP generation
|
|
32
|
+
$otp = random_int(100000, 999999);
|
|
33
|
+
|
|
34
|
+
// Using Laravel's Str helper (which uses random_bytes internally)
|
|
35
|
+
use Illuminate\Support\Str;
|
|
36
|
+
$token = Str::random(40);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**CSPRNG by language (Update):**
|
|
40
|
+
|
|
41
|
+
| Language | Secure | Insecure |
|
|
42
|
+
|----------|--------|----------|
|
|
43
|
+
| PHP7+ | `random_bytes()`, `random_int()` | `rand()`, `mt_rand()`, `uniqid()` |
|
|
44
|
+
| Node.js | `crypto.randomBytes()` | `Math.random()` |
|
|
45
|
+
| Python | `secrets`, `os.urandom()` | `random` |
|
|
46
|
+
|
|
47
|
+
**Tools:** PHPStan (extension-installer), Psalm, SonarQube (S2245), Semgrep
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Enable Encrypted Client Hello (ECH)
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: protects Server Name Indication (SNI) from eavesdropping
|
|
5
|
+
tags: tls, ech, sni, privacy, security, infrastructure, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Enable Encrypted Client Hello (ECH)
|
|
9
|
+
|
|
10
|
+
Encrypted Client Hello (ECH) is a TLS extension that encrypts the entire `ClientHello` message during the TLS handshake. This prevents network eavesdroppers from seeing the Server Name Indication (SNI), essentially hiding the specific domain name you are visiting.
|
|
11
|
+
|
|
12
|
+
**Infrastructure Configuration:**
|
|
13
|
+
|
|
14
|
+
ECH is typically handled at the web server (Nginx/Apache) or CDN level (Cloudflare), not directly in PHP code.
|
|
15
|
+
|
|
16
|
+
**1. Nginx Configuration (where supported):**
|
|
17
|
+
|
|
18
|
+
```nginx
|
|
19
|
+
# Future-facing Nginx configuration
|
|
20
|
+
ssl_ech on;
|
|
21
|
+
ssl_ech_key /etc/nginx/ssl/ech-key.pem;
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**2. DNS Configuration:**
|
|
25
|
+
|
|
26
|
+
You must publish an `HTTPS` or `SVCB` DNS record containing the ECH configuration string:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
# Example HTTPS record with ECH data
|
|
30
|
+
example.com. IN HTTPS 1 . alpn="h2" ech="<base64-ech-config>"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**How it works with PHP:**
|
|
34
|
+
PHP applications benefit from ECH transparently when served behind a compatible reverse proxy or CDN. No changes are required to the PHP logic itself, but developers should advocate for its use in production environments to improve user privacy.
|
|
35
|
+
|
|
36
|
+
**Current Support State:**
|
|
37
|
+
- **Cloudflare**: Provides one-click ECH support.
|
|
38
|
+
- **Browsers**: Chrome and Firefox have experimental or rolling support.
|
|
39
|
+
- **Privacy**: Crucial for bypassing censorship and preventing DNS/SNI-based tracking.
|
|
40
|
+
|
|
41
|
+
**Tools:** Cloudflare, NGINX (with ECH patches), DigiCert, DNS management
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Secrets Management For Backend Secrets
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: centralizes and secures credential storage
|
|
5
|
+
tags: secrets, vault, credentials, configuration, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Secrets Management For Backend Secrets
|
|
9
|
+
|
|
10
|
+
Hardcoded secrets (API keys, database passwords, tokens) are exposed in version control and can be accessed by anyone with code access. Use dedicated secrets management systems or environment variables that are not committed to the repository.
|
|
11
|
+
|
|
12
|
+
**Incorrect (hardcoded or plain env files):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Hardcoded in code
|
|
16
|
+
define('API_KEY', 'sk-abc123xyz789');
|
|
17
|
+
|
|
18
|
+
// Hardcoded in a config file
|
|
19
|
+
$config = [
|
|
20
|
+
'db' => [
|
|
21
|
+
'password' => 'super-secret-password'
|
|
22
|
+
]
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
// .env file committed to repo (vulnerable)
|
|
26
|
+
// DB_PASSWORD=password123
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Correct (secrets management):**
|
|
30
|
+
|
|
31
|
+
```php
|
|
32
|
+
// Using environment variables (not committed to VCS)
|
|
33
|
+
$dbPassword = getenv('DB_PASSWORD');
|
|
34
|
+
|
|
35
|
+
// In Laravel (using .env which is in .gitignore)
|
|
36
|
+
$password = env('DB_PASSWORD');
|
|
37
|
+
// Or via config (Recommended)
|
|
38
|
+
$stripeKey = config('services.stripe.key');
|
|
39
|
+
|
|
40
|
+
// Using a dedicated Secrets Manager (e.g., AWS Secrets Manager via SDK)
|
|
41
|
+
use Aws\SecretsManager\SecretsManagerClient;
|
|
42
|
+
|
|
43
|
+
$client = new SecretsManagerClient(['region' => 'us-east-1']);
|
|
44
|
+
$result = $client->getSecretValue(['SecretId' => 'prod/db/password']);
|
|
45
|
+
$dbPassword = $result['SecretString'];
|
|
46
|
+
|
|
47
|
+
// Validation at startup
|
|
48
|
+
if (!$dbPassword) {
|
|
49
|
+
throw new \RuntimeException('DATABASE_URL environment variable is required but not set.');
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Best practices:**
|
|
54
|
+
1. Never commit `.env` files or hardcoded secrets to version control.
|
|
55
|
+
2. Use a `.env.example` to document required variables without real data.
|
|
56
|
+
3. Use secrets rotation for critical credentials.
|
|
57
|
+
4. Audit access to your production secrets.
|
|
58
|
+
5. Use different secrets for development, staging, and production environments.
|
|
59
|
+
|
|
60
|
+
**Tools:** HashiCorp Vault, AWS Secrets Manager, Dotenv PHP, SonarQube
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Always Use TLS For All Connections
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: protects data in transit from eavesdropping and man-in-the-middle attacks
|
|
5
|
+
tags: tls, https, encryption, transport, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Always Use TLS For All Connections
|
|
9
|
+
|
|
10
|
+
Unencrypted data (HTTP, plain SQL, plain Redis) is easily intercepted by anyone on the network path. You must enforce TLS for all external and internal communications.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unencrypted connections):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// 1. Plain HTTP API calls
|
|
16
|
+
$data = file_get_contents("http://api.example.com/data");
|
|
17
|
+
|
|
18
|
+
// 2. Database without encryption
|
|
19
|
+
$pdo = new PDO("mysql:host=db.example.com;dbname=test", "user", "pass");
|
|
20
|
+
|
|
21
|
+
// 3. Unencrypted Redis
|
|
22
|
+
$redis = new Redis();
|
|
23
|
+
$redis->connect('redis.example.com', 6379);
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Correct (TLS everywhere):**
|
|
27
|
+
|
|
28
|
+
```php
|
|
29
|
+
// 1. HTTPS for APIs
|
|
30
|
+
$data = file_get_contents("https://api.example.com/data");
|
|
31
|
+
|
|
32
|
+
// 2. Database with TLS (PDO MySQL)
|
|
33
|
+
$pdo = new PDO(
|
|
34
|
+
"mysql:host=db.example.com;dbname=test",
|
|
35
|
+
"user", "pass",
|
|
36
|
+
[
|
|
37
|
+
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca-cert.pem',
|
|
38
|
+
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
|
|
39
|
+
]
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
// 3. Redis with TLS (PhpRedis)
|
|
43
|
+
$redis = new Redis();
|
|
44
|
+
$redis->connect('tls://redis.example.com', 6380, 1.5, NULL, 0, 0, [
|
|
45
|
+
'stream' => [
|
|
46
|
+
'cafile' => '/path/to/ca-cert.pem',
|
|
47
|
+
'verify_peer' => true,
|
|
48
|
+
],
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
// 4. Force HTTPS in Application (Laravel Middleware)
|
|
52
|
+
if (! $request->secure() && App::environment('production')) {
|
|
53
|
+
return redirect()->secure($request->getRequestUri());
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 5. HSTS Header
|
|
57
|
+
header("Strict-Transport-Security: max-age=31536000; includeSubDomains; preload");
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Checklist:**
|
|
61
|
+
- [ ] All external API calls use `https://`.
|
|
62
|
+
- [ ] Database connections use SSL/TLS attributes.
|
|
63
|
+
- [ ] Redis/Cache connections use `tls://`.
|
|
64
|
+
- [ ] HSTS headers are enabled in production.
|
|
65
|
+
- [ ] Web server (Nginx/Apache) redirects all HTTP traffic to HTTPS.
|
|
66
|
+
|
|
67
|
+
**Tools:** OWASP ZAP, SSLyze, Qualys SSL Labs, PHPUnit (to verify connection stubs)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Do Not Pass Sensitive Data In Query String
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents sensitive information leakage in logs, browser history, and diagnostic tools
|
|
5
|
+
tags: url, query-string, sensitive-data, leakage, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Do Not Pass Sensitive Data In Query String
|
|
9
|
+
|
|
10
|
+
URL query strings are stored in browser history, web server access logs, proxy/CDN logs, and are passed in the `Referer` header to external sites. Sensitive information like tokens, passwords, or PII (Personally Identifiable Information) in a URL is practically public.
|
|
11
|
+
|
|
12
|
+
**Incorrect (sensitive data in URL):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// Passing token in GET parameter
|
|
16
|
+
$response = file_get_contents("https://api.example.com/data?api_key=" . $apiKey);
|
|
17
|
+
|
|
18
|
+
// Login via GET (Very Dangerous)
|
|
19
|
+
// GET /login.php?user=admin&password=secret123
|
|
20
|
+
|
|
21
|
+
// Passing sensitive PII
|
|
22
|
+
// GET /user/details?ssn=123-45-678
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (sensitive data in Headers or Request Body):**
|
|
26
|
+
|
|
27
|
+
```php
|
|
28
|
+
// 1. Passing tokens in Authorization Header
|
|
29
|
+
$context = stream_context_create([
|
|
30
|
+
'http' => [
|
|
31
|
+
'header' => "Authorization: Bearer " . $accessToken
|
|
32
|
+
]
|
|
33
|
+
]);
|
|
34
|
+
$response = file_get_contents("https://api.example.com/data", false, $context);
|
|
35
|
+
|
|
36
|
+
// 2. Sensitive data in POST Request Body
|
|
37
|
+
// (Using Guzzle for clarity)
|
|
38
|
+
$client->post('/login', [
|
|
39
|
+
'form_params' => [
|
|
40
|
+
'user' => 'admin',
|
|
41
|
+
'password' => $password
|
|
42
|
+
]
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
// 3. One-time tokens in POST forms
|
|
46
|
+
?>
|
|
47
|
+
<form action="/reset-password" method="POST">
|
|
48
|
+
<input type="hidden" name="token" value="<?php echo htmlspecialchars($secureToken); ?>">
|
|
49
|
+
<input type="password" name="new_password">
|
|
50
|
+
<button type="submit">Reset</button>
|
|
51
|
+
</form>
|
|
52
|
+
<?php
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Where query strings leak:**
|
|
56
|
+
- **Web Server Logs**: Apache/Nginx logs store the full URL including query strings.
|
|
57
|
+
- **Browser History**: Users can see sensitive tokens in their history.
|
|
58
|
+
- **Referer Header**: If a page with a token in the URL links to an external image or site, that site receives the token.
|
|
59
|
+
- **Proxy/WAF logs**: Intermediate network devices log URLs.
|
|
60
|
+
|
|
61
|
+
**Tools:** Semgrep, SonarQube, Manual Review, OWASP ZAP (to detect sensitive data in URLs)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Always Use Parameterized Queries
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: prevents SQL injection attacks
|
|
5
|
+
tags: injection, sql, database, parameterized, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Always Use Parameterized Queries
|
|
9
|
+
|
|
10
|
+
SQL injection is one of the top security vulnerabilities in PHP applications. Direct string concatenation or using variables directly in SQL strings allows attackers to execute arbitrary database commands, steal data, or destroy databases.
|
|
11
|
+
|
|
12
|
+
**Incorrect (string concatenation):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// SQL Injection vulnerability
|
|
16
|
+
$userId = $_GET['id'];
|
|
17
|
+
$query = "SELECT * FROM users WHERE id = '" . $userId . "'";
|
|
18
|
+
$result = $conn->query($query);
|
|
19
|
+
|
|
20
|
+
// Attacker input: ' OR '1'='1
|
|
21
|
+
// Resulting query: SELECT * FROM users WHERE id = '' OR '1'='1'
|
|
22
|
+
// Returns ALL users!
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Correct (parameterized queries):**
|
|
26
|
+
|
|
27
|
+
```php
|
|
28
|
+
// Using PDO (Recommended)
|
|
29
|
+
$userId = $_GET['id'];
|
|
30
|
+
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
|
|
31
|
+
$stmt->execute(['id' => $userId]);
|
|
32
|
+
$user = $stmt->fetch();
|
|
33
|
+
|
|
34
|
+
// Using MySQLi (Prepared Statements)
|
|
35
|
+
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
|
|
36
|
+
$stmt->bind_param("s", $userId);
|
|
37
|
+
$stmt->execute();
|
|
38
|
+
$result = $stmt->get_result();
|
|
39
|
+
|
|
40
|
+
// Using Laravel Eloquent (Safe by default)
|
|
41
|
+
$user = User::where('id', $userId)->first();
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Tools:** PHPStan (DBA extension), SonarQube (S2077, S3649), Psalm, Semgrep
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Sanitize Input Before Sending Emails
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents email header injection and spam abuse
|
|
5
|
+
tags: email, injection, sanitization, input-validation, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Sanitize Input Before Sending Emails
|
|
9
|
+
|
|
10
|
+
Email header injection vulnerabilities occur when an attacker can inject newline characters (`\r` or `\n`) into email headers like `Subject`, `To`, or `From`. This allows them to add unauthorized `Bcc:` or `Cc:` recipients, effectively turning your system into a spam relay.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unsanitized email input):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// VULNERABLE: Direct use of user input in mail() headers
|
|
16
|
+
$subject = $_POST['subject']; // Input: "Question\r\nBcc: victim@example.com"
|
|
17
|
+
$to = "admin@example.com";
|
|
18
|
+
$message = "User message...";
|
|
19
|
+
|
|
20
|
+
mail($to, $subject, $message); // Attacker successfully sent Bcc to victim!
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Correct (sanitized email fields):**
|
|
24
|
+
|
|
25
|
+
```php
|
|
26
|
+
function sanitizeEmailHeader($input) {
|
|
27
|
+
// Remove carriage returns and line feeds to prevent header injection
|
|
28
|
+
return str_replace(["\r", "\n", "\t"], ' ', $input);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
$to = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
|
|
32
|
+
if (!$to) {
|
|
33
|
+
die("Invalid email address");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
$subject = sanitizeEmailHeader($_POST['subject']);
|
|
37
|
+
$message = $_POST['message'];
|
|
38
|
+
|
|
39
|
+
// 1. Using native mail() with sanitized input
|
|
40
|
+
mail($to, $subject, $message);
|
|
41
|
+
|
|
42
|
+
// 2. Using Laravel Mail (Recommended)
|
|
43
|
+
// Laravel's Mailer and SwiftMailer/Symfony Mailer automatically sanitize headers.
|
|
44
|
+
// However, validation of addresses is still mandatory.
|
|
45
|
+
Mail::to($to)->send(new ContactRequest($subject, $message));
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Security Checklist:**
|
|
49
|
+
1. **Validate** email addresses using `FILTER_VALIDATE_EMAIL`.
|
|
50
|
+
2. **Sanitize** any user input used in headers (Subject, From, CC, BCC) by removing CRLF characters.
|
|
51
|
+
3. **Use Modern Libraries** like PHPMailer or Symfony Mailer which provide built-in protection against header injection.
|
|
52
|
+
4. **Rate Limit** email sending to prevent mass spamming if an account is compromised.
|
|
53
|
+
|
|
54
|
+
**Tools:** PHPStan, Psalm, SonarQube, Manual Security Review
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Avoid Eval Or Dynamic Code Execution
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents remote code execution vulnerabilities
|
|
5
|
+
tags: eval, code-execution, rce, injection, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Avoid Eval Or Dynamic Code Execution
|
|
9
|
+
|
|
10
|
+
`eval()`, `exec()`, `system()`, and similar functions execute arbitrary code or shell commands. Using these with user-controlled input makes the application extremely vulnerable to Remote Code Execution (RCE).
|
|
11
|
+
|
|
12
|
+
**Incorrect (dynamic code execution):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// eval() with user input
|
|
16
|
+
$formula = $_POST['formula'];
|
|
17
|
+
eval('$result = ' . $formula . ';'); // RCE vulnerability!
|
|
18
|
+
|
|
19
|
+
// system() or exec() with unsanitized input
|
|
20
|
+
system("ls -l " . $_GET['dir']); // Command injection!
|
|
21
|
+
|
|
22
|
+
// create_function() with user input (Deprecated)
|
|
23
|
+
$func = create_function('$a', 'return ' . $_POST['logic'] . ';');
|
|
24
|
+
|
|
25
|
+
// Dangerous unserialize with user input
|
|
26
|
+
$data = unserialize($_POST['data']); // Object injection vulnerability
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Correct (safe alternatives):**
|
|
30
|
+
|
|
31
|
+
```php
|
|
32
|
+
// Use a dedicated library for expression parsing (e.g., symfony/expression-language)
|
|
33
|
+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
|
34
|
+
|
|
35
|
+
$expressionLanguage = new ExpressionLanguage();
|
|
36
|
+
$result = $expressionLanguage->evaluate($formula, ['a' => 10]);
|
|
37
|
+
|
|
38
|
+
// Use an allowlist for commands
|
|
39
|
+
$allowedDirs = ['uploads', 'public'];
|
|
40
|
+
$dir = $_GET['dir'];
|
|
41
|
+
if (in_array($dir, $allowedDirs)) {
|
|
42
|
+
$safeDir = escapeshellarg($dir);
|
|
43
|
+
system("ls -l " . $safeDir);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Use JSON for data exchange (instead of serialize)
|
|
47
|
+
$data = json_decode($_POST['data'], true);
|
|
48
|
+
|
|
49
|
+
// For dynamic inclusion, use an allowlist
|
|
50
|
+
$allowedPages = ['home', 'contact', 'about'];
|
|
51
|
+
$page = $_GET['page'];
|
|
52
|
+
if (in_array($page, $allowedPages)) {
|
|
53
|
+
require_once "pages/" . $page . ".php";
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Tools:** PHPStan (disallow-eval), Psalm, SonarQube (S1523), Semgrep
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Escape Data By Output Context
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: ensures correct encoding for each output context to prevent XSS and injection
|
|
5
|
+
tags: xss, escaping, context, encoding, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Escape Data By Output Context
|
|
9
|
+
|
|
10
|
+
Using the wrong escaping strategy for a given context is a common security mistake. For example, using HTML encoding (`htmlspecialchars`) inside a JavaScript block or in an HTTP header does not provide adequate protection.
|
|
11
|
+
|
|
12
|
+
**Incorrect (wrong encoding for specific context):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
$input = $_GET['user']; // Attacker input: "; alert(1); //
|
|
16
|
+
|
|
17
|
+
// WRONG: Using HTML escaping in a JavaScript context
|
|
18
|
+
$escaped = htmlspecialchars($input);
|
|
19
|
+
echo "<script>var name = '{$escaped}';</script>";
|
|
20
|
+
// Result: var name = '"; alert(1); //'; -> Still potentially breaks logic or remains vulnerable
|
|
21
|
+
|
|
22
|
+
// WRONG: No sanitization for HTTP headers
|
|
23
|
+
header("X-Custom-Data: " . $input); // Header injection via CRLF
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Correct (context-appropriate encoding):**
|
|
27
|
+
|
|
28
|
+
```php
|
|
29
|
+
// 1. HTML Body Context
|
|
30
|
+
echo "<div>" . htmlspecialchars($input, ENT_QUOTES, 'UTF-8') . "</div>";
|
|
31
|
+
|
|
32
|
+
// 2. JavaScript Context (Always use JSON encoding)
|
|
33
|
+
$jsonInput = json_encode($input);
|
|
34
|
+
echo "<script>var name = {$jsonInput};</script>";
|
|
35
|
+
|
|
36
|
+
// 3. URL Context
|
|
37
|
+
echo "<a href='/profile?name=" . urlencode($input) . "'>View</a>";
|
|
38
|
+
|
|
39
|
+
// 4. HTTP Header Context (Strip newlines)
|
|
40
|
+
$safeHeader = str_replace(["\r", "\n"], '', $input);
|
|
41
|
+
header("X-Custom-Data: " . $safeHeader);
|
|
42
|
+
|
|
43
|
+
// 5. Shell Argument Context (If using exec/system)
|
|
44
|
+
$safeArg = escapeshellarg($input);
|
|
45
|
+
system("echo " . $safeArg);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Context Selection Guide:**
|
|
49
|
+
|
|
50
|
+
| Context | Recommended PHP Function | Why? |
|
|
51
|
+
|---------|--------------------------|------|
|
|
52
|
+
| **HTML Content** | `htmlspecialchars(..., ENT_QUOTES)` | Converts `< > & " '` to entities. |
|
|
53
|
+
| **JS Variable** | `json_encode()` | Safely wraps strings in quotes and escapes internal quotes/slashes. |
|
|
54
|
+
| **URL Parameter** | `urlencode()` | Converts special chars to `%XX` format. |
|
|
55
|
+
| **HTTP Header** | `str_replace(["\r", "\n"], '', $input)` | Prevents CRLF injection (Splitting). |
|
|
56
|
+
| **Shell Command** | `escapeshellarg()` | Adds quotes and escapes shells meta-characters. |
|
|
57
|
+
|
|
58
|
+
**Tools:** PHPStan, Psalm, SonarQube, Manual Security Review
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Output Encoding For Dynamic JS/JSON
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents code injection when embedding server-side data into JavaScript
|
|
5
|
+
tags: xss, javascript, json, encoding, security, php
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Output Encoding For Dynamic JS/JSON
|
|
9
|
+
|
|
10
|
+
Embedding PHP data directly into JavaScript tags requires proper encoding to prevent Cross-Site Scripting (XSS). Simple string interpolation or manual quoting is dangerous. The safest way to pass complex data (strings, arrays, objects) from PHP to JavaScript is using `json_encode`.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unescaped data in inline Script):**
|
|
13
|
+
|
|
14
|
+
```php
|
|
15
|
+
// VULNERABLE: Direct interpolation in JS
|
|
16
|
+
$username = "</script><script>alert('XSS')</script>";
|
|
17
|
+
?>
|
|
18
|
+
<script>
|
|
19
|
+
var current_user = "<?php echo $username; ?>";
|
|
20
|
+
</script>
|
|
21
|
+
<?php
|
|
22
|
+
// Result: var current_user = "</script><script>alert('XSS')</script>";
|
|
23
|
+
// The browser closes the first script tag and executes the second one!
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Correct (using json_encode):**
|
|
27
|
+
|
|
28
|
+
```php
|
|
29
|
+
$userData = [
|
|
30
|
+
'name' => $user->name,
|
|
31
|
+
'email' => $user->email,
|
|
32
|
+
'roles' => $user->getRoles()
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
// 1. Safe JSON encoding for inline script
|
|
36
|
+
?>
|
|
37
|
+
<script>
|
|
38
|
+
// json_encode automatically adds quotes and escapes dangerous characters
|
|
39
|
+
var appConfig = <?php echo json_encode($userData, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); ?>;
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<?php
|
|
43
|
+
// 2. Best Practice: Using data attributes (Recommended for SPAs/Vue/React)
|
|
44
|
+
?>
|
|
45
|
+
<div id="user-profile" data-user="<?php echo htmlspecialchars(json_encode($userData), ENT_QUOTES, 'UTF-8'); ?>">
|
|
46
|
+
<!-- JS will read this via element.dataset.user -->
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<?php
|
|
50
|
+
// 3. In Laravel Blade
|
|
51
|
+
?>
|
|
52
|
+
<script>
|
|
53
|
+
var user = @json($userData);
|
|
54
|
+
</script>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Why `json_encode`?**
|
|
58
|
+
- It handles strings, integers, booleans, and nested arrays/objects correctly for JavaScript.
|
|
59
|
+
- It escapes backslashes and quotes automatically.
|
|
60
|
+
- Using flags like `JSON_HEX_TAG` prevents `</script>` tags from breaking your own script block.
|
|
61
|
+
|
|
62
|
+
**Tools:** Laravel Blade `@json` directive, SonarQube, Manual Security Review
|