@sun-asterisk/sunlint 1.3.32 → 1.3.34
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/README.md +47 -0
- package/config/released-rules.json +62 -0
- package/config/rules/enhanced-rules-registry.json +2315 -1354
- package/core/adapters/dart-analyzer.js +658 -0
- package/core/adapters/index.js +102 -0
- package/core/adapters/sunlint-rule-adapter.js +0 -2
- package/core/adapters/typescript-analyzer.js +277 -0
- package/core/analysis-orchestrator.js +168 -40
- package/core/architecture-integration.js +220 -0
- package/core/cli-action-handler.js +72 -24
- package/core/cli-program.js +13 -1
- package/core/config-merger.js +24 -14
- package/core/constants/defaults.js +1 -2
- package/core/github-annotate-service.js +141 -89
- package/core/github-step-summary-generator.js +8 -8
- package/core/interfaces/language-analyzer.interface.js +393 -0
- package/core/output-service.js +102 -38
- package/core/rule-selection-service.js +77 -27
- package/core/scoring-service.js +65 -20
- package/core/semantic-engine-manager.js +375 -0
- package/core/semantic-engine.js +4 -57
- package/core/unified-rule-registry.js +52 -11
- package/core/upload-service.js +43 -9
- package/docs/DART_RULE_EXECUTION_FLOW.md +745 -0
- package/docs/DART_SUPPORT_IMPLEMENTATION.md +245 -0
- package/docs/SUNLINT_ARCHITECTURE.md +692 -0
- package/docs/skills/CREATE_DART_RULE.md +909 -0
- package/engines/eslint-engine.js +2 -8
- package/engines/heuristic-engine.js +234 -38
- package/package.json +6 -5
- package/rules/common/C002_no_duplicate_code/config.json +12 -20
- package/rules/common/C002_no_duplicate_code/dart/analyzer.js +53 -0
- package/rules/common/C002_no_duplicate_code/index.js +93 -0
- package/rules/common/C003_no_vague_abbreviations/config.json +1 -1
- package/rules/common/C003_no_vague_abbreviations/dart/analyzer.js +54 -0
- package/rules/common/C003_no_vague_abbreviations/index.js +93 -0
- package/rules/common/C006_function_naming/dart/analyzer.js +40 -0
- package/rules/common/C006_function_naming/index.js +86 -0
- package/rules/common/C008_variable_declaration_locality/dart/analyzer.js +32 -0
- package/rules/common/C008_variable_declaration_locality/index.js +86 -0
- package/rules/common/C010_limit_block_nesting/dart/analyzer.js +32 -0
- package/rules/common/C010_limit_block_nesting/index.js +86 -0
- package/rules/common/C012_command_query_separation/config.json +61 -0
- package/rules/common/C012_command_query_separation/dart/analyzer.js +32 -0
- package/rules/common/C012_command_query_separation/index.js +86 -0
- package/rules/common/C013_no_dead_code/dart/analyzer.js +32 -0
- package/rules/common/C013_no_dead_code/index.js +86 -0
- package/rules/common/C014_dependency_injection/dart/analyzer.js +32 -0
- package/rules/common/C014_dependency_injection/index.js +86 -0
- package/rules/common/C017_constructor_logic/dart/analyzer.js +32 -0
- package/rules/common/C017_constructor_logic/index.js +86 -0
- package/rules/common/C018_no_throw_generic_error/dart/analyzer.js +32 -0
- package/rules/common/C018_no_throw_generic_error/index.js +86 -0
- package/rules/common/C019_log_level_usage/dart/analyzer.js +32 -0
- package/rules/common/C019_log_level_usage/index.js +86 -0
- package/rules/common/C019_log_level_usage/{ts-morph-analyzer.js → typescript/ts-morph-analyzer.js} +0 -1
- package/rules/common/C020_unused_imports/dart/analyzer.js +32 -0
- package/rules/common/C020_unused_imports/index.js +86 -0
- package/rules/common/C020_unused_imports/{ts-morph-analyzer.js → typescript/ts-morph-analyzer.js} +0 -1
- package/rules/common/C021_import_organization/config.json +29 -9
- package/rules/common/C021_import_organization/dart/analyzer.js +40 -0
- package/rules/common/C021_import_organization/index.js +83 -0
- package/rules/common/C021_import_organization/{ts-morph-analyzer.js → typescript/ts-morph-analyzer.js} +0 -1
- package/rules/common/C023_no_duplicate_variable/config.json +7 -2
- package/rules/common/C023_no_duplicate_variable/dart/analyzer.js +40 -0
- package/rules/common/C023_no_duplicate_variable/index.js +83 -0
- package/rules/common/C024_no_scatter_hardcoded_constants/config.json +7 -2
- package/rules/common/C024_no_scatter_hardcoded_constants/dart/analyzer.js +40 -0
- package/rules/common/C024_no_scatter_hardcoded_constants/index.js +83 -0
- package/rules/common/C024_no_scatter_hardcoded_constants/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +19 -1
- package/rules/common/C029_catch_block_logging/config.json +15 -5
- package/rules/common/C029_catch_block_logging/dart/analyzer.js +40 -0
- package/rules/common/C029_catch_block_logging/index.js +83 -0
- package/rules/common/C030_use_custom_error_classes/config.json +28 -0
- package/rules/common/C030_use_custom_error_classes/dart/analyzer.js +40 -0
- package/rules/common/C030_use_custom_error_classes/index.js +83 -0
- package/rules/common/C031_validation_separation/config.json +28 -0
- package/rules/common/C031_validation_separation/dart/analyzer.js +40 -0
- package/rules/common/C031_validation_separation/index.js +83 -0
- package/rules/common/C033_separate_service_repository/config.json +8 -3
- package/rules/common/C033_separate_service_repository/dart/analyzer.js +40 -0
- package/rules/common/C033_separate_service_repository/index.js +83 -0
- package/rules/common/C035_error_logging_context/config.json +34 -12
- package/rules/common/C035_error_logging_context/dart/analyzer.js +40 -0
- package/rules/common/C035_error_logging_context/index.js +83 -0
- package/rules/common/C040_centralized_validation/config.json +37 -8
- package/rules/common/C040_centralized_validation/dart/analyzer.js +40 -0
- package/rules/common/C040_centralized_validation/index.js +83 -0
- package/rules/common/C041_no_sensitive_hardcode/config.json +7 -2
- package/rules/common/C041_no_sensitive_hardcode/dart/analyzer.js +40 -0
- package/rules/common/C041_no_sensitive_hardcode/index.js +83 -0
- package/rules/common/C042_boolean_name_prefix/config.json +28 -0
- package/rules/common/C042_boolean_name_prefix/dart/analyzer.js +40 -0
- package/rules/common/C042_boolean_name_prefix/index.js +83 -0
- package/rules/common/C043_no_console_or_print/config.json +28 -0
- package/rules/common/C043_no_console_or_print/dart/analyzer.js +40 -0
- package/rules/common/C043_no_console_or_print/index.js +83 -0
- package/rules/common/C047_no_duplicate_retry_logic/config.json +28 -0
- package/rules/common/C047_no_duplicate_retry_logic/dart/analyzer.js +40 -0
- package/rules/common/C047_no_duplicate_retry_logic/index.js +83 -0
- package/rules/common/C048_no_bypass_architectural_layers/config.json +7 -2
- package/rules/common/C048_no_bypass_architectural_layers/dart/analyzer.js +40 -0
- package/rules/common/C048_no_bypass_architectural_layers/index.js +83 -0
- package/rules/common/C052_parsing_or_data_transformation/config.json +7 -2
- package/rules/common/C052_parsing_or_data_transformation/dart/analyzer.js +40 -0
- package/rules/common/C052_parsing_or_data_transformation/index.js +83 -0
- package/rules/common/C060_no_override_superclass/config.json +7 -2
- package/rules/common/C060_no_override_superclass/dart/analyzer.js +40 -0
- package/rules/common/C060_no_override_superclass/index.js +83 -0
- package/rules/common/C065_one_behavior_per_test/config.json +187 -28
- package/rules/common/C065_one_behavior_per_test/dart/analyzer.js +40 -0
- package/rules/common/C065_one_behavior_per_test/index.js +83 -0
- package/rules/common/C067_no_hardcoded_config/config.json +18 -4
- package/rules/common/C067_no_hardcoded_config/dart/analyzer.js +40 -0
- package/rules/common/C067_no_hardcoded_config/index.js +83 -0
- package/rules/common/C070_no_real_time_tests/config.json +41 -12
- package/rules/common/C070_no_real_time_tests/dart/analyzer.js +40 -0
- package/rules/common/C070_no_real_time_tests/index.js +83 -0
- package/rules/common/C072_single_test_behavior/config.json +28 -0
- package/rules/common/C072_single_test_behavior/dart/analyzer.js +40 -0
- package/rules/common/C072_single_test_behavior/index.js +83 -0
- package/rules/common/C073_validate_required_config_on_startup/config.json +93 -18
- package/rules/common/C073_validate_required_config_on_startup/dart/analyzer.js +40 -0
- package/rules/common/C073_validate_required_config_on_startup/index.js +83 -0
- package/rules/common/C073_validate_required_config_on_startup/{analyzer.js → typescript/analyzer.js} +0 -1
- package/rules/common/C075_explicit_return_types/config.json +28 -0
- package/rules/common/C075_explicit_return_types/dart/analyzer.js +40 -0
- package/rules/common/C075_explicit_return_types/index.js +83 -0
- package/rules/common/C076_explicit_function_types/config.json +18 -4
- package/rules/common/C076_explicit_function_types/dart/analyzer.js +40 -0
- package/rules/common/C076_explicit_function_types/index.js +83 -0
- package/rules/index.js +26 -6
- package/rules/security/S003_open_redirect_protection/config.json +11 -53
- package/rules/security/S003_open_redirect_protection/dart/analyzer.js +43 -0
- package/rules/security/S003_open_redirect_protection/index.js +94 -0
- package/rules/security/S003_open_redirect_protection/typescript/analyzer.js +105 -0
- package/rules/security/S003_open_redirect_protection/{symbol-based-analyzer.js → typescript/semantic-analyzer.js} +1 -1
- package/rules/security/S004_sensitive_data_logging/config.json +1 -1
- package/rules/security/S004_sensitive_data_logging/dart/analyzer.js +58 -0
- package/rules/security/S004_sensitive_data_logging/index.js +93 -0
- package/rules/security/S005_no_origin_auth/dart/analyzer.js +30 -0
- package/rules/security/S005_no_origin_auth/index.js +83 -0
- package/rules/security/S005_no_origin_auth/{analyzer.js → typescript/analyzer.js} +1 -0
- package/rules/security/S006_no_plaintext_recovery_codes/dart/analyzer.js +30 -0
- package/rules/security/S006_no_plaintext_recovery_codes/index.js +83 -0
- package/rules/security/S007_no_plaintext_otp/dart/analyzer.js +30 -0
- package/rules/security/S007_no_plaintext_otp/index.js +83 -0
- package/rules/security/S009_no_insecure_encryption/dart/analyzer.js +30 -0
- package/rules/security/S009_no_insecure_encryption/index.js +83 -0
- package/rules/security/S010_no_insecure_encryption/dart/analyzer.js +30 -0
- package/rules/security/S010_no_insecure_encryption/index.js +83 -0
- package/rules/security/S011_secure_guid_generation/dart/analyzer.js +30 -0
- package/rules/security/S011_secure_guid_generation/index.js +83 -0
- package/rules/security/S012_hardcoded_secrets/dart/analyzer.js +30 -0
- package/rules/security/S012_hardcoded_secrets/index.js +83 -0
- package/rules/security/S012_hardcoded_secrets/typescript/config.json +75 -0
- package/rules/security/S013_tls_enforcement/dart/analyzer.js +30 -0
- package/rules/security/S013_tls_enforcement/index.js +83 -0
- package/rules/security/S014_tls_version_enforcement/dart/analyzer.js +30 -0
- package/rules/security/S014_tls_version_enforcement/index.js +83 -0
- package/rules/security/S015_insecure_tls_certificate/config.json +41 -0
- package/rules/security/S015_insecure_tls_certificate/dart/analyzer.js +19 -0
- package/rules/security/S015_insecure_tls_certificate/index.js +83 -0
- package/rules/security/S016_no_sensitive_querystring/dart/analyzer.js +30 -0
- package/rules/security/S016_no_sensitive_querystring/index.js +83 -0
- package/rules/security/S017_use_parameterized_queries/dart/analyzer.js +30 -0
- package/rules/security/S017_use_parameterized_queries/index.js +83 -0
- package/rules/security/S019_smtp_injection_protection/dart/analyzer.js +30 -0
- package/rules/security/S019_smtp_injection_protection/index.js +83 -0
- package/rules/security/S020_no_eval_dynamic_code/dart/analyzer.js +30 -0
- package/rules/security/S020_no_eval_dynamic_code/index.js +83 -0
- package/rules/security/S022_escape_output_context/dart/analyzer.js +30 -0
- package/rules/security/S022_escape_output_context/index.js +83 -0
- package/rules/security/S023_no_json_injection/dart/analyzer.js +30 -0
- package/rules/security/S023_no_json_injection/index.js +83 -0
- package/rules/security/S024_xpath_xxe_protection/dart/analyzer.js +30 -0
- package/rules/security/S024_xpath_xxe_protection/index.js +83 -0
- package/rules/security/S025_server_side_validation/dart/analyzer.js +30 -0
- package/rules/security/S025_server_side_validation/index.js +83 -0
- package/rules/security/S026_json_schema_validation/dart/analyzer.js +30 -0
- package/rules/security/S026_json_schema_validation/index.js +83 -0
- package/rules/security/S027_no_hardcoded_secrets/dart/analyzer.js +30 -0
- package/rules/security/S027_no_hardcoded_secrets/index.js +83 -0
- package/rules/security/S028_file_upload_size_limits/dart/analyzer.js +30 -0
- package/rules/security/S028_file_upload_size_limits/index.js +83 -0
- package/rules/security/S029_csrf_protection/dart/analyzer.js +30 -0
- package/rules/security/S029_csrf_protection/index.js +83 -0
- package/rules/security/S030_directory_browsing_protection/dart/analyzer.js +30 -0
- package/rules/security/S030_directory_browsing_protection/index.js +83 -0
- package/rules/security/S031_secure_session_cookies/dart/analyzer.js +30 -0
- package/rules/security/S031_secure_session_cookies/index.js +83 -0
- package/rules/security/S032_httponly_session_cookies/dart/analyzer.js +30 -0
- package/rules/security/S032_httponly_session_cookies/index.js +83 -0
- package/rules/security/S033_samesite_session_cookies/dart/analyzer.js +30 -0
- package/rules/security/S033_samesite_session_cookies/index.js +83 -0
- package/rules/security/S034_host_prefix_session_cookies/dart/analyzer.js +30 -0
- package/rules/security/S034_host_prefix_session_cookies/index.js +83 -0
- package/rules/security/S035_path_session_cookies/dart/analyzer.js +30 -0
- package/rules/security/S035_path_session_cookies/index.js +83 -0
- package/rules/security/S036_lfi_rfi_protection/dart/analyzer.js +30 -0
- package/rules/security/S036_lfi_rfi_protection/index.js +83 -0
- package/rules/security/S037_cache_headers/dart/analyzer.js +30 -0
- package/rules/security/S037_cache_headers/index.js +83 -0
- package/rules/security/S038_no_version_headers/dart/analyzer.js +30 -0
- package/rules/security/S038_no_version_headers/index.js +83 -0
- package/rules/security/S039_no_session_tokens_in_url/dart/analyzer.js +30 -0
- package/rules/security/S039_no_session_tokens_in_url/index.js +83 -0
- package/rules/security/S040_session_fixation_protection/dart/analyzer.js +30 -0
- package/rules/security/S040_session_fixation_protection/index.js +83 -0
- package/rules/security/S041_session_token_invalidation/dart/analyzer.js +30 -0
- package/rules/security/S041_session_token_invalidation/index.js +83 -0
- package/rules/security/S042_require_re_authentication_for_long_lived/dart/analyzer.js +30 -0
- package/rules/security/S042_require_re_authentication_for_long_lived/index.js +83 -0
- package/rules/security/S043_password_changes_invalidate_all_sessions/dart/analyzer.js +30 -0
- package/rules/security/S043_password_changes_invalidate_all_sessions/index.js +83 -0
- package/rules/security/S044_re_authentication_required/dart/analyzer.js +30 -0
- package/rules/security/S044_re_authentication_required/index.js +83 -0
- package/rules/security/S045_brute_force_protection/dart/analyzer.js +30 -0
- package/rules/security/S045_brute_force_protection/index.js +83 -0
- package/rules/security/S048_no_current_password_in_reset/dart/analyzer.js +30 -0
- package/rules/security/S048_no_current_password_in_reset/index.js +83 -0
- package/rules/security/S049_short_validity_tokens/dart/analyzer.js +30 -0
- package/rules/security/S049_short_validity_tokens/index.js +83 -0
- package/rules/security/S049_short_validity_tokens/typescript/config.json +124 -0
- package/rules/security/S051_password_length_policy/dart/analyzer.js +30 -0
- package/rules/security/S051_password_length_policy/index.js +83 -0
- package/rules/security/S051_password_length_policy/typescript/config.json +83 -0
- package/rules/security/S052_weak_otp_entropy/dart/analyzer.js +30 -0
- package/rules/security/S052_weak_otp_entropy/index.js +83 -0
- package/rules/security/S052_weak_otp_entropy/typescript/config.json +57 -0
- package/rules/security/S054_no_default_accounts/dart/analyzer.js +30 -0
- package/rules/security/S054_no_default_accounts/index.js +83 -0
- package/rules/security/S054_no_default_accounts/typescript/config.json +101 -0
- package/rules/security/S055_content_type_validation/dart/analyzer.js +30 -0
- package/rules/security/S055_content_type_validation/index.js +83 -0
- package/rules/security/S056_log_injection_protection/dart/analyzer.js +30 -0
- package/rules/security/S056_log_injection_protection/index.js +83 -0
- package/rules/security/S057_utc_logging/dart/analyzer.js +30 -0
- package/rules/security/S057_utc_logging/index.js +83 -0
- package/rules/security/S057_utc_logging/typescript/config.json +105 -0
- package/rules/security/S058_no_ssrf/dart/analyzer.js +30 -0
- package/rules/security/S058_no_ssrf/index.js +83 -0
- package/rules/security/S058_no_ssrf/{analyzer.js → typescript/analyzer.js} +0 -1
- package/rules/security/S058_no_ssrf/typescript/config.json +125 -0
- package/scripts/build-release.sh +12 -0
- package/scripts/copy-arch-detect.js +78 -0
- package/rules/common/C002_no_duplicate_code/test-cases/api-handlers.ts +0 -64
- package/rules/common/C002_no_duplicate_code/test-cases/data-processor.ts +0 -46
- package/rules/common/C002_no_duplicate_code/test-cases/good-example.tsx +0 -40
- package/rules/common/C002_no_duplicate_code/test-cases/product-service.ts +0 -57
- package/rules/common/C002_no_duplicate_code/test-cases/user-service.ts +0 -49
- package/rules/common/C067_no_hardcoded_config/symbol-based-analyzer.js.backup +0 -3853
- package/rules/security/S003_open_redirect_protection/analyzer.js +0 -135
- /package/rules/common/C002_no_duplicate_code/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C003_no_vague_abbreviations/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C006_function_naming/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/{C008 → C008_variable_declaration_locality}/config.json +0 -0
- /package/rules/common/{C008 → C008_variable_declaration_locality/typescript}/analyzer.js +0 -0
- /package/rules/common/{C008 → C008_variable_declaration_locality/typescript}/ts-morph-analyzer.js +0 -0
- /package/rules/common/C010_limit_block_nesting/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C010_limit_block_nesting/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/common/C010_limit_block_nesting/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C012_command_query_separation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C012_command_query_separation/{ast-analyzer.js → typescript/ast-analyzer.js} +0 -0
- /package/rules/common/C013_no_dead_code/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C013_no_dead_code/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/common/C013_no_dead_code/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C014_dependency_injection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C014_dependency_injection/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C017_constructor_logic/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C017_constructor_logic/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C018_no_throw_generic_error/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C018_no_throw_generic_error/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/common/C018_no_throw_generic_error/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C019_log_level_usage/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C019_log_level_usage/{pattern-analyzer.js → typescript/pattern-analyzer.js} +0 -0
- /package/rules/common/C019_log_level_usage/{system-log-analyzer.js → typescript/system-log-analyzer.js} +0 -0
- /package/rules/common/C020_unused_imports/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C021_import_organization/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C023_no_duplicate_variable/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C023_no_duplicate_variable/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C024_no_scatter_hardcoded_constants/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C029_catch_block_logging/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C030_use_custom_error_classes/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C031_validation_separation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C033_separate_service_repository/{README.md → typescript/README.md} +0 -0
- /package/rules/common/C033_separate_service_repository/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C033_separate_service_repository/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/common/C033_separate_service_repository/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C035_error_logging_context/{STRATEGY.md → typescript/STRATEGY.md} +0 -0
- /package/rules/common/C035_error_logging_context/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C035_error_logging_context/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/common/C035_error_logging_context/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C040_centralized_validation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C040_centralized_validation/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/common/C040_centralized_validation/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C041_no_sensitive_hardcode/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C041_no_sensitive_hardcode/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C042_boolean_name_prefix/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C043_no_console_or_print/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C047_no_duplicate_retry_logic/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C047_no_duplicate_retry_logic/{c047-semantic-rule.js → typescript/c047-semantic-rule.js} +0 -0
- /package/rules/common/C047_no_duplicate_retry_logic/{symbol-analyzer-enhanced.js → typescript/symbol-analyzer-enhanced.js} +0 -0
- /package/rules/common/C047_no_duplicate_retry_logic/{symbol-config.json → typescript/symbol-config.json} +0 -0
- /package/rules/common/C048_no_bypass_architectural_layers/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C048_no_bypass_architectural_layers/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C052_parsing_or_data_transformation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C052_parsing_or_data_transformation/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C060_no_override_superclass/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C060_no_override_superclass/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C065_one_behavior_per_test/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C067_no_hardcoded_config/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C067_no_hardcoded_config/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C070_no_real_time_tests/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C070_no_real_time_tests/{regex-analyzer.js → typescript/regex-analyzer.js} +0 -0
- /package/rules/common/C072_single_test_behavior/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C073_validate_required_config_on_startup/{README.md → typescript/README.md} +0 -0
- /package/rules/common/C073_validate_required_config_on_startup/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/common/C075_explicit_return_types/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C076_explicit_function_types/{README.md → typescript/README.md} +0 -0
- /package/rules/common/C076_explicit_function_types/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/common/C076_explicit_function_types/{semantic-analyzer.js → typescript/semantic-analyzer.js} +0 -0
- /package/rules/security/S003_open_redirect_protection/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S004_sensitive_data_logging/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S004_sensitive_data_logging/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S005_no_origin_auth/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S005_no_origin_auth/{ast-analyzer.js → typescript/ast-analyzer.js} +0 -0
- /package/rules/security/S005_no_origin_auth/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S006_no_plaintext_recovery_codes/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S006_no_plaintext_recovery_codes/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S006_no_plaintext_recovery_codes/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S007_no_plaintext_otp/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S007_no_plaintext_otp/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S007_no_plaintext_otp/{semantic-analyzer.js → typescript/semantic-analyzer.js} +0 -0
- /package/rules/security/S007_no_plaintext_otp/{semantic-config.json → typescript/semantic-config.json} +0 -0
- /package/rules/security/S007_no_plaintext_otp/{semantic-wrapper.js → typescript/semantic-wrapper.js} +0 -0
- /package/rules/security/S009_no_insecure_encryption/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S009_no_insecure_encryption/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S010_no_insecure_encryption/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S010_no_insecure_encryption/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S011_secure_guid_generation/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S011_secure_guid_generation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S011_secure_guid_generation/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S012_hardcoded_secrets/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S012_hardcoded_secrets/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S013_tls_enforcement/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S013_tls_enforcement/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S013_tls_enforcement/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S014_tls_version_enforcement/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S014_tls_version_enforcement/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S014_tls_version_enforcement/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S015_insecure_tls_certificate/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S015_insecure_tls_certificate/{ast-analyzer.js → typescript/ast-analyzer.js} +0 -0
- /package/rules/security/S016_no_sensitive_querystring/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S016_no_sensitive_querystring/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S016_no_sensitive_querystring/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S017_use_parameterized_queries/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S017_use_parameterized_queries/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S017_use_parameterized_queries/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S019_smtp_injection_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S019_smtp_injection_protection/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S020_no_eval_dynamic_code/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S020_no_eval_dynamic_code/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S020_no_eval_dynamic_code/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S022_escape_output_context/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S022_escape_output_context/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S023_no_json_injection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S023_no_json_injection/{ast-analyzer.js → typescript/ast-analyzer.js} +0 -0
- /package/rules/security/S024_xpath_xxe_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S024_xpath_xxe_protection/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S024_xpath_xxe_protection/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S025_server_side_validation/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S025_server_side_validation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S025_server_side_validation/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S025_server_side_validation/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S026_json_schema_validation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S027_no_hardcoded_secrets/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S027_no_hardcoded_secrets/{categories.json → typescript/categories.json} +0 -0
- /package/rules/security/S027_no_hardcoded_secrets/{categorized-analyzer.js → typescript/categorized-analyzer.js} +0 -0
- /package/rules/security/S028_file_upload_size_limits/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S028_file_upload_size_limits/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S028_file_upload_size_limits/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S029_csrf_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S030_directory_browsing_protection/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S030_directory_browsing_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S030_directory_browsing_protection/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S030_directory_browsing_protection/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S031_secure_session_cookies/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S031_secure_session_cookies/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S031_secure_session_cookies/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S032_httponly_session_cookies/{FRAMEWORK_SUPPORT.md → typescript/FRAMEWORK_SUPPORT.md} +0 -0
- /package/rules/security/S032_httponly_session_cookies/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S032_httponly_session_cookies/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S032_httponly_session_cookies/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S032_httponly_session_cookies/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S033_samesite_session_cookies/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S033_samesite_session_cookies/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S033_samesite_session_cookies/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S033_samesite_session_cookies/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S034_host_prefix_session_cookies/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S034_host_prefix_session_cookies/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S034_host_prefix_session_cookies/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S034_host_prefix_session_cookies/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S035_path_session_cookies/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S035_path_session_cookies/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S035_path_session_cookies/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S035_path_session_cookies/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S036_lfi_rfi_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S037_cache_headers/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S037_cache_headers/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S037_cache_headers/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S037_cache_headers/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S038_no_version_headers/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S038_no_version_headers/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S038_no_version_headers/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S038_no_version_headers/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S039_no_session_tokens_in_url/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S039_no_session_tokens_in_url/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S039_no_session_tokens_in_url/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S039_no_session_tokens_in_url/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S040_session_fixation_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S041_session_token_invalidation/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S041_session_token_invalidation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S041_session_token_invalidation/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S041_session_token_invalidation/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S042_require_re_authentication_for_long_lived/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S042_require_re_authentication_for_long_lived/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S042_require_re_authentication_for_long_lived/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S043_password_changes_invalidate_all_sessions/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S043_password_changes_invalidate_all_sessions/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S043_password_changes_invalidate_all_sessions/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S044_re_authentication_required/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S044_re_authentication_required/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S044_re_authentication_required/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S044_re_authentication_required/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S045_brute_force_protection/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S045_brute_force_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S045_brute_force_protection/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S048_no_current_password_in_reset/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S048_no_current_password_in_reset/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S049_short_validity_tokens/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S049_short_validity_tokens/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S049_short_validity_tokens/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S051_password_length_policy/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S052_weak_otp_entropy/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S054_no_default_accounts/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S054_no_default_accounts/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S055_content_type_validation/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S055_content_type_validation/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S055_content_type_validation/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S056_log_injection_protection/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S056_log_injection_protection/{regex-based-analyzer.js → typescript/regex-based-analyzer.js} +0 -0
- /package/rules/security/S056_log_injection_protection/{symbol-based-analyzer.js → typescript/symbol-based-analyzer.js} +0 -0
- /package/rules/security/S057_utc_logging/{README.md → typescript/README.md} +0 -0
- /package/rules/security/S057_utc_logging/{analyzer.js → typescript/analyzer.js} +0 -0
- /package/rules/security/S058_no_ssrf/{README.md → typescript/README.md} +0 -0
|
@@ -1,66 +1,88 @@
|
|
|
1
1
|
{
|
|
2
2
|
"rules": {
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
3
|
+
"C002": {
|
|
4
|
+
"id": "C002",
|
|
5
|
+
"name": "Rule C002",
|
|
6
|
+
"description": "Auto-migrated rule C002 from ESLint mapping",
|
|
7
|
+
"category": "general",
|
|
7
8
|
"severity": "warning",
|
|
8
|
-
"languages": [
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
"languages": [
|
|
10
|
+
"typescript",
|
|
11
|
+
"javascript",
|
|
12
|
+
"dart"
|
|
13
|
+
],
|
|
11
14
|
"version": "1.0.0",
|
|
12
|
-
"status": "
|
|
13
|
-
"tags": [
|
|
15
|
+
"status": "migrated",
|
|
16
|
+
"tags": [
|
|
17
|
+
"migrated"
|
|
18
|
+
],
|
|
14
19
|
"engineMappings": {
|
|
15
|
-
"eslint": [
|
|
20
|
+
"eslint": [
|
|
21
|
+
"custom/no-duplicate-code"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"strategy": {
|
|
25
|
+
"preferred": "regex",
|
|
26
|
+
"fallbacks": [
|
|
27
|
+
"regex"
|
|
28
|
+
],
|
|
29
|
+
"accuracy": {}
|
|
16
30
|
}
|
|
17
31
|
},
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
32
|
+
"C003": {
|
|
33
|
+
"id": "C003",
|
|
34
|
+
"name": "Rule C003",
|
|
35
|
+
"description": "Auto-migrated rule C003 from ESLint mapping",
|
|
36
|
+
"category": "general",
|
|
22
37
|
"severity": "warning",
|
|
23
|
-
"languages": [
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
"languages": [
|
|
39
|
+
"typescript",
|
|
40
|
+
"javascript",
|
|
41
|
+
"dart"
|
|
42
|
+
],
|
|
26
43
|
"version": "1.0.0",
|
|
27
|
-
"status": "
|
|
28
|
-
"tags": [
|
|
44
|
+
"status": "migrated",
|
|
45
|
+
"tags": [
|
|
46
|
+
"migrated"
|
|
47
|
+
],
|
|
29
48
|
"engineMappings": {
|
|
30
|
-
"eslint": [
|
|
31
|
-
|
|
49
|
+
"eslint": [
|
|
50
|
+
"custom/no-vague-abbreviations"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"strategy": {
|
|
54
|
+
"preferred": "regex",
|
|
55
|
+
"fallbacks": [
|
|
56
|
+
"regex"
|
|
57
|
+
],
|
|
58
|
+
"accuracy": {}
|
|
32
59
|
}
|
|
33
60
|
},
|
|
34
|
-
"
|
|
35
|
-
"name": "
|
|
36
|
-
"description": "
|
|
37
|
-
"category": "
|
|
61
|
+
"C005": {
|
|
62
|
+
"name": "Single Responsibility Principle",
|
|
63
|
+
"description": "Each function should do one thing only",
|
|
64
|
+
"category": "design",
|
|
38
65
|
"severity": "warning",
|
|
39
|
-
"languages": [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
"heuristic": ["rules/common/C020_unused_imports/analyzer.js"]
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
"C021": {
|
|
51
|
-
"name": "Import Organization",
|
|
52
|
-
"description": "Tổ chức và sắp xếp imports theo nhóm và thứ tự alphabet",
|
|
53
|
-
"category": "code-quality",
|
|
54
|
-
"severity": "info",
|
|
55
|
-
"languages": ["typescript", "javascript"],
|
|
56
|
-
"analyzer": "./rules/common/C021_import_organization/analyzer.js",
|
|
57
|
-
"config": "./rules/common/C021_import_organization/config.json",
|
|
66
|
+
"languages": [
|
|
67
|
+
"typescript",
|
|
68
|
+
"javascript",
|
|
69
|
+
"dart",
|
|
70
|
+
"kotlin"
|
|
71
|
+
],
|
|
72
|
+
"analyzer": "./rules/common/C005_single_responsibility/analyzer.js",
|
|
73
|
+
"config": "./rules/common/C005_single_responsibility/config.json",
|
|
58
74
|
"version": "1.0.0",
|
|
59
75
|
"status": "stable",
|
|
60
|
-
"tags": [
|
|
76
|
+
"tags": [
|
|
77
|
+
"design",
|
|
78
|
+
"responsibility",
|
|
79
|
+
"maintainability"
|
|
80
|
+
],
|
|
61
81
|
"engineMappings": {
|
|
62
|
-
"eslint": [
|
|
63
|
-
|
|
82
|
+
"eslint": [
|
|
83
|
+
"max-statements-per-line",
|
|
84
|
+
"complexity"
|
|
85
|
+
]
|
|
64
86
|
}
|
|
65
87
|
},
|
|
66
88
|
"C006": {
|
|
@@ -68,12 +90,21 @@
|
|
|
68
90
|
"description": "Tên hàm phải là động từ/verb-noun pattern",
|
|
69
91
|
"category": "naming",
|
|
70
92
|
"severity": "warning",
|
|
71
|
-
"languages": [
|
|
93
|
+
"languages": [
|
|
94
|
+
"typescript",
|
|
95
|
+
"dart",
|
|
96
|
+
"kotlin",
|
|
97
|
+
"javascript"
|
|
98
|
+
],
|
|
72
99
|
"analyzer": "./rules/C006_function_naming/analyzer.js",
|
|
73
100
|
"config": "./rules/C006_function_naming/config.json",
|
|
74
101
|
"version": "1.0.0",
|
|
75
102
|
"status": "activated",
|
|
76
|
-
"tags": [
|
|
103
|
+
"tags": [
|
|
104
|
+
"naming",
|
|
105
|
+
"convention",
|
|
106
|
+
"readability"
|
|
107
|
+
],
|
|
77
108
|
"engineMappings": {
|
|
78
109
|
"eslint": [
|
|
79
110
|
"func-names",
|
|
@@ -87,12 +118,21 @@
|
|
|
87
118
|
"description": "Avoid comments that just describe the code",
|
|
88
119
|
"category": "documentation",
|
|
89
120
|
"severity": "info",
|
|
90
|
-
"languages": [
|
|
121
|
+
"languages": [
|
|
122
|
+
"typescript",
|
|
123
|
+
"javascript",
|
|
124
|
+
"dart",
|
|
125
|
+
"kotlin"
|
|
126
|
+
],
|
|
91
127
|
"analyzer": "./rules/common/C007_meaningful_comments/analyzer.js",
|
|
92
128
|
"config": "./rules/common/C007_meaningful_comments/config.json",
|
|
93
129
|
"version": "1.0.0",
|
|
94
130
|
"status": "stable",
|
|
95
|
-
"tags": [
|
|
131
|
+
"tags": [
|
|
132
|
+
"documentation",
|
|
133
|
+
"comments",
|
|
134
|
+
"maintainability"
|
|
135
|
+
],
|
|
96
136
|
"engineMappings": {
|
|
97
137
|
"eslint": [
|
|
98
138
|
"spaced-comment",
|
|
@@ -106,22 +146,36 @@
|
|
|
106
146
|
"description": "Variables should be declared as close as possible to where they are first used",
|
|
107
147
|
"category": "code-quality",
|
|
108
148
|
"severity": "warning",
|
|
109
|
-
"languages": [
|
|
110
|
-
|
|
111
|
-
|
|
149
|
+
"languages": [
|
|
150
|
+
"typescript",
|
|
151
|
+
"javascript",
|
|
152
|
+
"dart"
|
|
153
|
+
],
|
|
154
|
+
"analyzer": "rules/common/C008_variable_declaration_locality/analyzer.js",
|
|
155
|
+
"config": "rules/common/C008_variable_declaration_locality/config.json",
|
|
112
156
|
"version": "1.0.0",
|
|
113
157
|
"status": "active",
|
|
114
|
-
"tags": [
|
|
158
|
+
"tags": [
|
|
159
|
+
"readability",
|
|
160
|
+
"maintainability",
|
|
161
|
+
"scope",
|
|
162
|
+
"best-practice"
|
|
163
|
+
],
|
|
115
164
|
"strategy": {
|
|
116
165
|
"preferred": "semantic",
|
|
117
|
-
"fallbacks": [
|
|
166
|
+
"fallbacks": [
|
|
167
|
+
"semantic",
|
|
168
|
+
"ast"
|
|
169
|
+
],
|
|
118
170
|
"accuracy": {
|
|
119
171
|
"semantic": 95,
|
|
120
172
|
"ast": 90
|
|
121
173
|
}
|
|
122
174
|
},
|
|
123
175
|
"engineMappings": {
|
|
124
|
-
"semantic": [
|
|
176
|
+
"semantic": [
|
|
177
|
+
"rules/common/C008_variable_declaration_locality/analyzer.js"
|
|
178
|
+
]
|
|
125
179
|
}
|
|
126
180
|
},
|
|
127
181
|
"C010": {
|
|
@@ -129,27 +183,73 @@
|
|
|
129
183
|
"description": "Limit nested blocks (if/for/while/switch) to maximum 3 levels for readability",
|
|
130
184
|
"category": "complexity",
|
|
131
185
|
"severity": "warning",
|
|
132
|
-
"languages": [
|
|
186
|
+
"languages": [
|
|
187
|
+
"typescript",
|
|
188
|
+
"javascript",
|
|
189
|
+
"dart",
|
|
190
|
+
"kotlin"
|
|
191
|
+
],
|
|
133
192
|
"analyzer": "./rules/common/C010_limit_block_nesting/analyzer.js",
|
|
134
193
|
"config": "./rules/common/C010_limit_block_nesting/config.json",
|
|
135
194
|
"version": "1.0.0",
|
|
136
195
|
"status": "stable",
|
|
137
|
-
"tags": [
|
|
196
|
+
"tags": [
|
|
197
|
+
"complexity",
|
|
198
|
+
"readability",
|
|
199
|
+
"nesting",
|
|
200
|
+
"maintainability"
|
|
201
|
+
],
|
|
138
202
|
"strategy": {
|
|
139
203
|
"preferred": "ast",
|
|
140
|
-
"fallbacks": [
|
|
204
|
+
"fallbacks": [
|
|
205
|
+
"ast",
|
|
206
|
+
"regex"
|
|
207
|
+
],
|
|
141
208
|
"accuracy": {
|
|
142
209
|
"ast": 95,
|
|
143
210
|
"regex": 75
|
|
144
211
|
}
|
|
145
212
|
}
|
|
146
213
|
},
|
|
214
|
+
"C012": {
|
|
215
|
+
"name": "Command Query Separation",
|
|
216
|
+
"description": "Separate Command and Query operations (CQS principle)",
|
|
217
|
+
"category": "design",
|
|
218
|
+
"severity": "warning",
|
|
219
|
+
"languages": [
|
|
220
|
+
"typescript",
|
|
221
|
+
"javascript",
|
|
222
|
+
"dart",
|
|
223
|
+
"kotlin"
|
|
224
|
+
],
|
|
225
|
+
"analyzer": "./rules/common/C012_command_query_separation/analyzer.js",
|
|
226
|
+
"config": "./rules/common/C012_command_query_separation/config.json",
|
|
227
|
+
"version": "1.0.0",
|
|
228
|
+
"status": "stable",
|
|
229
|
+
"tags": [
|
|
230
|
+
"design",
|
|
231
|
+
"separation",
|
|
232
|
+
"maintainability"
|
|
233
|
+
],
|
|
234
|
+
"engineMappings": {
|
|
235
|
+
"eslint": [
|
|
236
|
+
"consistent-return",
|
|
237
|
+
"no-void",
|
|
238
|
+
"@typescript-eslint/no-confusing-void-expression"
|
|
239
|
+
]
|
|
240
|
+
}
|
|
241
|
+
},
|
|
147
242
|
"C013": {
|
|
148
243
|
"name": "No Dead Code",
|
|
149
244
|
"description": "Detect and remove commented out code, unused variables/functions, and unreachable code",
|
|
150
245
|
"category": "maintainability",
|
|
151
246
|
"severity": "warning",
|
|
152
|
-
"languages": [
|
|
247
|
+
"languages": [
|
|
248
|
+
"typescript",
|
|
249
|
+
"javascript",
|
|
250
|
+
"dart",
|
|
251
|
+
"kotlin"
|
|
252
|
+
],
|
|
153
253
|
"analyzer": "./rules/common/C013_no_dead_code/analyzer.js",
|
|
154
254
|
"config": "./rules/common/C013_no_dead_code/config.json",
|
|
155
255
|
"version": "1.0.0",
|
|
@@ -163,32 +263,62 @@
|
|
|
163
263
|
],
|
|
164
264
|
"strategy": {
|
|
165
265
|
"preferred": "ast",
|
|
166
|
-
"fallbacks": [
|
|
266
|
+
"fallbacks": [
|
|
267
|
+
"ast",
|
|
268
|
+
"regex"
|
|
269
|
+
],
|
|
167
270
|
"accuracy": {
|
|
168
271
|
"ast": 90,
|
|
169
272
|
"regex": 70
|
|
170
273
|
}
|
|
171
274
|
},
|
|
172
275
|
"engineMappings": {
|
|
173
|
-
"eslint": [
|
|
276
|
+
"eslint": [
|
|
277
|
+
"no-unreachable",
|
|
278
|
+
"no-unused-vars",
|
|
279
|
+
"no-unused-expressions"
|
|
280
|
+
]
|
|
174
281
|
}
|
|
175
282
|
},
|
|
176
|
-
"
|
|
177
|
-
"name": "
|
|
178
|
-
"description": "
|
|
283
|
+
"C014": {
|
|
284
|
+
"name": "Dependency Injection Pattern",
|
|
285
|
+
"description": "Use Dependency Injection instead of direct instantiation in business logic. Increases testability and reduces coupling.",
|
|
179
286
|
"category": "design",
|
|
180
287
|
"severity": "warning",
|
|
181
|
-
"languages": [
|
|
182
|
-
|
|
183
|
-
|
|
288
|
+
"languages": [
|
|
289
|
+
"typescript",
|
|
290
|
+
"javascript",
|
|
291
|
+
"dart"
|
|
292
|
+
],
|
|
293
|
+
"analyzer": "./rules/common/C014_dependency_injection/analyzer.js",
|
|
294
|
+
"config": "./rules/common/C014_dependency_injection/config.json",
|
|
184
295
|
"version": "1.0.0",
|
|
185
296
|
"status": "stable",
|
|
186
|
-
"tags": [
|
|
297
|
+
"tags": [
|
|
298
|
+
"design",
|
|
299
|
+
"dependency-injection",
|
|
300
|
+
"testability",
|
|
301
|
+
"coupling",
|
|
302
|
+
"SOLID"
|
|
303
|
+
],
|
|
304
|
+
"strategy": {
|
|
305
|
+
"preferred": "ast",
|
|
306
|
+
"fallbacks": [],
|
|
307
|
+
"accuracy": {
|
|
308
|
+
"ast": 95
|
|
309
|
+
},
|
|
310
|
+
"requirements": {
|
|
311
|
+
"ast": {
|
|
312
|
+
"semanticEngine": true,
|
|
313
|
+
"description": "C014 requires symbol-based analysis for accurate dependency injection pattern detection"
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
},
|
|
187
317
|
"engineMappings": {
|
|
188
318
|
"eslint": [
|
|
189
|
-
"
|
|
190
|
-
"no-
|
|
191
|
-
"@typescript-eslint/no-
|
|
319
|
+
"no-new",
|
|
320
|
+
"no-new-wrappers",
|
|
321
|
+
"@typescript-eslint/no-unnecessary-constructor"
|
|
192
322
|
]
|
|
193
323
|
}
|
|
194
324
|
},
|
|
@@ -197,14 +327,63 @@
|
|
|
197
327
|
"description": "Use domain language in class/function names",
|
|
198
328
|
"category": "naming",
|
|
199
329
|
"severity": "warning",
|
|
200
|
-
"languages": [
|
|
330
|
+
"languages": [
|
|
331
|
+
"typescript",
|
|
332
|
+
"javascript",
|
|
333
|
+
"dart",
|
|
334
|
+
"kotlin"
|
|
335
|
+
],
|
|
201
336
|
"analyzer": "./rules/common/C015_domain_language/analyzer.js",
|
|
202
337
|
"config": "./rules/common/C015_domain_language/config.json",
|
|
203
338
|
"version": "1.0.0",
|
|
204
339
|
"status": "stable",
|
|
205
|
-
"tags": [
|
|
340
|
+
"tags": [
|
|
341
|
+
"naming",
|
|
342
|
+
"domain",
|
|
343
|
+
"readability"
|
|
344
|
+
],
|
|
345
|
+
"engineMappings": {
|
|
346
|
+
"eslint": [
|
|
347
|
+
"@typescript-eslint/naming-convention",
|
|
348
|
+
"camelcase"
|
|
349
|
+
]
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
"C017": {
|
|
353
|
+
"id": "C017",
|
|
354
|
+
"name": "Rule C017",
|
|
355
|
+
"description": "Auto-migrated rule C017 from ESLint mapping",
|
|
356
|
+
"category": "general",
|
|
357
|
+
"severity": "warning",
|
|
358
|
+
"languages": [
|
|
359
|
+
"typescript",
|
|
360
|
+
"javascript",
|
|
361
|
+
"dart"
|
|
362
|
+
],
|
|
363
|
+
"analyzer": "./rules/common/C017_constructor_logic/analyzer.js",
|
|
364
|
+
"config": "./rules/common/C017_constructor_logic/config.json",
|
|
365
|
+
"version": "1.0.0",
|
|
366
|
+
"status": "migrated",
|
|
367
|
+
"tags": [
|
|
368
|
+
"migrated"
|
|
369
|
+
],
|
|
206
370
|
"engineMappings": {
|
|
207
|
-
"eslint": [
|
|
371
|
+
"eslint": [
|
|
372
|
+
"custom/limit-constructor-logic"
|
|
373
|
+
]
|
|
374
|
+
},
|
|
375
|
+
"strategy": {
|
|
376
|
+
"preferred": "semantic",
|
|
377
|
+
"fallbacks": [
|
|
378
|
+
"semantic",
|
|
379
|
+
"ast",
|
|
380
|
+
"regex"
|
|
381
|
+
],
|
|
382
|
+
"accuracy": {
|
|
383
|
+
"semantic": 95,
|
|
384
|
+
"ast": 85,
|
|
385
|
+
"regex": 70
|
|
386
|
+
}
|
|
208
387
|
}
|
|
209
388
|
},
|
|
210
389
|
"C018": {
|
|
@@ -212,29 +391,141 @@
|
|
|
212
391
|
"description": "Always provide detailed messages and context.",
|
|
213
392
|
"category": "naming",
|
|
214
393
|
"severity": "warning",
|
|
215
|
-
"languages": [
|
|
394
|
+
"languages": [
|
|
395
|
+
"typescript",
|
|
396
|
+
"javascript",
|
|
397
|
+
"dart",
|
|
398
|
+
"kotlin"
|
|
399
|
+
],
|
|
216
400
|
"analyzer": "./rules/common/C018_no_throw_generic_error/analyzer.js",
|
|
217
401
|
"config": "./rules/common/C018_no_throw_generic_error/config.json",
|
|
218
402
|
"version": "1.0.0",
|
|
219
403
|
"status": "stable",
|
|
220
|
-
"tags": [
|
|
404
|
+
"tags": [
|
|
405
|
+
"naming",
|
|
406
|
+
"domain",
|
|
407
|
+
"readability"
|
|
408
|
+
],
|
|
221
409
|
"engineMappings": {
|
|
222
|
-
"eslint": [
|
|
410
|
+
"eslint": [
|
|
411
|
+
"@typescript-eslint/naming-convention",
|
|
412
|
+
"camelcase"
|
|
413
|
+
]
|
|
223
414
|
}
|
|
224
415
|
},
|
|
225
|
-
"
|
|
226
|
-
"name": "
|
|
227
|
-
"description": "
|
|
228
|
-
"category": "
|
|
416
|
+
"C019": {
|
|
417
|
+
"name": "Log Level Usage",
|
|
418
|
+
"description": "Không sử dụng log mức error cho lỗi không nghiêm trọng",
|
|
419
|
+
"category": "logging",
|
|
229
420
|
"severity": "warning",
|
|
230
|
-
"languages": [
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
"
|
|
237
|
-
|
|
421
|
+
"languages": [
|
|
422
|
+
"typescript",
|
|
423
|
+
"dart",
|
|
424
|
+
"kotlin",
|
|
425
|
+
"javascript"
|
|
426
|
+
],
|
|
427
|
+
"analyzer": "./rules/common/C019_log_level_usage/analyzer.js",
|
|
428
|
+
"config": "./rules/common/C019_log_level_usage/config.json",
|
|
429
|
+
"version": "1.0.0",
|
|
430
|
+
"status": "stable",
|
|
431
|
+
"tags": [
|
|
432
|
+
"logging",
|
|
433
|
+
"error-handling",
|
|
434
|
+
"severity"
|
|
435
|
+
],
|
|
436
|
+
"engineMappings": {
|
|
437
|
+
"eslint": [
|
|
438
|
+
"no-console",
|
|
439
|
+
"no-alert",
|
|
440
|
+
"no-debugger"
|
|
441
|
+
],
|
|
442
|
+
"heuristic": [
|
|
443
|
+
"rules/common/C019_log_level_usage/analyzer.js"
|
|
444
|
+
]
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
"C020": {
|
|
448
|
+
"name": "Unused Imports",
|
|
449
|
+
"description": "Không import các module hoặc symbol không sử dụng",
|
|
450
|
+
"category": "code-quality",
|
|
451
|
+
"severity": "warning",
|
|
452
|
+
"languages": [
|
|
453
|
+
"typescript",
|
|
454
|
+
"javascript",
|
|
455
|
+
"dart"
|
|
456
|
+
],
|
|
457
|
+
"analyzer": "./rules/common/C020_unused_imports/analyzer.js",
|
|
458
|
+
"config": "./rules/common/C020_unused_imports/config.json",
|
|
459
|
+
"version": "1.0.0",
|
|
460
|
+
"status": "stable",
|
|
461
|
+
"tags": [
|
|
462
|
+
"imports",
|
|
463
|
+
"cleanup",
|
|
464
|
+
"unused-code"
|
|
465
|
+
],
|
|
466
|
+
"engineMappings": {
|
|
467
|
+
"eslint": [
|
|
468
|
+
"no-unused-vars",
|
|
469
|
+
"@typescript-eslint/no-unused-vars"
|
|
470
|
+
],
|
|
471
|
+
"heuristic": [
|
|
472
|
+
"rules/common/C020_unused_imports/analyzer.js"
|
|
473
|
+
]
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
"C021": {
|
|
477
|
+
"name": "Import Organization",
|
|
478
|
+
"description": "Tổ chức và sắp xếp imports theo nhóm và thứ tự alphabet",
|
|
479
|
+
"category": "code-quality",
|
|
480
|
+
"severity": "info",
|
|
481
|
+
"languages": [
|
|
482
|
+
"typescript",
|
|
483
|
+
"javascript"
|
|
484
|
+
],
|
|
485
|
+
"analyzer": "./rules/common/C021_import_organization/analyzer.js",
|
|
486
|
+
"config": "./rules/common/C021_import_organization/config.json",
|
|
487
|
+
"version": "1.0.0",
|
|
488
|
+
"status": "stable",
|
|
489
|
+
"tags": [
|
|
490
|
+
"imports",
|
|
491
|
+
"organization",
|
|
492
|
+
"readability"
|
|
493
|
+
],
|
|
494
|
+
"engineMappings": {
|
|
495
|
+
"eslint": [
|
|
496
|
+
"import/order",
|
|
497
|
+
"sort-imports"
|
|
498
|
+
],
|
|
499
|
+
"heuristic": [
|
|
500
|
+
"rules/common/C021_import_organization/analyzer.js"
|
|
501
|
+
]
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
"C023": {
|
|
505
|
+
"name": "Do not declare duplicate variable",
|
|
506
|
+
"description": "Do not declare duplicate variable names in the same scope",
|
|
507
|
+
"category": "naming",
|
|
508
|
+
"severity": "warning",
|
|
509
|
+
"languages": [
|
|
510
|
+
"typescript",
|
|
511
|
+
"javascript",
|
|
512
|
+
"dart",
|
|
513
|
+
"kotlin"
|
|
514
|
+
],
|
|
515
|
+
"analyzer": "./rules/common/C023_no_duplicate_variable/analyzer.js",
|
|
516
|
+
"config": "./rules/common/C023_no_duplicate_variable/config.json",
|
|
517
|
+
"version": "1.0.0",
|
|
518
|
+
"status": "stable",
|
|
519
|
+
"tags": [
|
|
520
|
+
"naming",
|
|
521
|
+
"domain",
|
|
522
|
+
"readability"
|
|
523
|
+
],
|
|
524
|
+
"engineMappings": {
|
|
525
|
+
"eslint": [
|
|
526
|
+
"@typescript-eslint/naming-convention",
|
|
527
|
+
"camelcase"
|
|
528
|
+
]
|
|
238
529
|
}
|
|
239
530
|
},
|
|
240
531
|
"C024": {
|
|
@@ -242,14 +533,26 @@
|
|
|
242
533
|
"description": "The rule prevents scattering hardcoded constants throughout the logic. Instead, constants should be defined in a single place to improve maintainability and readability.",
|
|
243
534
|
"category": "naming",
|
|
244
535
|
"severity": "warning",
|
|
245
|
-
"languages": [
|
|
536
|
+
"languages": [
|
|
537
|
+
"typescript",
|
|
538
|
+
"javascript",
|
|
539
|
+
"dart",
|
|
540
|
+
"kotlin"
|
|
541
|
+
],
|
|
246
542
|
"analyzer": "./rules/common/C024_no_scatter_hardcoded_constants/analyzer.js",
|
|
247
543
|
"config": "./rules/common/C024_no_scatter_hardcoded_constants/config.json",
|
|
248
544
|
"version": "1.0.0",
|
|
249
545
|
"status": "stable",
|
|
250
|
-
"tags": [
|
|
546
|
+
"tags": [
|
|
547
|
+
"naming",
|
|
548
|
+
"domain",
|
|
549
|
+
"readability"
|
|
550
|
+
],
|
|
251
551
|
"engineMappings": {
|
|
252
|
-
"eslint": [
|
|
552
|
+
"eslint": [
|
|
553
|
+
"@typescript-eslint/naming-convention",
|
|
554
|
+
"camelcase"
|
|
555
|
+
]
|
|
253
556
|
}
|
|
254
557
|
},
|
|
255
558
|
"C029": {
|
|
@@ -257,24 +560,71 @@
|
|
|
257
560
|
"description": "Mọi catch block phải log nguyên nhân lỗi đầy đủ",
|
|
258
561
|
"category": "error-handling",
|
|
259
562
|
"severity": "error",
|
|
260
|
-
"languages": [
|
|
563
|
+
"languages": [
|
|
564
|
+
"typescript",
|
|
565
|
+
"dart",
|
|
566
|
+
"kotlin",
|
|
567
|
+
"javascript"
|
|
568
|
+
],
|
|
261
569
|
"analyzer": "./rules/C029_catch_block_logging/analyzer.js",
|
|
262
570
|
"config": "./rules/C029_catch_block_logging/config.json",
|
|
263
571
|
"version": "1.0.0",
|
|
264
572
|
"status": "activated",
|
|
265
|
-
"tags": [
|
|
573
|
+
"tags": [
|
|
574
|
+
"error-handling",
|
|
575
|
+
"logging",
|
|
576
|
+
"debugging",
|
|
577
|
+
"monitoring"
|
|
578
|
+
]
|
|
579
|
+
},
|
|
580
|
+
"C030": {
|
|
581
|
+
"id": "C030",
|
|
582
|
+
"name": "Rule C030",
|
|
583
|
+
"description": "Auto-migrated rule C030 from ESLint mapping",
|
|
584
|
+
"category": "general",
|
|
585
|
+
"severity": "warning",
|
|
586
|
+
"languages": [
|
|
587
|
+
"typescript",
|
|
588
|
+
"javascript"
|
|
589
|
+
],
|
|
590
|
+
"version": "1.0.0",
|
|
591
|
+
"status": "migrated",
|
|
592
|
+
"tags": [
|
|
593
|
+
"migrated"
|
|
594
|
+
],
|
|
595
|
+
"engineMappings": {
|
|
596
|
+
"eslint": [
|
|
597
|
+
"custom/use-custom-error-classes"
|
|
598
|
+
]
|
|
599
|
+
},
|
|
600
|
+
"strategy": {
|
|
601
|
+
"preferred": "regex",
|
|
602
|
+
"fallbacks": [
|
|
603
|
+
"regex"
|
|
604
|
+
],
|
|
605
|
+
"accuracy": {}
|
|
606
|
+
}
|
|
266
607
|
},
|
|
267
608
|
"C031": {
|
|
268
609
|
"name": "Validation Logic Separation",
|
|
269
610
|
"description": "Logic kiểm tra dữ liệu (validate) phải nằm riêng biệt",
|
|
270
611
|
"category": "validation",
|
|
271
612
|
"severity": "error",
|
|
272
|
-
"languages": [
|
|
613
|
+
"languages": [
|
|
614
|
+
"typescript",
|
|
615
|
+
"dart",
|
|
616
|
+
"kotlin",
|
|
617
|
+
"javascript"
|
|
618
|
+
],
|
|
273
619
|
"analyzer": "./rules/C031_validation_separation/analyzer.js",
|
|
274
620
|
"config": "./rules/C031_validation_separation/config.json",
|
|
275
621
|
"version": "1.0.0",
|
|
276
622
|
"status": "experimental",
|
|
277
|
-
"tags": [
|
|
623
|
+
"tags": [
|
|
624
|
+
"validation",
|
|
625
|
+
"separation",
|
|
626
|
+
"architecture"
|
|
627
|
+
],
|
|
278
628
|
"engineMappings": {
|
|
279
629
|
"eslint": [
|
|
280
630
|
"no-implicit-coercion",
|
|
@@ -288,12 +638,21 @@
|
|
|
288
638
|
"description": "Don't call external APIs in constructors or static blocks",
|
|
289
639
|
"category": "design",
|
|
290
640
|
"severity": "error",
|
|
291
|
-
"languages": [
|
|
641
|
+
"languages": [
|
|
642
|
+
"typescript",
|
|
643
|
+
"javascript",
|
|
644
|
+
"dart",
|
|
645
|
+
"kotlin"
|
|
646
|
+
],
|
|
292
647
|
"analyzer": "./rules/common/C032_no_constructor_api/analyzer.js",
|
|
293
648
|
"config": "./rules/common/C032_no_constructor_api/config.json",
|
|
294
649
|
"version": "1.0.0",
|
|
295
650
|
"status": "stable",
|
|
296
|
-
"tags": [
|
|
651
|
+
"tags": [
|
|
652
|
+
"design",
|
|
653
|
+
"constructor",
|
|
654
|
+
"initialization"
|
|
655
|
+
],
|
|
297
656
|
"engineMappings": {
|
|
298
657
|
"eslint": [
|
|
299
658
|
"no-new",
|
|
@@ -307,12 +666,21 @@
|
|
|
307
666
|
"description": "Separate processing logic and data queries in service layer",
|
|
308
667
|
"category": "architecture",
|
|
309
668
|
"severity": "warning",
|
|
310
|
-
"languages": [
|
|
669
|
+
"languages": [
|
|
670
|
+
"typescript",
|
|
671
|
+
"javascript",
|
|
672
|
+
"dart",
|
|
673
|
+
"kotlin"
|
|
674
|
+
],
|
|
311
675
|
"analyzer": "./rules/common/C033_separate_logic_data/analyzer.js",
|
|
312
676
|
"config": "./rules/common/C033_separate_logic_data/config.json",
|
|
313
677
|
"version": "1.0.0",
|
|
314
678
|
"status": "stable",
|
|
315
|
-
"tags": [
|
|
679
|
+
"tags": [
|
|
680
|
+
"architecture",
|
|
681
|
+
"separation",
|
|
682
|
+
"service"
|
|
683
|
+
],
|
|
316
684
|
"engineMappings": {
|
|
317
685
|
"eslint": [
|
|
318
686
|
"prefer-const",
|
|
@@ -326,12 +694,21 @@
|
|
|
326
694
|
"description": "Limit direct access to global state in domain logic",
|
|
327
695
|
"category": "architecture",
|
|
328
696
|
"severity": "warning",
|
|
329
|
-
"languages": [
|
|
697
|
+
"languages": [
|
|
698
|
+
"typescript",
|
|
699
|
+
"javascript",
|
|
700
|
+
"dart",
|
|
701
|
+
"kotlin"
|
|
702
|
+
],
|
|
330
703
|
"analyzer": "./rules/common/C034_limit_global_state/analyzer.js",
|
|
331
704
|
"config": "./rules/common/C034_limit_global_state/config.json",
|
|
332
705
|
"version": "1.0.0",
|
|
333
706
|
"status": "stable",
|
|
334
|
-
"tags": [
|
|
707
|
+
"tags": [
|
|
708
|
+
"architecture",
|
|
709
|
+
"global-state",
|
|
710
|
+
"design"
|
|
711
|
+
],
|
|
335
712
|
"engineMappings": {
|
|
336
713
|
"eslint": [
|
|
337
714
|
"no-global-assign",
|
|
@@ -345,14 +722,27 @@
|
|
|
345
722
|
"description": "When handling errors, must log full information related - structured logging with context",
|
|
346
723
|
"category": "error-handling",
|
|
347
724
|
"severity": "warning",
|
|
348
|
-
"languages": [
|
|
725
|
+
"languages": [
|
|
726
|
+
"typescript",
|
|
727
|
+
"javascript",
|
|
728
|
+
"dart",
|
|
729
|
+
"kotlin"
|
|
730
|
+
],
|
|
349
731
|
"analyzer": "./rules/common/C035_error_logging_context/analyzer.js",
|
|
350
732
|
"config": "./rules/common/C035_error_logging_context/config.json",
|
|
351
733
|
"version": "1.0.0",
|
|
352
734
|
"status": "stable",
|
|
353
|
-
"tags": [
|
|
735
|
+
"tags": [
|
|
736
|
+
"logging",
|
|
737
|
+
"error-handling",
|
|
738
|
+
"observability",
|
|
739
|
+
"debugging"
|
|
740
|
+
],
|
|
354
741
|
"engineMappings": {
|
|
355
|
-
"eslint": [
|
|
742
|
+
"eslint": [
|
|
743
|
+
"no-empty-catch",
|
|
744
|
+
"@typescript-eslint/no-unused-vars"
|
|
745
|
+
]
|
|
356
746
|
}
|
|
357
747
|
},
|
|
358
748
|
"C037": {
|
|
@@ -360,12 +750,21 @@
|
|
|
360
750
|
"description": "API handlers should return standard response objects (not raw strings)",
|
|
361
751
|
"category": "api",
|
|
362
752
|
"severity": "warning",
|
|
363
|
-
"languages": [
|
|
753
|
+
"languages": [
|
|
754
|
+
"typescript",
|
|
755
|
+
"javascript",
|
|
756
|
+
"dart",
|
|
757
|
+
"kotlin"
|
|
758
|
+
],
|
|
364
759
|
"analyzer": "./rules/common/C037_standard_response/analyzer.js",
|
|
365
760
|
"config": "./rules/common/C037_standard_response/config.json",
|
|
366
761
|
"version": "1.0.0",
|
|
367
762
|
"status": "stable",
|
|
368
|
-
"tags": [
|
|
763
|
+
"tags": [
|
|
764
|
+
"api",
|
|
765
|
+
"response",
|
|
766
|
+
"standardization"
|
|
767
|
+
],
|
|
369
768
|
"engineMappings": {
|
|
370
769
|
"eslint": [
|
|
371
770
|
"consistent-return",
|
|
@@ -379,12 +778,21 @@
|
|
|
379
778
|
"description": "Avoid logic depending on file/module loading order",
|
|
380
779
|
"category": "architecture",
|
|
381
780
|
"severity": "warning",
|
|
382
|
-
"languages": [
|
|
781
|
+
"languages": [
|
|
782
|
+
"typescript",
|
|
783
|
+
"javascript",
|
|
784
|
+
"dart",
|
|
785
|
+
"kotlin"
|
|
786
|
+
],
|
|
383
787
|
"analyzer": "./rules/common/C038_no_loading_order/analyzer.js",
|
|
384
788
|
"config": "./rules/common/C038_no_loading_order/config.json",
|
|
385
789
|
"version": "1.0.0",
|
|
386
790
|
"status": "stable",
|
|
387
|
-
"tags": [
|
|
791
|
+
"tags": [
|
|
792
|
+
"architecture",
|
|
793
|
+
"loading",
|
|
794
|
+
"dependency"
|
|
795
|
+
],
|
|
388
796
|
"engineMappings": {
|
|
389
797
|
"eslint": [
|
|
390
798
|
"import/no-dynamic-require",
|
|
@@ -398,12 +806,21 @@
|
|
|
398
806
|
"description": "Don't scatter validation logic across multiple classes",
|
|
399
807
|
"category": "validation",
|
|
400
808
|
"severity": "warning",
|
|
401
|
-
"languages": [
|
|
809
|
+
"languages": [
|
|
810
|
+
"typescript",
|
|
811
|
+
"javascript",
|
|
812
|
+
"dart",
|
|
813
|
+
"kotlin"
|
|
814
|
+
],
|
|
402
815
|
"analyzer": "./rules/common/C040_centralized_validation/analyzer.js",
|
|
403
816
|
"config": "./rules/common/C040_centralized_validation/config.json",
|
|
404
817
|
"version": "1.0.0",
|
|
405
818
|
"status": "stable",
|
|
406
|
-
"tags": [
|
|
819
|
+
"tags": [
|
|
820
|
+
"validation",
|
|
821
|
+
"centralization",
|
|
822
|
+
"architecture"
|
|
823
|
+
],
|
|
407
824
|
"engineMappings": {
|
|
408
825
|
"eslint": [
|
|
409
826
|
"no-duplicate-imports",
|
|
@@ -417,14 +834,54 @@
|
|
|
417
834
|
"description": "Protect sensitive application data, avoid security risks, and comply with security standards. Exposing sensitive information can lead to serious security and privacy issues.",
|
|
418
835
|
"category": "security",
|
|
419
836
|
"severity": "warning",
|
|
420
|
-
"languages": [
|
|
837
|
+
"languages": [
|
|
838
|
+
"typescript",
|
|
839
|
+
"javascript",
|
|
840
|
+
"dart",
|
|
841
|
+
"kotlin"
|
|
842
|
+
],
|
|
421
843
|
"analyzer": "./rules/common/C041_no_sensitive_hardcode/analyzer.js",
|
|
422
844
|
"config": "./rules/common/C041_no_sensitive_hardcode/config.json",
|
|
423
845
|
"version": "1.0.0",
|
|
424
846
|
"status": "stable",
|
|
425
|
-
"tags": [
|
|
847
|
+
"tags": [
|
|
848
|
+
"naming",
|
|
849
|
+
"domain",
|
|
850
|
+
"readability"
|
|
851
|
+
],
|
|
852
|
+
"engineMappings": {
|
|
853
|
+
"eslint": [
|
|
854
|
+
"@typescript-eslint/naming-convention",
|
|
855
|
+
"camelcase"
|
|
856
|
+
]
|
|
857
|
+
}
|
|
858
|
+
},
|
|
859
|
+
"C042": {
|
|
860
|
+
"id": "C042",
|
|
861
|
+
"name": "Rule C042",
|
|
862
|
+
"description": "Auto-migrated rule C042 from ESLint mapping",
|
|
863
|
+
"category": "general",
|
|
864
|
+
"severity": "warning",
|
|
865
|
+
"languages": [
|
|
866
|
+
"typescript",
|
|
867
|
+
"javascript"
|
|
868
|
+
],
|
|
869
|
+
"version": "1.0.0",
|
|
870
|
+
"status": "migrated",
|
|
871
|
+
"tags": [
|
|
872
|
+
"migrated"
|
|
873
|
+
],
|
|
426
874
|
"engineMappings": {
|
|
427
|
-
"eslint": [
|
|
875
|
+
"eslint": [
|
|
876
|
+
"custom/boolean-name-prefix"
|
|
877
|
+
]
|
|
878
|
+
},
|
|
879
|
+
"strategy": {
|
|
880
|
+
"preferred": "regex",
|
|
881
|
+
"fallbacks": [
|
|
882
|
+
"regex"
|
|
883
|
+
],
|
|
884
|
+
"accuracy": {}
|
|
428
885
|
}
|
|
429
886
|
},
|
|
430
887
|
"C043": {
|
|
@@ -432,281 +889,1031 @@
|
|
|
432
889
|
"description": "Do not use console.log or print in production code",
|
|
433
890
|
"category": "logging",
|
|
434
891
|
"severity": "warning",
|
|
435
|
-
"languages": [
|
|
892
|
+
"languages": [
|
|
893
|
+
"typescript",
|
|
894
|
+
"javascript",
|
|
895
|
+
"dart"
|
|
896
|
+
],
|
|
436
897
|
"analyzer": "./rules/common/C043_no_console_or_print/analyzer.js",
|
|
437
898
|
"version": "1.0.0",
|
|
438
899
|
"status": "stable",
|
|
439
|
-
"tags": [
|
|
900
|
+
"tags": [
|
|
901
|
+
"logging",
|
|
902
|
+
"production",
|
|
903
|
+
"debugging",
|
|
904
|
+
"console"
|
|
905
|
+
],
|
|
440
906
|
"strategy": {
|
|
441
907
|
"preferred": "regex",
|
|
442
|
-
"fallbacks": [
|
|
908
|
+
"fallbacks": [
|
|
909
|
+
"regex"
|
|
910
|
+
],
|
|
443
911
|
"accuracy": {
|
|
444
912
|
"regex": 90
|
|
445
913
|
}
|
|
446
914
|
}
|
|
447
915
|
},
|
|
448
|
-
"
|
|
449
|
-
"
|
|
450
|
-
"
|
|
451
|
-
"
|
|
916
|
+
"C047": {
|
|
917
|
+
"id": "C047",
|
|
918
|
+
"name": "Rule C047",
|
|
919
|
+
"description": "Auto-migrated rule C047 from ESLint mapping",
|
|
920
|
+
"category": "general",
|
|
452
921
|
"severity": "warning",
|
|
453
|
-
"languages": [
|
|
454
|
-
|
|
922
|
+
"languages": [
|
|
923
|
+
"typescript",
|
|
924
|
+
"javascript"
|
|
925
|
+
],
|
|
455
926
|
"version": "1.0.0",
|
|
456
|
-
"status": "
|
|
457
|
-
"tags": [
|
|
927
|
+
"status": "migrated",
|
|
928
|
+
"tags": [
|
|
929
|
+
"migrated"
|
|
930
|
+
],
|
|
931
|
+
"engineMappings": {
|
|
932
|
+
"eslint": [
|
|
933
|
+
"custom/no-duplicate-retry-logic"
|
|
934
|
+
]
|
|
935
|
+
},
|
|
458
936
|
"strategy": {
|
|
459
937
|
"preferred": "regex",
|
|
460
|
-
"fallbacks": [
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
}
|
|
938
|
+
"fallbacks": [
|
|
939
|
+
"regex"
|
|
940
|
+
],
|
|
941
|
+
"accuracy": {}
|
|
464
942
|
}
|
|
465
943
|
},
|
|
466
|
-
"
|
|
467
|
-
"name": "
|
|
468
|
-
"description": "
|
|
469
|
-
"category": "
|
|
470
|
-
"severity": "
|
|
471
|
-
"languages": [
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
"
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
944
|
+
"C048": {
|
|
945
|
+
"name": "Do not bypass architectural layers (controller/service/repository)",
|
|
946
|
+
"description": "Maintain a clear layered architecture, ensuring logic and data flow are well-structured and maintainable.",
|
|
947
|
+
"category": "naming",
|
|
948
|
+
"severity": "warning",
|
|
949
|
+
"languages": [
|
|
950
|
+
"typescript",
|
|
951
|
+
"javascript",
|
|
952
|
+
"dart",
|
|
953
|
+
"kotlin"
|
|
954
|
+
],
|
|
955
|
+
"analyzer": "./rules/common/C048_no_bypass_architectural_layers/analyzer.js",
|
|
956
|
+
"config": "./rules/common/C048_no_bypass_architectural_layers/config.json",
|
|
957
|
+
"version": "1.0.0",
|
|
958
|
+
"status": "stable",
|
|
959
|
+
"tags": [
|
|
960
|
+
"naming",
|
|
961
|
+
"domain",
|
|
962
|
+
"readability"
|
|
963
|
+
],
|
|
964
|
+
"engineMappings": {
|
|
965
|
+
"eslint": [
|
|
966
|
+
"@typescript-eslint/naming-convention",
|
|
967
|
+
"camelcase"
|
|
968
|
+
]
|
|
484
969
|
}
|
|
485
970
|
},
|
|
486
|
-
"
|
|
487
|
-
"name": "
|
|
488
|
-
"description": "
|
|
489
|
-
"category": "
|
|
490
|
-
"severity": "
|
|
491
|
-
"languages": [
|
|
492
|
-
|
|
493
|
-
|
|
971
|
+
"C052": {
|
|
972
|
+
"name": "Parsing or data transformation logic must be separated from controllers",
|
|
973
|
+
"description": "Enforce separation of concerns — controllers should only handle requests and delegate processing, improving testability, maintainability, and reuse.",
|
|
974
|
+
"category": "naming",
|
|
975
|
+
"severity": "warning",
|
|
976
|
+
"languages": [
|
|
977
|
+
"typescript",
|
|
978
|
+
"javascript",
|
|
979
|
+
"dart",
|
|
980
|
+
"kotlin"
|
|
981
|
+
],
|
|
982
|
+
"analyzer": "./rules/common/C052_parsing_or_data_transformation/analyzer.js",
|
|
983
|
+
"config": "./rules/common/C052_parsing_or_data_transformation/config.json",
|
|
494
984
|
"version": "1.0.0",
|
|
495
985
|
"status": "stable",
|
|
496
|
-
"tags": [
|
|
986
|
+
"tags": [
|
|
987
|
+
"naming",
|
|
988
|
+
"domain",
|
|
989
|
+
"readability"
|
|
990
|
+
],
|
|
991
|
+
"engineMappings": {
|
|
992
|
+
"eslint": [
|
|
993
|
+
"@typescript-eslint/naming-convention",
|
|
994
|
+
"camelcase"
|
|
995
|
+
]
|
|
996
|
+
}
|
|
497
997
|
},
|
|
498
|
-
"
|
|
499
|
-
"name": "
|
|
500
|
-
"description": "
|
|
501
|
-
"category": "
|
|
502
|
-
"severity": "
|
|
503
|
-
"languages": [
|
|
504
|
-
|
|
505
|
-
|
|
998
|
+
"C060": {
|
|
999
|
+
"name": "Do not override superclass methods and ignore critical logic",
|
|
1000
|
+
"description": "Preserve important behavior or lifecycle logic defined in the superclass to ensure correctness and prevent silent errors.",
|
|
1001
|
+
"category": "logging",
|
|
1002
|
+
"severity": "warning",
|
|
1003
|
+
"languages": [
|
|
1004
|
+
"typescript",
|
|
1005
|
+
"javascript",
|
|
1006
|
+
"dart"
|
|
1007
|
+
],
|
|
1008
|
+
"analyzer": "./rules/common/C060_no_override_superclass/analyzer.js",
|
|
506
1009
|
"version": "1.0.0",
|
|
507
1010
|
"status": "stable",
|
|
508
|
-
"tags": [
|
|
1011
|
+
"tags": [
|
|
1012
|
+
"logging",
|
|
1013
|
+
"production",
|
|
1014
|
+
"debugging",
|
|
1015
|
+
"console"
|
|
1016
|
+
],
|
|
509
1017
|
"strategy": {
|
|
510
|
-
"preferred": "
|
|
511
|
-
"fallbacks": [
|
|
1018
|
+
"preferred": "regex",
|
|
1019
|
+
"fallbacks": [
|
|
1020
|
+
"regex"
|
|
1021
|
+
],
|
|
512
1022
|
"accuracy": {
|
|
513
|
-
"
|
|
1023
|
+
"regex": 90
|
|
514
1024
|
}
|
|
515
|
-
}
|
|
1025
|
+
}
|
|
1026
|
+
},
|
|
1027
|
+
"C065": {
|
|
1028
|
+
"name": "One Behavior per Test (AAA Pattern)",
|
|
1029
|
+
"description": "Enforce single behavior testing - each test should verify exactly one action/behavior with clear Arrange-Act-Assert structure",
|
|
1030
|
+
"category": "common",
|
|
1031
|
+
"severity": "warning",
|
|
1032
|
+
"languages": [
|
|
1033
|
+
"typescript",
|
|
1034
|
+
"javascript",
|
|
1035
|
+
"java",
|
|
1036
|
+
"csharp",
|
|
1037
|
+
"swift",
|
|
1038
|
+
"kotlin",
|
|
1039
|
+
"python"
|
|
1040
|
+
],
|
|
1041
|
+
"analyzer": "./rules/common/C065_one_behavior_per_test/analyzer.js",
|
|
1042
|
+
"config": "./rules/common/C065_one_behavior_per_test/config.json",
|
|
1043
|
+
"version": "1.0.0",
|
|
1044
|
+
"status": "stable",
|
|
1045
|
+
"tags": [
|
|
1046
|
+
"testing",
|
|
1047
|
+
"aaa",
|
|
1048
|
+
"behavior",
|
|
1049
|
+
"maintainability",
|
|
1050
|
+
"clarity"
|
|
1051
|
+
],
|
|
516
1052
|
"engineMappings": {
|
|
517
|
-
"heuristic": [
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
"owaspCategory": "A03:2021 - Injection",
|
|
521
|
-
"cweId": "CWE-601",
|
|
522
|
-
"frameworks": ["Express", "NestJS", "Next.js", "Nuxt.js", "Spring Boot"],
|
|
523
|
-
"detectionPatterns": 28,
|
|
524
|
-
"testCases": 118
|
|
1053
|
+
"heuristic": [
|
|
1054
|
+
"./rules/common/C065_one_behavior_per_test/analyzer.js"
|
|
1055
|
+
]
|
|
525
1056
|
}
|
|
526
1057
|
},
|
|
527
|
-
"
|
|
528
|
-
"name": "
|
|
529
|
-
"description": "
|
|
530
|
-
"category": "
|
|
1058
|
+
"C067": {
|
|
1059
|
+
"name": "No Hardcoded Configuration",
|
|
1060
|
+
"description": "Improve configurability, reduce risk when changing environments, and make configuration management flexible and maintainable.",
|
|
1061
|
+
"category": "configuration",
|
|
531
1062
|
"severity": "warning",
|
|
532
|
-
"languages": [
|
|
533
|
-
|
|
534
|
-
|
|
1063
|
+
"languages": [
|
|
1064
|
+
"typescript",
|
|
1065
|
+
"javascript",
|
|
1066
|
+
"dart",
|
|
1067
|
+
"kotlin"
|
|
1068
|
+
],
|
|
1069
|
+
"analyzer": "./rules/common/C067_no_hardcoded_config/analyzer.js",
|
|
1070
|
+
"config": "./rules/common/C067_no_hardcoded_config/config.json",
|
|
535
1071
|
"version": "1.0.0",
|
|
536
1072
|
"status": "stable",
|
|
537
|
-
"tags": [
|
|
1073
|
+
"tags": [
|
|
1074
|
+
"configuration",
|
|
1075
|
+
"hardcode",
|
|
1076
|
+
"environment",
|
|
1077
|
+
"maintainability",
|
|
1078
|
+
"security"
|
|
1079
|
+
],
|
|
538
1080
|
"strategy": {
|
|
539
|
-
"preferred": "
|
|
540
|
-
"fallbacks": [
|
|
1081
|
+
"preferred": "ast",
|
|
1082
|
+
"fallbacks": [
|
|
1083
|
+
"ast"
|
|
1084
|
+
],
|
|
541
1085
|
"accuracy": {
|
|
542
|
-
"
|
|
1086
|
+
"ast": 90
|
|
543
1087
|
}
|
|
544
1088
|
},
|
|
545
1089
|
"engineMappings": {
|
|
546
|
-
"heuristic": [
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
"owaspCategory": "A09:2021 - Security Logging and Monitoring Failures",
|
|
550
|
-
"cweId": "CWE-532",
|
|
551
|
-
"frameworks": ["Express", "NestJS", "Next.js", "Nuxt.js", "Spring Boot", "Winston", "Pino", "Bunyan"],
|
|
552
|
-
"detectionPatterns": 90,
|
|
553
|
-
"testCases": 45
|
|
1090
|
+
"heuristic": [
|
|
1091
|
+
"rules/common/C067_no_hardcoded_config/analyzer.js"
|
|
1092
|
+
]
|
|
554
1093
|
}
|
|
555
1094
|
},
|
|
556
|
-
"
|
|
557
|
-
"name": "No
|
|
558
|
-
"description": "
|
|
559
|
-
"category": "
|
|
1095
|
+
"C070": {
|
|
1096
|
+
"name": "No Real Time Tests",
|
|
1097
|
+
"description": "Tests should not depend on real time delays or sleeps. Use fake timers, clock injection, or condition-based waits to improve test reliability and speed.",
|
|
1098
|
+
"category": "testing",
|
|
560
1099
|
"severity": "error",
|
|
561
|
-
"languages": [
|
|
562
|
-
|
|
1100
|
+
"languages": [
|
|
1101
|
+
"typescript",
|
|
1102
|
+
"javascript"
|
|
1103
|
+
],
|
|
1104
|
+
"analyzer": "../rules/common/C070_no_real_time_tests/regex-analyzer.js",
|
|
1105
|
+
"config": "../rules/common/C070_no_real_time_tests/config.json",
|
|
563
1106
|
"version": "1.0.0",
|
|
564
1107
|
"status": "stable",
|
|
565
|
-
"tags": [
|
|
1108
|
+
"tags": [
|
|
1109
|
+
"testing",
|
|
1110
|
+
"flaky-tests",
|
|
1111
|
+
"timing",
|
|
1112
|
+
"fake-timers",
|
|
1113
|
+
"reliability"
|
|
1114
|
+
],
|
|
566
1115
|
"strategy": {
|
|
567
1116
|
"preferred": "ast",
|
|
568
|
-
"fallbacks": [
|
|
1117
|
+
"fallbacks": [
|
|
1118
|
+
"regex"
|
|
1119
|
+
],
|
|
569
1120
|
"accuracy": {
|
|
570
1121
|
"ast": 95,
|
|
571
|
-
"regex":
|
|
1122
|
+
"regex": 88
|
|
572
1123
|
}
|
|
573
1124
|
},
|
|
574
1125
|
"engineMappings": {
|
|
575
|
-
"
|
|
1126
|
+
"heuristic": [
|
|
1127
|
+
"../rules/common/C070_no_real_time_tests/regex-analyzer.js"
|
|
1128
|
+
]
|
|
576
1129
|
}
|
|
577
1130
|
},
|
|
578
|
-
"
|
|
579
|
-
"
|
|
580
|
-
"
|
|
581
|
-
"
|
|
582
|
-
"
|
|
583
|
-
"
|
|
584
|
-
"
|
|
585
|
-
|
|
1131
|
+
"C072": {
|
|
1132
|
+
"id": "C072",
|
|
1133
|
+
"name": "Single Test Behavior",
|
|
1134
|
+
"description": "Each test should assert only one behavior",
|
|
1135
|
+
"category": "testing",
|
|
1136
|
+
"severity": "warning",
|
|
1137
|
+
"languages": [
|
|
1138
|
+
"typescript",
|
|
1139
|
+
"javascript"
|
|
1140
|
+
],
|
|
586
1141
|
"version": "1.0.0",
|
|
587
1142
|
"status": "stable",
|
|
588
|
-
"tags": [
|
|
1143
|
+
"tags": [
|
|
1144
|
+
"testing",
|
|
1145
|
+
"unit-test",
|
|
1146
|
+
"single-behavior"
|
|
1147
|
+
],
|
|
1148
|
+
"engineMappings": {
|
|
1149
|
+
"eslint": [
|
|
1150
|
+
"custom/c072-one-assert-per-test"
|
|
1151
|
+
],
|
|
1152
|
+
"heuristic": [
|
|
1153
|
+
"rules/common/C072_single_test_behavior/analyzer.js"
|
|
1154
|
+
]
|
|
1155
|
+
},
|
|
589
1156
|
"strategy": {
|
|
590
1157
|
"preferred": "regex",
|
|
591
|
-
"
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
"
|
|
1158
|
+
"fallbacks": [
|
|
1159
|
+
"regex"
|
|
1160
|
+
],
|
|
1161
|
+
"accuracy": {}
|
|
595
1162
|
}
|
|
596
1163
|
},
|
|
597
|
-
"
|
|
598
|
-
"
|
|
599
|
-
"
|
|
600
|
-
"
|
|
1164
|
+
"C073": {
|
|
1165
|
+
"id": "C073",
|
|
1166
|
+
"name": "Validate Required Configuration on Startup",
|
|
1167
|
+
"description": "C073 - Validate mandatory configuration at startup and fail fast on invalid/missing values",
|
|
1168
|
+
"category": "configuration",
|
|
601
1169
|
"severity": "error",
|
|
602
1170
|
"languages": [
|
|
603
1171
|
"typescript",
|
|
604
1172
|
"javascript",
|
|
605
|
-
"dart",
|
|
606
|
-
"kotlin",
|
|
607
1173
|
"java",
|
|
608
|
-
"
|
|
609
|
-
"go",
|
|
610
|
-
"swift"
|
|
1174
|
+
"go"
|
|
611
1175
|
],
|
|
612
|
-
"analyzer": "./rules/security/S007_no_plaintext_otp/analyzer.js",
|
|
613
|
-
"config": "./rules/security/S007_no_plaintext_otp/config.json",
|
|
614
1176
|
"version": "1.0.0",
|
|
615
1177
|
"status": "stable",
|
|
616
1178
|
"tags": [
|
|
617
|
-
"
|
|
618
|
-
"
|
|
619
|
-
"
|
|
620
|
-
"
|
|
621
|
-
"cryptographic-failures",
|
|
622
|
-
"authentication"
|
|
1179
|
+
"configuration",
|
|
1180
|
+
"validation",
|
|
1181
|
+
"startup",
|
|
1182
|
+
"fail-fast"
|
|
623
1183
|
],
|
|
1184
|
+
"engineMappings": {
|
|
1185
|
+
"heuristic": [
|
|
1186
|
+
"rules/common/C073_validate_required_config_on_startup/analyzer.js"
|
|
1187
|
+
],
|
|
1188
|
+
"semantic": [
|
|
1189
|
+
"rules/common/C073_validate_required_config_on_startup/symbol-based-analyzer.js"
|
|
1190
|
+
]
|
|
1191
|
+
},
|
|
624
1192
|
"strategy": {
|
|
625
|
-
"preferred": "
|
|
626
|
-
"fallbacks": [
|
|
1193
|
+
"preferred": "semantic",
|
|
1194
|
+
"fallbacks": [
|
|
1195
|
+
"heuristic"
|
|
1196
|
+
],
|
|
627
1197
|
"accuracy": {
|
|
628
|
-
"
|
|
629
|
-
"
|
|
1198
|
+
"semantic": 0.9,
|
|
1199
|
+
"heuristic": 0.7
|
|
630
1200
|
}
|
|
631
|
-
},
|
|
632
|
-
"engineMappings": {
|
|
633
|
-
"heuristic": "S007_no_plaintext_otp"
|
|
634
1201
|
}
|
|
635
1202
|
},
|
|
636
|
-
"
|
|
637
|
-
"
|
|
638
|
-
"
|
|
639
|
-
"
|
|
640
|
-
"
|
|
641
|
-
"
|
|
642
|
-
"
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
"
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
1203
|
+
"C075": {
|
|
1204
|
+
"id": "C075",
|
|
1205
|
+
"name": "Rule C075",
|
|
1206
|
+
"description": "Auto-migrated rule C075 from ESLint mapping",
|
|
1207
|
+
"category": "general",
|
|
1208
|
+
"severity": "warning",
|
|
1209
|
+
"languages": [
|
|
1210
|
+
"typescript",
|
|
1211
|
+
"javascript"
|
|
1212
|
+
],
|
|
1213
|
+
"version": "1.0.0",
|
|
1214
|
+
"status": "migrated",
|
|
1215
|
+
"tags": [
|
|
1216
|
+
"migrated"
|
|
1217
|
+
],
|
|
1218
|
+
"engineMappings": {
|
|
1219
|
+
"eslint": [
|
|
1220
|
+
"custom/explicit-function-return-types"
|
|
1221
|
+
]
|
|
1222
|
+
},
|
|
1223
|
+
"strategy": {
|
|
1224
|
+
"preferred": "regex",
|
|
1225
|
+
"fallbacks": [
|
|
1226
|
+
"regex"
|
|
1227
|
+
],
|
|
1228
|
+
"accuracy": {}
|
|
1229
|
+
}
|
|
1230
|
+
},
|
|
1231
|
+
"C076": {
|
|
1232
|
+
"id": "C076",
|
|
1233
|
+
"name": "Explicit Function Argument Types",
|
|
1234
|
+
"description": "All public functions must declare explicit types for arguments",
|
|
1235
|
+
"category": "type-safety",
|
|
1236
|
+
"severity": "error",
|
|
1237
|
+
"languages": [
|
|
1238
|
+
"typescript",
|
|
1239
|
+
"javascript"
|
|
1240
|
+
],
|
|
1241
|
+
"version": "1.0.0",
|
|
1242
|
+
"status": "stable",
|
|
1243
|
+
"tags": [
|
|
1244
|
+
"type-safety",
|
|
1245
|
+
"public-api",
|
|
1246
|
+
"explicit-types"
|
|
1247
|
+
],
|
|
1248
|
+
"engineMappings": {
|
|
1249
|
+
"heuristic": [
|
|
1250
|
+
"rules/common/C076_explicit_function_types/semantic-analyzer.js"
|
|
1251
|
+
]
|
|
1252
|
+
},
|
|
1253
|
+
"strategy": {
|
|
1254
|
+
"preferred": "symbol",
|
|
1255
|
+
"fallbacks": [
|
|
1256
|
+
"symbol"
|
|
1257
|
+
],
|
|
1258
|
+
"accuracy": {}
|
|
1259
|
+
}
|
|
1260
|
+
},
|
|
1261
|
+
"R001": {
|
|
1262
|
+
"id": "R001",
|
|
1263
|
+
"name": "Rule R001",
|
|
1264
|
+
"description": "Auto-migrated rule R001 from ESLint mapping",
|
|
1265
|
+
"category": "react",
|
|
1266
|
+
"severity": "warning",
|
|
1267
|
+
"languages": [
|
|
1268
|
+
"typescript",
|
|
1269
|
+
"javascript"
|
|
1270
|
+
],
|
|
1271
|
+
"version": "1.0.0",
|
|
1272
|
+
"status": "migrated",
|
|
1273
|
+
"tags": [
|
|
1274
|
+
"migrated"
|
|
1275
|
+
],
|
|
1276
|
+
"engineMappings": {
|
|
1277
|
+
"eslint": [
|
|
1278
|
+
"react/no-this-in-sfc",
|
|
1279
|
+
"no-param-reassign",
|
|
1280
|
+
"react/function-component-definition",
|
|
1281
|
+
"react/forbid-component-props"
|
|
1282
|
+
]
|
|
1283
|
+
},
|
|
1284
|
+
"strategy": {
|
|
1285
|
+
"preferred": "regex",
|
|
1286
|
+
"fallbacks": [
|
|
1287
|
+
"regex"
|
|
1288
|
+
],
|
|
1289
|
+
"accuracy": {}
|
|
1290
|
+
}
|
|
1291
|
+
},
|
|
1292
|
+
"R002": {
|
|
1293
|
+
"id": "R002",
|
|
1294
|
+
"name": "Rule R002",
|
|
1295
|
+
"description": "Auto-migrated rule R002 from ESLint mapping",
|
|
1296
|
+
"category": "react",
|
|
1297
|
+
"severity": "warning",
|
|
1298
|
+
"languages": [
|
|
1299
|
+
"typescript",
|
|
1300
|
+
"javascript"
|
|
1301
|
+
],
|
|
1302
|
+
"version": "1.0.0",
|
|
1303
|
+
"status": "migrated",
|
|
1304
|
+
"tags": [
|
|
1305
|
+
"migrated"
|
|
1306
|
+
],
|
|
1307
|
+
"engineMappings": {
|
|
1308
|
+
"eslint": [
|
|
1309
|
+
"react-hooks/rules-of-hooks",
|
|
1310
|
+
"react-hooks/exhaustive-deps",
|
|
1311
|
+
"react/no-did-mount-set-state",
|
|
1312
|
+
"react/no-did-update-set-state"
|
|
1313
|
+
]
|
|
1314
|
+
},
|
|
1315
|
+
"strategy": {
|
|
1316
|
+
"preferred": "regex",
|
|
1317
|
+
"fallbacks": [
|
|
1318
|
+
"regex"
|
|
1319
|
+
],
|
|
1320
|
+
"accuracy": {}
|
|
1321
|
+
}
|
|
1322
|
+
},
|
|
1323
|
+
"R003": {
|
|
1324
|
+
"id": "R003",
|
|
1325
|
+
"name": "Rule R003",
|
|
1326
|
+
"description": "Auto-migrated rule R003 from ESLint mapping",
|
|
1327
|
+
"category": "react",
|
|
1328
|
+
"severity": "warning",
|
|
1329
|
+
"languages": [
|
|
1330
|
+
"typescript",
|
|
1331
|
+
"javascript"
|
|
1332
|
+
],
|
|
1333
|
+
"version": "1.0.0",
|
|
1334
|
+
"status": "migrated",
|
|
1335
|
+
"tags": [
|
|
1336
|
+
"migrated"
|
|
1337
|
+
],
|
|
1338
|
+
"engineMappings": {
|
|
1339
|
+
"eslint": [
|
|
1340
|
+
"react/no-direct-mutation-state",
|
|
1341
|
+
"react/jsx-no-constructed-context-values",
|
|
1342
|
+
"react/forbid-dom-props"
|
|
1343
|
+
]
|
|
1344
|
+
},
|
|
1345
|
+
"strategy": {
|
|
1346
|
+
"preferred": "regex",
|
|
1347
|
+
"fallbacks": [
|
|
1348
|
+
"regex"
|
|
1349
|
+
],
|
|
1350
|
+
"accuracy": {}
|
|
1351
|
+
}
|
|
1352
|
+
},
|
|
1353
|
+
"R004": {
|
|
1354
|
+
"id": "R004",
|
|
1355
|
+
"name": "Rule R004",
|
|
1356
|
+
"description": "Auto-migrated rule R004 from ESLint mapping",
|
|
1357
|
+
"category": "react",
|
|
1358
|
+
"severity": "warning",
|
|
1359
|
+
"languages": [
|
|
1360
|
+
"typescript",
|
|
1361
|
+
"javascript"
|
|
1362
|
+
],
|
|
1363
|
+
"version": "1.0.0",
|
|
1364
|
+
"status": "migrated",
|
|
1365
|
+
"tags": [
|
|
1366
|
+
"migrated"
|
|
1367
|
+
],
|
|
1368
|
+
"engineMappings": {
|
|
1369
|
+
"eslint": [
|
|
1370
|
+
"no-param-reassign",
|
|
1371
|
+
"react/forbid-foreign-prop-types"
|
|
1372
|
+
]
|
|
1373
|
+
},
|
|
1374
|
+
"strategy": {
|
|
1375
|
+
"preferred": "regex",
|
|
1376
|
+
"fallbacks": [
|
|
1377
|
+
"regex"
|
|
1378
|
+
],
|
|
1379
|
+
"accuracy": {}
|
|
1380
|
+
}
|
|
1381
|
+
},
|
|
1382
|
+
"R005": {
|
|
1383
|
+
"id": "R005",
|
|
1384
|
+
"name": "Rule R005",
|
|
1385
|
+
"description": "Auto-migrated rule R005 from ESLint mapping",
|
|
1386
|
+
"category": "react",
|
|
1387
|
+
"severity": "warning",
|
|
1388
|
+
"languages": [
|
|
1389
|
+
"typescript",
|
|
1390
|
+
"javascript"
|
|
1391
|
+
],
|
|
1392
|
+
"version": "1.0.0",
|
|
1393
|
+
"status": "migrated",
|
|
1394
|
+
"tags": [
|
|
1395
|
+
"migrated"
|
|
1396
|
+
],
|
|
1397
|
+
"engineMappings": {
|
|
1398
|
+
"eslint": [
|
|
1399
|
+
"react/jsx-no-bind"
|
|
1400
|
+
]
|
|
1401
|
+
},
|
|
1402
|
+
"strategy": {
|
|
1403
|
+
"preferred": "regex",
|
|
1404
|
+
"fallbacks": [
|
|
1405
|
+
"regex"
|
|
1406
|
+
],
|
|
1407
|
+
"accuracy": {}
|
|
1408
|
+
}
|
|
1409
|
+
},
|
|
1410
|
+
"R006": {
|
|
1411
|
+
"id": "R006",
|
|
1412
|
+
"name": "Rule R006",
|
|
1413
|
+
"description": "Auto-migrated rule R006 from ESLint mapping",
|
|
1414
|
+
"category": "react",
|
|
1415
|
+
"severity": "warning",
|
|
1416
|
+
"languages": [
|
|
1417
|
+
"typescript",
|
|
1418
|
+
"javascript"
|
|
1419
|
+
],
|
|
1420
|
+
"version": "1.0.0",
|
|
1421
|
+
"status": "migrated",
|
|
1422
|
+
"tags": [
|
|
1423
|
+
"migrated"
|
|
1424
|
+
],
|
|
1425
|
+
"engineMappings": {
|
|
1426
|
+
"eslint": [
|
|
1427
|
+
"react/jsx-pascal-case",
|
|
1428
|
+
"react/jsx-uses-react",
|
|
1429
|
+
"react/jsx-uses-vars"
|
|
1430
|
+
]
|
|
1431
|
+
},
|
|
1432
|
+
"strategy": {
|
|
1433
|
+
"preferred": "regex",
|
|
1434
|
+
"fallbacks": [
|
|
1435
|
+
"regex"
|
|
1436
|
+
],
|
|
1437
|
+
"accuracy": {}
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
"R007": {
|
|
1441
|
+
"id": "R007",
|
|
1442
|
+
"name": "Rule R007",
|
|
1443
|
+
"description": "Auto-migrated rule R007 from ESLint mapping",
|
|
1444
|
+
"category": "react",
|
|
1445
|
+
"severity": "warning",
|
|
1446
|
+
"languages": [
|
|
1447
|
+
"typescript",
|
|
1448
|
+
"javascript"
|
|
1449
|
+
],
|
|
1450
|
+
"version": "1.0.0",
|
|
1451
|
+
"status": "migrated",
|
|
1452
|
+
"tags": [
|
|
1453
|
+
"migrated"
|
|
1454
|
+
],
|
|
1455
|
+
"engineMappings": {
|
|
1456
|
+
"eslint": [
|
|
1457
|
+
"react-hooks/rules-of-hooks"
|
|
1458
|
+
]
|
|
1459
|
+
},
|
|
1460
|
+
"strategy": {
|
|
1461
|
+
"preferred": "regex",
|
|
1462
|
+
"fallbacks": [
|
|
1463
|
+
"regex"
|
|
1464
|
+
],
|
|
1465
|
+
"accuracy": {}
|
|
1466
|
+
}
|
|
1467
|
+
},
|
|
1468
|
+
"R008": {
|
|
1469
|
+
"id": "R008",
|
|
1470
|
+
"name": "Rule R008",
|
|
1471
|
+
"description": "Auto-migrated rule R008 from ESLint mapping",
|
|
1472
|
+
"category": "react",
|
|
1473
|
+
"severity": "warning",
|
|
1474
|
+
"languages": [
|
|
1475
|
+
"typescript",
|
|
1476
|
+
"javascript"
|
|
1477
|
+
],
|
|
1478
|
+
"version": "1.0.0",
|
|
1479
|
+
"status": "migrated",
|
|
1480
|
+
"tags": [
|
|
1481
|
+
"migrated"
|
|
1482
|
+
],
|
|
1483
|
+
"engineMappings": {
|
|
1484
|
+
"eslint": [
|
|
1485
|
+
"react-hooks/rules-of-hooks"
|
|
1486
|
+
]
|
|
1487
|
+
},
|
|
1488
|
+
"strategy": {
|
|
1489
|
+
"preferred": "regex",
|
|
1490
|
+
"fallbacks": [
|
|
1491
|
+
"regex"
|
|
1492
|
+
],
|
|
1493
|
+
"accuracy": {}
|
|
1494
|
+
}
|
|
1495
|
+
},
|
|
1496
|
+
"R009": {
|
|
1497
|
+
"id": "R009",
|
|
1498
|
+
"name": "Rule R009",
|
|
1499
|
+
"description": "Auto-migrated rule R009 from ESLint mapping",
|
|
1500
|
+
"category": "react",
|
|
1501
|
+
"severity": "warning",
|
|
1502
|
+
"languages": [
|
|
1503
|
+
"typescript",
|
|
1504
|
+
"javascript"
|
|
1505
|
+
],
|
|
1506
|
+
"version": "1.0.0",
|
|
1507
|
+
"status": "migrated",
|
|
1508
|
+
"tags": [
|
|
1509
|
+
"migrated"
|
|
1510
|
+
],
|
|
1511
|
+
"engineMappings": {
|
|
1512
|
+
"eslint": [
|
|
1513
|
+
"react-hooks/rules-of-hooks"
|
|
1514
|
+
]
|
|
1515
|
+
},
|
|
1516
|
+
"strategy": {
|
|
1517
|
+
"preferred": "regex",
|
|
1518
|
+
"fallbacks": [
|
|
1519
|
+
"regex"
|
|
1520
|
+
],
|
|
1521
|
+
"accuracy": {}
|
|
1522
|
+
}
|
|
1523
|
+
},
|
|
1524
|
+
"S001": {
|
|
1525
|
+
"name": "Fail Securely",
|
|
1526
|
+
"description": "Verify that if there is an error in access control, the system fails securely",
|
|
1527
|
+
"category": "security",
|
|
1528
|
+
"severity": "error",
|
|
1529
|
+
"languages": [
|
|
1530
|
+
"typescript",
|
|
1531
|
+
"javascript"
|
|
1532
|
+
],
|
|
1533
|
+
"analyzer": "eslint",
|
|
1534
|
+
"eslintRule": "custom/typescript_s001",
|
|
1535
|
+
"version": "1.0.0",
|
|
1536
|
+
"status": "stable",
|
|
1537
|
+
"tags": [
|
|
1538
|
+
"security",
|
|
1539
|
+
"access-control",
|
|
1540
|
+
"fail-safe"
|
|
1541
|
+
],
|
|
1542
|
+
"strategy": {
|
|
1543
|
+
"preferred": "regex",
|
|
1544
|
+
"fallbacks": [
|
|
1545
|
+
"regex",
|
|
1546
|
+
"ast"
|
|
1547
|
+
],
|
|
1548
|
+
"accuracy": {
|
|
1549
|
+
"regex": 85,
|
|
1550
|
+
"ast": 90
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
},
|
|
1554
|
+
"S002": {
|
|
1555
|
+
"name": "IDOR Check",
|
|
1556
|
+
"description": "Insecure Direct Object Reference prevention",
|
|
1557
|
+
"category": "security",
|
|
1558
|
+
"severity": "error",
|
|
1559
|
+
"languages": [
|
|
1560
|
+
"typescript",
|
|
1561
|
+
"javascript"
|
|
1562
|
+
],
|
|
1563
|
+
"analyzer": "eslint",
|
|
1564
|
+
"eslintRule": "custom/typescript_s002",
|
|
1565
|
+
"version": "1.0.0",
|
|
1566
|
+
"status": "stable",
|
|
1567
|
+
"tags": [
|
|
1568
|
+
"security",
|
|
1569
|
+
"idor",
|
|
1570
|
+
"access-control"
|
|
1571
|
+
]
|
|
1572
|
+
},
|
|
1573
|
+
"S003": {
|
|
1574
|
+
"name": "Open Redirect Protection",
|
|
1575
|
+
"description": "URL redirects must validate against an allow list to prevent open redirect vulnerabilities",
|
|
1576
|
+
"category": "security",
|
|
1577
|
+
"severity": "error",
|
|
1578
|
+
"languages": [
|
|
1579
|
+
"typescript",
|
|
1580
|
+
"javascript",
|
|
1581
|
+
"dart"
|
|
1582
|
+
],
|
|
1583
|
+
"analyzer": "./rules/security/S003_open_redirect_protection/index.js",
|
|
1584
|
+
"config": "./rules/security/S003_open_redirect_protection/config.json",
|
|
1585
|
+
"version": "1.0.0",
|
|
1586
|
+
"status": "stable",
|
|
1587
|
+
"tags": [
|
|
1588
|
+
"security",
|
|
1589
|
+
"owasp",
|
|
1590
|
+
"injection",
|
|
1591
|
+
"open-redirect",
|
|
1592
|
+
"phishing",
|
|
1593
|
+
"url-validation"
|
|
1594
|
+
],
|
|
1595
|
+
"strategy": {
|
|
1596
|
+
"preferred": "heuristic",
|
|
1597
|
+
"fallbacks": [
|
|
1598
|
+
"heuristic"
|
|
1599
|
+
],
|
|
1600
|
+
"accuracy": {
|
|
1601
|
+
"heuristic": 95
|
|
1602
|
+
}
|
|
1603
|
+
},
|
|
1604
|
+
"engineMappings": {
|
|
1605
|
+
"heuristic": [
|
|
1606
|
+
"rules/security/S003_open_redirect_protection/index.js"
|
|
1607
|
+
]
|
|
1608
|
+
},
|
|
1609
|
+
"metadata": {
|
|
1610
|
+
"owaspCategory": "A03:2021 - Injection",
|
|
1611
|
+
"cweId": "CWE-601",
|
|
1612
|
+
"frameworks": [
|
|
1613
|
+
"Express",
|
|
1614
|
+
"NestJS",
|
|
1615
|
+
"Next.js",
|
|
1616
|
+
"Nuxt.js",
|
|
1617
|
+
"Spring Boot"
|
|
1618
|
+
],
|
|
1619
|
+
"detectionPatterns": 28,
|
|
1620
|
+
"testCases": 118
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
"S004": {
|
|
1624
|
+
"name": "Sensitive Data Logging Protection",
|
|
1625
|
+
"description": "Prevent logging of sensitive information like passwords, tokens, and payment data without proper redaction",
|
|
1626
|
+
"category": "security",
|
|
1627
|
+
"severity": "warning",
|
|
1628
|
+
"languages": [
|
|
1629
|
+
"typescript",
|
|
1630
|
+
"javascript",
|
|
1631
|
+
"dart"
|
|
1632
|
+
],
|
|
1633
|
+
"analyzer": "./rules/security/S004_sensitive_data_logging/analyzer.js",
|
|
1634
|
+
"config": "./rules/security/S004_sensitive_data_logging/config.json",
|
|
1635
|
+
"version": "1.0.0",
|
|
1636
|
+
"status": "stable",
|
|
1637
|
+
"tags": [
|
|
1638
|
+
"security",
|
|
1639
|
+
"owasp",
|
|
1640
|
+
"logging",
|
|
1641
|
+
"sensitive-data",
|
|
1642
|
+
"pii",
|
|
1643
|
+
"credentials",
|
|
1644
|
+
"data-exposure"
|
|
1645
|
+
],
|
|
1646
|
+
"strategy": {
|
|
1647
|
+
"preferred": "heuristic",
|
|
1648
|
+
"fallbacks": [
|
|
1649
|
+
"heuristic"
|
|
1650
|
+
],
|
|
1651
|
+
"accuracy": {
|
|
1652
|
+
"heuristic": 90
|
|
1653
|
+
}
|
|
1654
|
+
},
|
|
1655
|
+
"engineMappings": {
|
|
1656
|
+
"heuristic": [
|
|
1657
|
+
"rules/security/S004_sensitive_data_logging/analyzer.js"
|
|
1658
|
+
]
|
|
1659
|
+
},
|
|
1660
|
+
"metadata": {
|
|
1661
|
+
"owaspCategory": "A09:2021 - Security Logging and Monitoring Failures",
|
|
1662
|
+
"cweId": "CWE-532",
|
|
1663
|
+
"frameworks": [
|
|
1664
|
+
"Express",
|
|
1665
|
+
"NestJS",
|
|
1666
|
+
"Next.js",
|
|
1667
|
+
"Nuxt.js",
|
|
1668
|
+
"Spring Boot",
|
|
1669
|
+
"Winston",
|
|
1670
|
+
"Pino",
|
|
1671
|
+
"Bunyan"
|
|
1672
|
+
],
|
|
1673
|
+
"detectionPatterns": 90,
|
|
1674
|
+
"testCases": 45
|
|
1675
|
+
}
|
|
1676
|
+
},
|
|
1677
|
+
"S005": {
|
|
1678
|
+
"name": "No Origin Header Authentication",
|
|
1679
|
+
"description": "Do not use Origin header for authentication/access control",
|
|
1680
|
+
"category": "security",
|
|
1681
|
+
"severity": "error",
|
|
1682
|
+
"languages": [
|
|
1683
|
+
"typescript",
|
|
1684
|
+
"javascript"
|
|
1685
|
+
],
|
|
1686
|
+
"analyzer": "./rules/security/S005_no_origin_auth/analyzer.js",
|
|
1687
|
+
"version": "1.0.0",
|
|
1688
|
+
"status": "stable",
|
|
1689
|
+
"tags": [
|
|
1690
|
+
"security",
|
|
1691
|
+
"authentication",
|
|
1692
|
+
"headers"
|
|
1693
|
+
],
|
|
1694
|
+
"strategy": {
|
|
1695
|
+
"preferred": "ast",
|
|
1696
|
+
"fallbacks": [
|
|
1697
|
+
"ast",
|
|
1698
|
+
"regex"
|
|
1699
|
+
],
|
|
1700
|
+
"accuracy": {
|
|
1701
|
+
"ast": 95,
|
|
1702
|
+
"regex": 85
|
|
1703
|
+
}
|
|
1704
|
+
},
|
|
1705
|
+
"engineMappings": {
|
|
1706
|
+
"eslint": [
|
|
1707
|
+
"custom/typescript_s005"
|
|
1708
|
+
]
|
|
1709
|
+
}
|
|
1710
|
+
},
|
|
1711
|
+
"S006": {
|
|
1712
|
+
"name": "No Plaintext Recovery/Activation Codes",
|
|
1713
|
+
"description": "Do not send recovery or activation codes in plaintext",
|
|
1714
|
+
"category": "security",
|
|
1715
|
+
"severity": "error",
|
|
1716
|
+
"languages": [
|
|
1717
|
+
"All languages"
|
|
1718
|
+
],
|
|
1719
|
+
"analyzer": "./rules/security/S006_no_plaintext_recovery_codes/analyzer.js",
|
|
1720
|
+
"config": "./rules/security/S006_no_plaintext_recovery_codes/config.json",
|
|
1721
|
+
"version": "1.0.0",
|
|
1722
|
+
"status": "stable",
|
|
1723
|
+
"tags": [
|
|
1724
|
+
"security",
|
|
1725
|
+
"owasp",
|
|
1726
|
+
"cryptographic-failures",
|
|
1727
|
+
"authentication"
|
|
1728
|
+
],
|
|
1729
|
+
"strategy": {
|
|
1730
|
+
"preferred": "regex",
|
|
1731
|
+
"fallback": "heuristic"
|
|
1732
|
+
},
|
|
1733
|
+
"engineMappings": {
|
|
1734
|
+
"heuristic": "S006_no_plaintext_recovery_codes"
|
|
1735
|
+
}
|
|
1736
|
+
},
|
|
1737
|
+
"S007": {
|
|
1738
|
+
"name": "No Plaintext OTP",
|
|
1739
|
+
"description": "One-Time Passwords must not be stored in plaintext",
|
|
1740
|
+
"category": "security",
|
|
1741
|
+
"severity": "error",
|
|
1742
|
+
"languages": [
|
|
1743
|
+
"typescript",
|
|
1744
|
+
"javascript",
|
|
1745
|
+
"dart",
|
|
1746
|
+
"kotlin",
|
|
1747
|
+
"java",
|
|
1748
|
+
"python",
|
|
1749
|
+
"go",
|
|
1750
|
+
"swift"
|
|
1751
|
+
],
|
|
1752
|
+
"analyzer": "./rules/security/S007_no_plaintext_otp/analyzer.js",
|
|
1753
|
+
"config": "./rules/security/S007_no_plaintext_otp/config.json",
|
|
1754
|
+
"version": "1.0.0",
|
|
1755
|
+
"status": "stable",
|
|
1756
|
+
"tags": [
|
|
1757
|
+
"security",
|
|
1758
|
+
"otp",
|
|
1759
|
+
"encryption",
|
|
1760
|
+
"owasp",
|
|
1761
|
+
"cryptographic-failures",
|
|
1762
|
+
"authentication"
|
|
1763
|
+
],
|
|
1764
|
+
"strategy": {
|
|
1765
|
+
"preferred": "heuristic",
|
|
1766
|
+
"fallbacks": [
|
|
1767
|
+
"heuristic",
|
|
1768
|
+
"regex"
|
|
1769
|
+
],
|
|
1770
|
+
"accuracy": {
|
|
1771
|
+
"heuristic": 90,
|
|
1772
|
+
"regex": 75
|
|
1773
|
+
}
|
|
1774
|
+
},
|
|
1775
|
+
"engineMappings": {
|
|
1776
|
+
"heuristic": "S007_no_plaintext_otp"
|
|
1777
|
+
}
|
|
1778
|
+
},
|
|
1779
|
+
"S008": {
|
|
1780
|
+
"name": "Crypto Agility",
|
|
1781
|
+
"description": "Ensure cryptographic agility and algorithm flexibility",
|
|
1782
|
+
"category": "security",
|
|
1783
|
+
"severity": "error",
|
|
1784
|
+
"languages": [
|
|
1785
|
+
"typescript",
|
|
1786
|
+
"javascript"
|
|
1787
|
+
],
|
|
1788
|
+
"analyzer": "eslint",
|
|
1789
|
+
"eslintRule": "custom/typescript_s008",
|
|
1790
|
+
"version": "1.0.0",
|
|
1791
|
+
"status": "stable",
|
|
1792
|
+
"tags": [
|
|
1793
|
+
"security",
|
|
1794
|
+
"cryptography",
|
|
1795
|
+
"agility"
|
|
1796
|
+
]
|
|
1797
|
+
},
|
|
1798
|
+
"S009": {
|
|
1799
|
+
"name": "No Insecure Crypto",
|
|
1800
|
+
"description": "Prevent usage of insecure cryptographic methods",
|
|
651
1801
|
"category": "security",
|
|
652
1802
|
"severity": "error",
|
|
653
|
-
"languages": [
|
|
1803
|
+
"languages": [
|
|
1804
|
+
"typescript",
|
|
1805
|
+
"javascript"
|
|
1806
|
+
],
|
|
654
1807
|
"analyzer": "eslint",
|
|
655
1808
|
"eslintRule": "custom/typescript_s009",
|
|
656
1809
|
"version": "1.0.0",
|
|
657
1810
|
"status": "stable",
|
|
658
|
-
"tags": [
|
|
1811
|
+
"tags": [
|
|
1812
|
+
"security",
|
|
1813
|
+
"cryptography",
|
|
1814
|
+
"insecure"
|
|
1815
|
+
]
|
|
659
1816
|
},
|
|
660
1817
|
"S010": {
|
|
661
1818
|
"name": "No Insecure Random in Sensitive Context",
|
|
662
1819
|
"description": "Prevent insecure random generator usage in sensitive contexts",
|
|
663
1820
|
"category": "security",
|
|
664
1821
|
"severity": "error",
|
|
665
|
-
"languages": [
|
|
1822
|
+
"languages": [
|
|
1823
|
+
"typescript",
|
|
1824
|
+
"javascript"
|
|
1825
|
+
],
|
|
666
1826
|
"analyzer": "eslint",
|
|
667
1827
|
"eslintRule": "custom/typescript_s010",
|
|
668
1828
|
"version": "1.0.0",
|
|
669
1829
|
"status": "stable",
|
|
670
|
-
"tags": [
|
|
1830
|
+
"tags": [
|
|
1831
|
+
"security",
|
|
1832
|
+
"random",
|
|
1833
|
+
"sensitive"
|
|
1834
|
+
]
|
|
671
1835
|
},
|
|
672
1836
|
"S011": {
|
|
673
1837
|
"name": "No Insecure UUID",
|
|
674
1838
|
"description": "UUID must be version 4 and use CSPRNG",
|
|
675
1839
|
"category": "security",
|
|
676
1840
|
"severity": "error",
|
|
677
|
-
"languages": [
|
|
1841
|
+
"languages": [
|
|
1842
|
+
"typescript",
|
|
1843
|
+
"javascript"
|
|
1844
|
+
],
|
|
678
1845
|
"analyzer": "eslint",
|
|
679
1846
|
"eslintRule": "custom/typescript_s011",
|
|
680
1847
|
"version": "1.0.0",
|
|
681
1848
|
"status": "stable",
|
|
682
|
-
"tags": [
|
|
1849
|
+
"tags": [
|
|
1850
|
+
"security",
|
|
1851
|
+
"uuid",
|
|
1852
|
+
"random"
|
|
1853
|
+
]
|
|
683
1854
|
},
|
|
684
1855
|
"S012": {
|
|
685
1856
|
"name": "Hardcoded Secrets Protection",
|
|
686
1857
|
"description": "Detects hardcoded secrets, API keys, passwords, tokens, and credentials in source code to prevent accidental exposure through version control",
|
|
687
1858
|
"category": "security",
|
|
688
1859
|
"severity": "error",
|
|
689
|
-
"languages": [
|
|
1860
|
+
"languages": [
|
|
1861
|
+
"typescript",
|
|
1862
|
+
"javascript"
|
|
1863
|
+
],
|
|
690
1864
|
"analyzer": "./rules/security/S012_hardcoded_secrets/analyzer.js",
|
|
691
1865
|
"config": "./rules/security/S012_hardcoded_secrets/config.json",
|
|
692
1866
|
"version": "1.0.0",
|
|
693
1867
|
"status": "stable",
|
|
694
|
-
"tags": [
|
|
1868
|
+
"tags": [
|
|
1869
|
+
"security",
|
|
1870
|
+
"owasp",
|
|
1871
|
+
"secrets",
|
|
1872
|
+
"credentials",
|
|
1873
|
+
"cryptographic-failures",
|
|
1874
|
+
"hardcoded-secrets",
|
|
1875
|
+
"api-keys",
|
|
1876
|
+
"passwords",
|
|
1877
|
+
"tokens"
|
|
1878
|
+
],
|
|
695
1879
|
"strategy": {
|
|
696
1880
|
"preferred": "heuristic",
|
|
697
|
-
"fallbacks": [
|
|
1881
|
+
"fallbacks": [
|
|
1882
|
+
"heuristic"
|
|
1883
|
+
],
|
|
698
1884
|
"accuracy": {
|
|
699
1885
|
"heuristic": 92
|
|
700
1886
|
}
|
|
701
1887
|
},
|
|
702
1888
|
"engineMappings": {
|
|
703
|
-
"heuristic": [
|
|
1889
|
+
"heuristic": [
|
|
1890
|
+
"rules/security/S012_hardcoded_secrets/analyzer.js"
|
|
1891
|
+
]
|
|
704
1892
|
},
|
|
705
1893
|
"metadata": {
|
|
706
1894
|
"owaspCategory": "A02:2021 - Cryptographic Failures",
|
|
707
1895
|
"cweId": "CWE-798",
|
|
708
|
-
"frameworks": [
|
|
709
|
-
|
|
1896
|
+
"frameworks": [
|
|
1897
|
+
"Node.js",
|
|
1898
|
+
"Express",
|
|
1899
|
+
"NestJS",
|
|
1900
|
+
"Next.js",
|
|
1901
|
+
"React",
|
|
1902
|
+
"Vue",
|
|
1903
|
+
"Angular"
|
|
1904
|
+
],
|
|
1905
|
+
"secretTypes": [
|
|
1906
|
+
"API Keys",
|
|
1907
|
+
"Passwords",
|
|
1908
|
+
"Access Tokens",
|
|
1909
|
+
"Private Keys",
|
|
1910
|
+
"JWT Secrets",
|
|
1911
|
+
"Database Credentials",
|
|
1912
|
+
"OAuth Secrets",
|
|
1913
|
+
"AWS Keys",
|
|
1914
|
+
"GitHub Tokens",
|
|
1915
|
+
"Slack Tokens"
|
|
1916
|
+
],
|
|
710
1917
|
"detectionPatterns": 50,
|
|
711
1918
|
"testCases": 30
|
|
712
1919
|
}
|
|
@@ -716,39 +1923,63 @@
|
|
|
716
1923
|
"description": "Verify that TLS connections are properly established and validated",
|
|
717
1924
|
"category": "security",
|
|
718
1925
|
"severity": "error",
|
|
719
|
-
"languages": [
|
|
1926
|
+
"languages": [
|
|
1927
|
+
"typescript",
|
|
1928
|
+
"javascript"
|
|
1929
|
+
],
|
|
720
1930
|
"analyzer": "eslint",
|
|
721
1931
|
"eslintRule": "custom/typescript_s013",
|
|
722
1932
|
"version": "1.0.0",
|
|
723
1933
|
"status": "stable",
|
|
724
|
-
"tags": [
|
|
1934
|
+
"tags": [
|
|
1935
|
+
"security",
|
|
1936
|
+
"tls",
|
|
1937
|
+
"connection"
|
|
1938
|
+
]
|
|
725
1939
|
},
|
|
726
1940
|
"S014": {
|
|
727
1941
|
"name": "Insecure TLS Version",
|
|
728
1942
|
"description": "Prevent usage of insecure TLS versions",
|
|
729
1943
|
"category": "security",
|
|
730
1944
|
"severity": "error",
|
|
731
|
-
"languages": [
|
|
1945
|
+
"languages": [
|
|
1946
|
+
"typescript",
|
|
1947
|
+
"javascript"
|
|
1948
|
+
],
|
|
732
1949
|
"analyzer": "eslint",
|
|
733
1950
|
"eslintRule": "custom/typescript_s014",
|
|
734
1951
|
"version": "1.0.0",
|
|
735
1952
|
"status": "stable",
|
|
736
|
-
"tags": [
|
|
1953
|
+
"tags": [
|
|
1954
|
+
"security",
|
|
1955
|
+
"tls",
|
|
1956
|
+
"encryption"
|
|
1957
|
+
]
|
|
737
1958
|
},
|
|
738
1959
|
"S015": {
|
|
739
1960
|
"name": "Insecure TLS Certificate",
|
|
740
1961
|
"description": "Prevent usage of insecure TLS certificate configurations",
|
|
741
1962
|
"category": "security",
|
|
742
1963
|
"severity": "error",
|
|
743
|
-
"languages": [
|
|
1964
|
+
"languages": [
|
|
1965
|
+
"typescript",
|
|
1966
|
+
"javascript"
|
|
1967
|
+
],
|
|
744
1968
|
"analyzer": "eslint",
|
|
745
1969
|
"eslintRule": "custom/typescript_s015",
|
|
746
1970
|
"version": "1.0.0",
|
|
747
1971
|
"status": "stable",
|
|
748
|
-
"tags": [
|
|
1972
|
+
"tags": [
|
|
1973
|
+
"security",
|
|
1974
|
+
"tls",
|
|
1975
|
+
"certificates"
|
|
1976
|
+
],
|
|
749
1977
|
"strategy": {
|
|
750
1978
|
"preferred": "ast",
|
|
751
|
-
"fallbacks": [
|
|
1979
|
+
"fallbacks": [
|
|
1980
|
+
"ast",
|
|
1981
|
+
"regex"
|
|
1982
|
+
],
|
|
752
1983
|
"accuracy": {
|
|
753
1984
|
"ast": 95,
|
|
754
1985
|
"regex": 80
|
|
@@ -760,15 +1991,25 @@
|
|
|
760
1991
|
"description": "Prevent sensitive data in URL query parameters",
|
|
761
1992
|
"category": "security",
|
|
762
1993
|
"severity": "error",
|
|
763
|
-
"languages": [
|
|
1994
|
+
"languages": [
|
|
1995
|
+
"typescript",
|
|
1996
|
+
"javascript"
|
|
1997
|
+
],
|
|
764
1998
|
"analyzer": "./rules/security/S016_no_sensitive_querystring/analyzer.js",
|
|
765
1999
|
"config": "./rules/security/S016_no_sensitive_querystring/config.json",
|
|
766
2000
|
"version": "1.0.0",
|
|
767
2001
|
"status": "stable",
|
|
768
|
-
"tags": [
|
|
2002
|
+
"tags": [
|
|
2003
|
+
"security",
|
|
2004
|
+
"sensitive-data",
|
|
2005
|
+
"url"
|
|
2006
|
+
],
|
|
769
2007
|
"strategy": {
|
|
770
2008
|
"preferred": "ast",
|
|
771
|
-
"fallbacks": [
|
|
2009
|
+
"fallbacks": [
|
|
2010
|
+
"ast",
|
|
2011
|
+
"regex"
|
|
2012
|
+
],
|
|
772
2013
|
"accuracy": {
|
|
773
2014
|
"ast": 95,
|
|
774
2015
|
"regex": 80
|
|
@@ -780,52 +2021,95 @@
|
|
|
780
2021
|
"description": "Prevent SQL injection vulnerabilities",
|
|
781
2022
|
"category": "security",
|
|
782
2023
|
"severity": "error",
|
|
783
|
-
"languages": [
|
|
2024
|
+
"languages": [
|
|
2025
|
+
"typescript",
|
|
2026
|
+
"javascript"
|
|
2027
|
+
],
|
|
784
2028
|
"analyzer": "./rules/security/S017_use_parameterized_queries/analyzer.js",
|
|
785
2029
|
"config": "./rules/security/S017_use_parameterized_queries/config.json",
|
|
786
2030
|
"version": "1.0.0",
|
|
787
2031
|
"status": "stable",
|
|
788
|
-
"tags": [
|
|
2032
|
+
"tags": [
|
|
2033
|
+
"security",
|
|
2034
|
+
"sql-injection",
|
|
2035
|
+
"database"
|
|
2036
|
+
]
|
|
789
2037
|
},
|
|
790
2038
|
"S018": {
|
|
791
2039
|
"name": "Positive Input Validation",
|
|
792
2040
|
"description": "Ensure positive input validation patterns",
|
|
793
2041
|
"category": "security",
|
|
794
2042
|
"severity": "error",
|
|
795
|
-
"languages": [
|
|
2043
|
+
"languages": [
|
|
2044
|
+
"typescript",
|
|
2045
|
+
"javascript"
|
|
2046
|
+
],
|
|
796
2047
|
"analyzer": "eslint",
|
|
797
2048
|
"eslintRule": "custom/typescript_s018",
|
|
798
2049
|
"version": "1.0.0",
|
|
799
2050
|
"status": "stable",
|
|
800
|
-
"tags": [
|
|
2051
|
+
"tags": [
|
|
2052
|
+
"security",
|
|
2053
|
+
"validation",
|
|
2054
|
+
"input"
|
|
2055
|
+
]
|
|
801
2056
|
},
|
|
802
2057
|
"S019": {
|
|
803
2058
|
"name": "SMTP Injection Protection",
|
|
804
2059
|
"description": "Detects potential SMTP/IMAP injection vulnerabilities by identifying unsanitized user input in email fields and direct SMTP protocol manipulation",
|
|
805
2060
|
"category": "security",
|
|
806
2061
|
"severity": "error",
|
|
807
|
-
"languages": [
|
|
2062
|
+
"languages": [
|
|
2063
|
+
"typescript",
|
|
2064
|
+
"javascript"
|
|
2065
|
+
],
|
|
808
2066
|
"analyzer": "./rules/security/S019_smtp_injection_protection/analyzer.js",
|
|
809
2067
|
"config": "./rules/security/S019_smtp_injection_protection/config.json",
|
|
810
2068
|
"version": "1.0.0",
|
|
811
2069
|
"status": "stable",
|
|
812
|
-
"tags": [
|
|
2070
|
+
"tags": [
|
|
2071
|
+
"security",
|
|
2072
|
+
"owasp",
|
|
2073
|
+
"injection",
|
|
2074
|
+
"smtp",
|
|
2075
|
+
"email",
|
|
2076
|
+
"crlf"
|
|
2077
|
+
],
|
|
813
2078
|
"strategy": {
|
|
814
2079
|
"preferred": "heuristic",
|
|
815
|
-
"fallbacks": [
|
|
2080
|
+
"fallbacks": [
|
|
2081
|
+
"heuristic"
|
|
2082
|
+
],
|
|
816
2083
|
"accuracy": {
|
|
817
2084
|
"heuristic": 90
|
|
818
2085
|
}
|
|
819
2086
|
},
|
|
820
2087
|
"engineMappings": {
|
|
821
|
-
"heuristic": [
|
|
2088
|
+
"heuristic": [
|
|
2089
|
+
"rules/security/S019_smtp_injection_protection/analyzer.js"
|
|
2090
|
+
]
|
|
822
2091
|
},
|
|
823
2092
|
"metadata": {
|
|
824
2093
|
"owaspCategory": "A03:2021 - Injection",
|
|
825
2094
|
"cweId": "CWE-93, CWE-144",
|
|
826
|
-
"frameworks": [
|
|
827
|
-
|
|
828
|
-
|
|
2095
|
+
"frameworks": [
|
|
2096
|
+
"Node.js",
|
|
2097
|
+
"Express",
|
|
2098
|
+
"NestJS",
|
|
2099
|
+
"Next.js"
|
|
2100
|
+
],
|
|
2101
|
+
"emailLibraries": [
|
|
2102
|
+
"nodemailer",
|
|
2103
|
+
"sendgrid",
|
|
2104
|
+
"mailgun",
|
|
2105
|
+
"aws-ses",
|
|
2106
|
+
"postmark"
|
|
2107
|
+
],
|
|
2108
|
+
"detectionTypes": [
|
|
2109
|
+
"Unsanitized email fields",
|
|
2110
|
+
"SMTP command injection",
|
|
2111
|
+
"CRLF injection"
|
|
2112
|
+
],
|
|
829
2113
|
"testCases": 40
|
|
830
2114
|
}
|
|
831
2115
|
},
|
|
@@ -834,45 +2118,34 @@
|
|
|
834
2118
|
"description": "Avoid using eval() or executing dynamic code as it can lead to code injection vulnerabilities and compromise application security.",
|
|
835
2119
|
"category": "security",
|
|
836
2120
|
"severity": "error",
|
|
837
|
-
"languages": [
|
|
2121
|
+
"languages": [
|
|
2122
|
+
"typescript",
|
|
2123
|
+
"javascript"
|
|
2124
|
+
],
|
|
838
2125
|
"analyzer": "./rules/security/S020_no_eval_dynamic_code/analyzer.js",
|
|
839
2126
|
"config": "./rules/security/S020_no_eval_dynamic_code/config.json",
|
|
840
2127
|
"version": "1.0.0",
|
|
841
2128
|
"status": "experimental",
|
|
842
|
-
"tags": ["security", "eval", "dynamic-execution", "code-injection"],
|
|
843
|
-
"strategy": {
|
|
844
|
-
"preferred": "ast",
|
|
845
|
-
"fallbacks": ["ast", "regex"],
|
|
846
|
-
"accuracy": { "ast": 95, "regex": 85 }
|
|
847
|
-
},
|
|
848
|
-
"engineMappings": {
|
|
849
|
-
"heuristic": ["rules/security/S020_no_eval_dynamic_code/analyzer.js"]
|
|
850
|
-
}
|
|
851
|
-
},
|
|
852
|
-
"S030": {
|
|
853
|
-
"name": "Disable directory browsing and protect sensitive metadata files",
|
|
854
|
-
"description": "Disable directory browsing and protect sensitive metadata files (.git/, .env, config files, etc.) to prevent information disclosure and potential security vulnerabilities.",
|
|
855
|
-
"category": "security",
|
|
856
|
-
"severity": "error",
|
|
857
|
-
"languages": ["typescript", "javascript"],
|
|
858
|
-
"analyzer": "./rules/security/S030_directory_browsing_protection/analyzer.js",
|
|
859
|
-
"config": "./rules/security/S030_directory_browsing_protection/config.json",
|
|
860
|
-
"version": "1.0.0",
|
|
861
|
-
"status": "experimental",
|
|
862
2129
|
"tags": [
|
|
863
2130
|
"security",
|
|
864
|
-
"
|
|
865
|
-
"
|
|
866
|
-
"
|
|
2131
|
+
"eval",
|
|
2132
|
+
"dynamic-execution",
|
|
2133
|
+
"code-injection"
|
|
867
2134
|
],
|
|
868
2135
|
"strategy": {
|
|
869
2136
|
"preferred": "ast",
|
|
870
|
-
"fallbacks": [
|
|
871
|
-
|
|
2137
|
+
"fallbacks": [
|
|
2138
|
+
"ast",
|
|
2139
|
+
"regex"
|
|
2140
|
+
],
|
|
2141
|
+
"accuracy": {
|
|
2142
|
+
"ast": 95,
|
|
2143
|
+
"regex": 85
|
|
2144
|
+
}
|
|
872
2145
|
},
|
|
873
2146
|
"engineMappings": {
|
|
874
2147
|
"heuristic": [
|
|
875
|
-
"rules/security/
|
|
2148
|
+
"rules/security/S020_no_eval_dynamic_code/analyzer.js"
|
|
876
2149
|
]
|
|
877
2150
|
}
|
|
878
2151
|
},
|
|
@@ -881,27 +2154,44 @@
|
|
|
881
2154
|
"description": "Require output encoding for user input",
|
|
882
2155
|
"category": "security",
|
|
883
2156
|
"severity": "error",
|
|
884
|
-
"languages": [
|
|
2157
|
+
"languages": [
|
|
2158
|
+
"typescript",
|
|
2159
|
+
"javascript"
|
|
2160
|
+
],
|
|
885
2161
|
"analyzer": "eslint",
|
|
886
2162
|
"eslintRule": "custom/typescript_s022",
|
|
887
2163
|
"version": "1.0.0",
|
|
888
2164
|
"status": "stable",
|
|
889
|
-
"tags": [
|
|
2165
|
+
"tags": [
|
|
2166
|
+
"security",
|
|
2167
|
+
"encoding",
|
|
2168
|
+
"xss"
|
|
2169
|
+
]
|
|
890
2170
|
},
|
|
891
2171
|
"S023": {
|
|
892
2172
|
"name": "No JSON Injection",
|
|
893
2173
|
"description": "Prevent JSON injection vulnerabilities",
|
|
894
2174
|
"category": "security",
|
|
895
2175
|
"severity": "error",
|
|
896
|
-
"languages": [
|
|
2176
|
+
"languages": [
|
|
2177
|
+
"typescript",
|
|
2178
|
+
"javascript"
|
|
2179
|
+
],
|
|
897
2180
|
"analyzer": "eslint",
|
|
898
2181
|
"eslintRule": "custom/typescript_s023",
|
|
899
2182
|
"version": "1.0.0",
|
|
900
2183
|
"status": "stable",
|
|
901
|
-
"tags": [
|
|
2184
|
+
"tags": [
|
|
2185
|
+
"security",
|
|
2186
|
+
"json",
|
|
2187
|
+
"injection"
|
|
2188
|
+
],
|
|
902
2189
|
"strategy": {
|
|
903
2190
|
"preferred": "ast",
|
|
904
|
-
"fallbacks": [
|
|
2191
|
+
"fallbacks": [
|
|
2192
|
+
"ast",
|
|
2193
|
+
"regex"
|
|
2194
|
+
],
|
|
905
2195
|
"accuracy": {
|
|
906
2196
|
"ast": 95,
|
|
907
2197
|
"regex": 60
|
|
@@ -913,22 +2203,37 @@
|
|
|
913
2203
|
"description": "Protect against XPath Injection and XML External Entity (XXE) attacks. XPath injection occurs when user input is used to construct XPath queries without proper sanitization. XXE attacks exploit XML parsers that process external entities, potentially leading to data disclosure, server-side request forgery, or denial of service.",
|
|
914
2204
|
"category": "security",
|
|
915
2205
|
"severity": "error",
|
|
916
|
-
"languages": [
|
|
2206
|
+
"languages": [
|
|
2207
|
+
"typescript",
|
|
2208
|
+
"javascript"
|
|
2209
|
+
],
|
|
917
2210
|
"analyzer": "./rules/security/S024_xpath_xxe_protection/analyzer.js",
|
|
918
2211
|
"config": "./rules/security/S024_xpath_xxe_protection/config.json",
|
|
919
2212
|
"version": "1.0.0",
|
|
920
2213
|
"status": "stable",
|
|
921
|
-
"tags": [
|
|
2214
|
+
"tags": [
|
|
2215
|
+
"security",
|
|
2216
|
+
"xpath",
|
|
2217
|
+
"xxe",
|
|
2218
|
+
"xml",
|
|
2219
|
+
"injection",
|
|
2220
|
+
"owasp"
|
|
2221
|
+
],
|
|
922
2222
|
"strategy": {
|
|
923
2223
|
"preferred": "ast",
|
|
924
|
-
"fallbacks": [
|
|
2224
|
+
"fallbacks": [
|
|
2225
|
+
"ast",
|
|
2226
|
+
"regex"
|
|
2227
|
+
],
|
|
925
2228
|
"accuracy": {
|
|
926
2229
|
"ast": 95,
|
|
927
2230
|
"regex": 85
|
|
928
2231
|
}
|
|
929
2232
|
},
|
|
930
2233
|
"engineMappings": {
|
|
931
|
-
"heuristic": [
|
|
2234
|
+
"heuristic": [
|
|
2235
|
+
"rules/security/S024_xpath_xxe_protection/analyzer.js"
|
|
2236
|
+
]
|
|
932
2237
|
}
|
|
933
2238
|
},
|
|
934
2239
|
"S025": {
|
|
@@ -936,7 +2241,10 @@
|
|
|
936
2241
|
"description": "Ensure all client-side data is validated on the server. Client-side validation is not sufficient for security as it can be bypassed by attackers. Server-side validation is mandatory for data integrity and security.",
|
|
937
2242
|
"category": "security",
|
|
938
2243
|
"severity": "error",
|
|
939
|
-
"languages": [
|
|
2244
|
+
"languages": [
|
|
2245
|
+
"typescript",
|
|
2246
|
+
"javascript"
|
|
2247
|
+
],
|
|
940
2248
|
"analyzer": "./rules/security/S025_server_side_validation/analyzer.js",
|
|
941
2249
|
"config": "./rules/security/S025_server_side_validation/config.json",
|
|
942
2250
|
"version": "1.0.0",
|
|
@@ -950,14 +2258,19 @@
|
|
|
950
2258
|
],
|
|
951
2259
|
"strategy": {
|
|
952
2260
|
"preferred": "ast",
|
|
953
|
-
"fallbacks": [
|
|
2261
|
+
"fallbacks": [
|
|
2262
|
+
"ast",
|
|
2263
|
+
"regex"
|
|
2264
|
+
],
|
|
954
2265
|
"accuracy": {
|
|
955
2266
|
"ast": 95,
|
|
956
2267
|
"regex": 85
|
|
957
2268
|
}
|
|
958
2269
|
},
|
|
959
2270
|
"engineMappings": {
|
|
960
|
-
"heuristic": [
|
|
2271
|
+
"heuristic": [
|
|
2272
|
+
"rules/security/S025_server_side_validation/analyzer.js"
|
|
2273
|
+
]
|
|
961
2274
|
}
|
|
962
2275
|
},
|
|
963
2276
|
"S026": {
|
|
@@ -965,31 +2278,49 @@
|
|
|
965
2278
|
"description": "Require JSON schema validation",
|
|
966
2279
|
"category": "security",
|
|
967
2280
|
"severity": "warning",
|
|
968
|
-
"languages": [
|
|
2281
|
+
"languages": [
|
|
2282
|
+
"typescript",
|
|
2283
|
+
"javascript"
|
|
2284
|
+
],
|
|
969
2285
|
"analyzer": "eslint",
|
|
970
2286
|
"eslintRule": "custom/typescript_s026",
|
|
971
2287
|
"version": "1.0.0",
|
|
972
2288
|
"status": "stable",
|
|
973
|
-
"tags": [
|
|
2289
|
+
"tags": [
|
|
2290
|
+
"security",
|
|
2291
|
+
"validation",
|
|
2292
|
+
"json-schema"
|
|
2293
|
+
]
|
|
974
2294
|
},
|
|
975
2295
|
"S027": {
|
|
976
2296
|
"name": "No Hardcoded Secrets Advanced",
|
|
977
2297
|
"description": "Advanced detection of hardcoded secrets",
|
|
978
2298
|
"category": "security",
|
|
979
2299
|
"severity": "error",
|
|
980
|
-
"languages": [
|
|
2300
|
+
"languages": [
|
|
2301
|
+
"typescript",
|
|
2302
|
+
"javascript"
|
|
2303
|
+
],
|
|
981
2304
|
"analyzer": "eslint",
|
|
982
2305
|
"eslintRule": "custom/typescript_s027",
|
|
983
2306
|
"version": "1.0.0",
|
|
984
2307
|
"status": "stable",
|
|
985
|
-
"tags": [
|
|
2308
|
+
"tags": [
|
|
2309
|
+
"security",
|
|
2310
|
+
"secrets",
|
|
2311
|
+
"hardcoded"
|
|
2312
|
+
]
|
|
986
2313
|
},
|
|
987
2314
|
"S028": {
|
|
988
2315
|
"name": "Limit upload file size and number of files per user",
|
|
989
2316
|
"description": "File uploads must enforce size limits and file quantity limits to prevent resource exhaustion and DoS attacks. Both file size and number of files should be limited at the server-side.",
|
|
990
2317
|
"category": "security",
|
|
991
2318
|
"severity": "error",
|
|
992
|
-
"languages": [
|
|
2319
|
+
"languages": [
|
|
2320
|
+
"typescript",
|
|
2321
|
+
"javascript",
|
|
2322
|
+
"java"
|
|
2323
|
+
],
|
|
993
2324
|
"analyzer": "./rules/security/S028_file_upload_size_limits/analyzer.js",
|
|
994
2325
|
"version": "1.0.0",
|
|
995
2326
|
"status": "stable",
|
|
@@ -1006,34 +2337,91 @@
|
|
|
1006
2337
|
"description": "Require CSRF protection for state-changing operations",
|
|
1007
2338
|
"category": "security",
|
|
1008
2339
|
"severity": "error",
|
|
1009
|
-
"languages": [
|
|
2340
|
+
"languages": [
|
|
2341
|
+
"typescript",
|
|
2342
|
+
"javascript"
|
|
2343
|
+
],
|
|
1010
2344
|
"analyzer": "eslint",
|
|
1011
2345
|
"eslintRule": "custom/typescript_s029",
|
|
1012
2346
|
"version": "1.0.0",
|
|
1013
2347
|
"status": "stable",
|
|
1014
|
-
"tags": [
|
|
2348
|
+
"tags": [
|
|
2349
|
+
"security",
|
|
2350
|
+
"csrf",
|
|
2351
|
+
"protection"
|
|
2352
|
+
]
|
|
2353
|
+
},
|
|
2354
|
+
"S030": {
|
|
2355
|
+
"name": "Disable directory browsing and protect sensitive metadata files",
|
|
2356
|
+
"description": "Disable directory browsing and protect sensitive metadata files (.git/, .env, config files, etc.) to prevent information disclosure and potential security vulnerabilities.",
|
|
2357
|
+
"category": "security",
|
|
2358
|
+
"severity": "error",
|
|
2359
|
+
"languages": [
|
|
2360
|
+
"typescript",
|
|
2361
|
+
"javascript"
|
|
2362
|
+
],
|
|
2363
|
+
"analyzer": "./rules/security/S030_directory_browsing_protection/analyzer.js",
|
|
2364
|
+
"config": "./rules/security/S030_directory_browsing_protection/config.json",
|
|
2365
|
+
"version": "1.0.0",
|
|
2366
|
+
"status": "experimental",
|
|
2367
|
+
"tags": [
|
|
2368
|
+
"security",
|
|
2369
|
+
"directory-browsing",
|
|
2370
|
+
"information-disclosure",
|
|
2371
|
+
"metadata-protection"
|
|
2372
|
+
],
|
|
2373
|
+
"strategy": {
|
|
2374
|
+
"preferred": "ast",
|
|
2375
|
+
"fallbacks": [
|
|
2376
|
+
"ast",
|
|
2377
|
+
"regex"
|
|
2378
|
+
],
|
|
2379
|
+
"accuracy": {
|
|
2380
|
+
"ast": 90,
|
|
2381
|
+
"regex": 75
|
|
2382
|
+
}
|
|
2383
|
+
},
|
|
2384
|
+
"engineMappings": {
|
|
2385
|
+
"heuristic": [
|
|
2386
|
+
"rules/security/S030_directory_browsing_protection/analyzer.js"
|
|
2387
|
+
]
|
|
2388
|
+
}
|
|
1015
2389
|
},
|
|
1016
2390
|
"S031": {
|
|
1017
2391
|
"name": "Set Secure flag for Session Cookies",
|
|
1018
2392
|
"description": "Set Secure flag for Session Cookies to protect via HTTPS. This ensures cookies are only transmitted over secure connections, preventing interception.",
|
|
1019
2393
|
"category": "security",
|
|
1020
2394
|
"severity": "error",
|
|
1021
|
-
"languages": [
|
|
2395
|
+
"languages": [
|
|
2396
|
+
"typescript",
|
|
2397
|
+
"javascript"
|
|
2398
|
+
],
|
|
1022
2399
|
"analyzer": "./rules/security/S031_secure_session_cookies/analyzer.js",
|
|
1023
2400
|
"config": "./rules/security/S031_secure_session_cookies/config.json",
|
|
1024
2401
|
"version": "1.0.0",
|
|
1025
2402
|
"status": "stable",
|
|
1026
|
-
"tags": [
|
|
2403
|
+
"tags": [
|
|
2404
|
+
"security",
|
|
2405
|
+
"cookies",
|
|
2406
|
+
"session",
|
|
2407
|
+
"https",
|
|
2408
|
+
"secure"
|
|
2409
|
+
],
|
|
1027
2410
|
"strategy": {
|
|
1028
2411
|
"preferred": "ast",
|
|
1029
|
-
"fallbacks": [
|
|
2412
|
+
"fallbacks": [
|
|
2413
|
+
"ast",
|
|
2414
|
+
"regex"
|
|
2415
|
+
],
|
|
1030
2416
|
"accuracy": {
|
|
1031
2417
|
"ast": 95,
|
|
1032
2418
|
"regex": 85
|
|
1033
2419
|
}
|
|
1034
2420
|
},
|
|
1035
2421
|
"engineMappings": {
|
|
1036
|
-
"heuristic": [
|
|
2422
|
+
"heuristic": [
|
|
2423
|
+
"rules/security/S031_secure_session_cookies/analyzer.js"
|
|
2424
|
+
]
|
|
1037
2425
|
}
|
|
1038
2426
|
},
|
|
1039
2427
|
"S032": {
|
|
@@ -1041,15 +2429,27 @@
|
|
|
1041
2429
|
"description": "Set HttpOnly attribute for Session Cookies to prevent JavaScript access. This protects against XSS attacks by preventing client-side script access to sensitive cookies.",
|
|
1042
2430
|
"category": "security",
|
|
1043
2431
|
"severity": "error",
|
|
1044
|
-
"languages": [
|
|
2432
|
+
"languages": [
|
|
2433
|
+
"typescript",
|
|
2434
|
+
"javascript"
|
|
2435
|
+
],
|
|
1045
2436
|
"analyzer": "./rules/security/S032_httponly_session_cookies/analyzer.js",
|
|
1046
2437
|
"config": "./rules/security/S032_httponly_session_cookies/config.json",
|
|
1047
2438
|
"version": "1.0.0",
|
|
1048
2439
|
"status": "stable",
|
|
1049
|
-
"tags": [
|
|
2440
|
+
"tags": [
|
|
2441
|
+
"security",
|
|
2442
|
+
"cookies",
|
|
2443
|
+
"session",
|
|
2444
|
+
"httponly",
|
|
2445
|
+
"xss"
|
|
2446
|
+
],
|
|
1050
2447
|
"strategy": {
|
|
1051
2448
|
"preferred": "ast",
|
|
1052
|
-
"fallbacks": [
|
|
2449
|
+
"fallbacks": [
|
|
2450
|
+
"ast",
|
|
2451
|
+
"regex"
|
|
2452
|
+
],
|
|
1053
2453
|
"accuracy": {
|
|
1054
2454
|
"ast": 95,
|
|
1055
2455
|
"regex": 85
|
|
@@ -1066,15 +2466,27 @@
|
|
|
1066
2466
|
"description": "Set SameSite attribute for Session Cookies to reduce CSRF risk. This prevents the browser from sending cookies along with cross-site requests, mitigating CSRF attacks.",
|
|
1067
2467
|
"category": "security",
|
|
1068
2468
|
"severity": "error",
|
|
1069
|
-
"languages": [
|
|
2469
|
+
"languages": [
|
|
2470
|
+
"typescript",
|
|
2471
|
+
"javascript"
|
|
2472
|
+
],
|
|
1070
2473
|
"analyzer": "./rules/security/S033_samesite_session_cookies/analyzer.js",
|
|
1071
2474
|
"config": "./rules/security/S033_samesite_session_cookies/config.json",
|
|
1072
2475
|
"version": "1.0.0",
|
|
1073
2476
|
"status": "stable",
|
|
1074
|
-
"tags": [
|
|
2477
|
+
"tags": [
|
|
2478
|
+
"security",
|
|
2479
|
+
"cookies",
|
|
2480
|
+
"session",
|
|
2481
|
+
"samesite",
|
|
2482
|
+
"csrf"
|
|
2483
|
+
],
|
|
1075
2484
|
"strategy": {
|
|
1076
2485
|
"preferred": "ast",
|
|
1077
|
-
"fallbacks": [
|
|
2486
|
+
"fallbacks": [
|
|
2487
|
+
"ast",
|
|
2488
|
+
"regex"
|
|
2489
|
+
],
|
|
1078
2490
|
"accuracy": {
|
|
1079
2491
|
"ast": 95,
|
|
1080
2492
|
"regex": 85
|
|
@@ -1091,15 +2503,27 @@
|
|
|
1091
2503
|
"description": "Use __Host- prefix for Session Cookies to prevent subdomain sharing. The __Host- prefix ensures cookies are only sent to the exact domain that set them, preventing subdomain cookie sharing attacks.",
|
|
1092
2504
|
"category": "security",
|
|
1093
2505
|
"severity": "warning",
|
|
1094
|
-
"languages": [
|
|
2506
|
+
"languages": [
|
|
2507
|
+
"typescript",
|
|
2508
|
+
"javascript"
|
|
2509
|
+
],
|
|
1095
2510
|
"analyzer": "./rules/security/S034_host_prefix_session_cookies/analyzer.js",
|
|
1096
2511
|
"config": "./rules/security/S034_host_prefix_session_cookies/config.json",
|
|
1097
2512
|
"version": "1.0.0",
|
|
1098
2513
|
"status": "stable",
|
|
1099
|
-
"tags": [
|
|
2514
|
+
"tags": [
|
|
2515
|
+
"security",
|
|
2516
|
+
"cookies",
|
|
2517
|
+
"session",
|
|
2518
|
+
"host-prefix",
|
|
2519
|
+
"subdomain"
|
|
2520
|
+
],
|
|
1100
2521
|
"strategy": {
|
|
1101
2522
|
"preferred": "ast",
|
|
1102
|
-
"fallbacks": [
|
|
2523
|
+
"fallbacks": [
|
|
2524
|
+
"ast",
|
|
2525
|
+
"regex"
|
|
2526
|
+
],
|
|
1103
2527
|
"accuracy": {
|
|
1104
2528
|
"ast": 95,
|
|
1105
2529
|
"regex": 85
|
|
@@ -1116,50 +2540,84 @@
|
|
|
1116
2540
|
"description": "Set Path attribute for Session Cookies to limit access scope",
|
|
1117
2541
|
"category": "security",
|
|
1118
2542
|
"severity": "warning",
|
|
1119
|
-
"languages": [
|
|
2543
|
+
"languages": [
|
|
2544
|
+
"typescript",
|
|
2545
|
+
"javascript"
|
|
2546
|
+
],
|
|
1120
2547
|
"analyzer": "heuristic",
|
|
1121
2548
|
"version": "1.0.0",
|
|
1122
2549
|
"status": "stable",
|
|
1123
|
-
"tags": [
|
|
2550
|
+
"tags": [
|
|
2551
|
+
"security",
|
|
2552
|
+
"cookies",
|
|
2553
|
+
"path"
|
|
2554
|
+
],
|
|
1124
2555
|
"strategy": {
|
|
1125
2556
|
"defaultEngine": "heuristic",
|
|
1126
2557
|
"engineMappings": {
|
|
1127
|
-
"heuristic": [
|
|
2558
|
+
"heuristic": [
|
|
2559
|
+
"rules/security/S035_path_session_cookies/analyzer.js"
|
|
2560
|
+
]
|
|
1128
2561
|
}
|
|
1129
2562
|
},
|
|
1130
2563
|
"configPath": "rules/security/S035_path_session_cookies/config.json",
|
|
1131
|
-
"analyzerPath": [
|
|
2564
|
+
"analyzerPath": [
|
|
2565
|
+
"rules/security/S035_path_session_cookies/analyzer.js"
|
|
2566
|
+
]
|
|
1132
2567
|
},
|
|
1133
2568
|
"S036": {
|
|
1134
2569
|
"name": "No Unsafe File Include",
|
|
1135
2570
|
"description": "Prevent unsafe file inclusion vulnerabilities",
|
|
1136
2571
|
"category": "security",
|
|
1137
2572
|
"severity": "error",
|
|
1138
|
-
"languages": [
|
|
2573
|
+
"languages": [
|
|
2574
|
+
"typescript",
|
|
2575
|
+
"javascript"
|
|
2576
|
+
],
|
|
1139
2577
|
"analyzer": "eslint",
|
|
1140
2578
|
"eslintRule": "custom/typescript_s036",
|
|
1141
2579
|
"version": "1.0.0",
|
|
1142
2580
|
"status": "stable",
|
|
1143
|
-
"tags": [
|
|
2581
|
+
"tags": [
|
|
2582
|
+
"security",
|
|
2583
|
+
"file-inclusion",
|
|
2584
|
+
"path-traversal"
|
|
2585
|
+
]
|
|
1144
2586
|
},
|
|
1145
2587
|
"S037": {
|
|
1146
2588
|
"name": "Configure comprehensive cache headers to prevent sensitive data leakage",
|
|
1147
2589
|
"description": "Configure comprehensive cache headers (Cache-Control: no-store, no-cache, must-revalidate, Pragma: no-cache, Expires: 0) for sensitive responses to avoid caching sensitive data in browsers or intermediaries.",
|
|
1148
2590
|
"category": "security",
|
|
1149
2591
|
"severity": "warning",
|
|
1150
|
-
"languages": [
|
|
2592
|
+
"languages": [
|
|
2593
|
+
"typescript",
|
|
2594
|
+
"javascript"
|
|
2595
|
+
],
|
|
1151
2596
|
"analyzer": "./rules/security/S037_cache_headers/analyzer.js",
|
|
1152
2597
|
"config": "./rules/security/S037_cache_headers/config.json",
|
|
1153
2598
|
"version": "1.0.0",
|
|
1154
2599
|
"status": "experimental",
|
|
1155
|
-
"tags": [
|
|
2600
|
+
"tags": [
|
|
2601
|
+
"security",
|
|
2602
|
+
"caching",
|
|
2603
|
+
"headers",
|
|
2604
|
+
"privacy"
|
|
2605
|
+
],
|
|
1156
2606
|
"strategy": {
|
|
1157
2607
|
"preferred": "ast",
|
|
1158
|
-
"fallbacks": [
|
|
1159
|
-
|
|
2608
|
+
"fallbacks": [
|
|
2609
|
+
"ast",
|
|
2610
|
+
"regex"
|
|
2611
|
+
],
|
|
2612
|
+
"accuracy": {
|
|
2613
|
+
"ast": 90,
|
|
2614
|
+
"regex": 75
|
|
2615
|
+
}
|
|
1160
2616
|
},
|
|
1161
2617
|
"engineMappings": {
|
|
1162
|
-
"heuristic": [
|
|
2618
|
+
"heuristic": [
|
|
2619
|
+
"rules/security/S037_cache_headers/analyzer.js"
|
|
2620
|
+
]
|
|
1163
2621
|
}
|
|
1164
2622
|
},
|
|
1165
2623
|
"S038": {
|
|
@@ -1167,19 +2625,35 @@
|
|
|
1167
2625
|
"description": "Prevent exposure of server version information through response headers (Server, X-Powered-By, X-AspNet-Version, etc.) to reduce information disclosure and potential attack vectors.",
|
|
1168
2626
|
"category": "security",
|
|
1169
2627
|
"severity": "warning",
|
|
1170
|
-
"languages": [
|
|
2628
|
+
"languages": [
|
|
2629
|
+
"typescript",
|
|
2630
|
+
"javascript"
|
|
2631
|
+
],
|
|
1171
2632
|
"analyzer": "./rules/security/S038_no_version_headers/analyzer.js",
|
|
1172
2633
|
"config": "./rules/security/S038_no_version_headers/config.json",
|
|
1173
2634
|
"version": "1.0.0",
|
|
1174
2635
|
"status": "experimental",
|
|
1175
|
-
"tags": [
|
|
2636
|
+
"tags": [
|
|
2637
|
+
"security",
|
|
2638
|
+
"information-disclosure",
|
|
2639
|
+
"version",
|
|
2640
|
+
"headers"
|
|
2641
|
+
],
|
|
1176
2642
|
"strategy": {
|
|
1177
2643
|
"preferred": "ast",
|
|
1178
|
-
"fallbacks": [
|
|
1179
|
-
|
|
2644
|
+
"fallbacks": [
|
|
2645
|
+
"ast",
|
|
2646
|
+
"regex"
|
|
2647
|
+
],
|
|
2648
|
+
"accuracy": {
|
|
2649
|
+
"ast": 90,
|
|
2650
|
+
"regex": 75
|
|
2651
|
+
}
|
|
1180
2652
|
},
|
|
1181
2653
|
"engineMappings": {
|
|
1182
|
-
"heuristic": [
|
|
2654
|
+
"heuristic": [
|
|
2655
|
+
"rules/security/S038_no_version_headers/analyzer.js"
|
|
2656
|
+
]
|
|
1183
2657
|
}
|
|
1184
2658
|
},
|
|
1185
2659
|
"S039": {
|
|
@@ -1187,7 +2661,10 @@
|
|
|
1187
2661
|
"description": "Detects when session tokens, authentication tokens, JWT tokens, or other sensitive authentication data are passed as URL parameters instead of secure headers or request body. URL parameters are logged in web server logs, browser history, and can be exposed in referrer headers.",
|
|
1188
2662
|
"category": "security",
|
|
1189
2663
|
"severity": "warning",
|
|
1190
|
-
"languages": [
|
|
2664
|
+
"languages": [
|
|
2665
|
+
"typescript",
|
|
2666
|
+
"javascript"
|
|
2667
|
+
],
|
|
1191
2668
|
"analyzer": "./rules/security/S039_no_session_tokens_in_url/analyzer.js",
|
|
1192
2669
|
"config": "./rules/security/S039_no_session_tokens_in_url/config.json",
|
|
1193
2670
|
"version": "1.0.0",
|
|
@@ -1200,304 +2677,48 @@
|
|
|
1200
2677
|
],
|
|
1201
2678
|
"strategy": {
|
|
1202
2679
|
"preferred": "ast",
|
|
1203
|
-
"fallbacks": [
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
"heuristic": [
|
|
1208
|
-
"rules/security/S039_no_session_tokens_in_url/analyzer.js"
|
|
1209
|
-
]
|
|
1210
|
-
}
|
|
1211
|
-
},
|
|
1212
|
-
"S041": {
|
|
1213
|
-
"name": "Session Tokens must be invalidated after logout or expiration",
|
|
1214
|
-
"description": "Session tokens must be properly invalidated after logout or expiration to prevent session hijacking and unauthorized access. This includes clearing session data, invalidating JWT tokens, and ensuring proper session cleanup.",
|
|
1215
|
-
"category": "security",
|
|
1216
|
-
"severity": "error",
|
|
1217
|
-
"languages": ["typescript", "javascript"],
|
|
1218
|
-
"analyzer": "./rules/security/S041_session_token_invalidation/analyzer.js",
|
|
1219
|
-
"config": "./rules/security/S041_session_token_invalidation/config.json",
|
|
1220
|
-
"version": "1.0.0",
|
|
1221
|
-
"status": "stable",
|
|
1222
|
-
"tags": ["security", "session", "token", "logout", "invalidation", "owasp"],
|
|
1223
|
-
"strategy": {
|
|
1224
|
-
"preferred": "ast",
|
|
1225
|
-
"fallbacks": ["ast", "regex"],
|
|
1226
|
-
"accuracy": {
|
|
1227
|
-
"ast": 95,
|
|
1228
|
-
"regex": 85
|
|
1229
|
-
}
|
|
1230
|
-
},
|
|
1231
|
-
"engineMappings": {
|
|
1232
|
-
"heuristic": ["rules/security/S041_session_token_invalidation/analyzer.js"]
|
|
1233
|
-
}
|
|
1234
|
-
},
|
|
1235
|
-
"S042": {
|
|
1236
|
-
"name": "Require Periodic Reauthentication",
|
|
1237
|
-
"description": "Require periodic re-authentication for sensitive operations",
|
|
1238
|
-
"category": "security",
|
|
1239
|
-
"severity": "error",
|
|
1240
|
-
"languages": ["typescript", "javascript"],
|
|
1241
|
-
"analyzer": "./rules/security/S042_require_re_authentication_for_long_lived/analyzer.js",
|
|
1242
|
-
"config": "./rules/security/S042_require_re_authentication_for_long_lived/config.json",
|
|
1243
|
-
"eslintRule": "custom/typescript_s042",
|
|
1244
|
-
"version": "1.0.0",
|
|
1245
|
-
"status": "stable",
|
|
1246
|
-
"tags": ["security", "authentication", "periodic"]
|
|
1247
|
-
},
|
|
1248
|
-
"S043": {
|
|
1249
|
-
"name": "Terminate Sessions on Password Change",
|
|
1250
|
-
"description": "Terminate all sessions when password changes",
|
|
1251
|
-
"category": "security",
|
|
1252
|
-
"severity": "error",
|
|
1253
|
-
"languages": ["typescript", "javascript"],
|
|
1254
|
-
"analyzer": "./rules/security/S043_password_changes_invalidate_all_sessions/analyzer.js",
|
|
1255
|
-
"config": "./rules/security/S043_password_changes_invalidate_all_sessions/config.json",
|
|
1256
|
-
"eslintRule": "custom/typescript_s043",
|
|
1257
|
-
"version": "1.0.0",
|
|
1258
|
-
"status": "stable",
|
|
1259
|
-
"tags": ["security", "session", "password"]
|
|
1260
|
-
},
|
|
1261
|
-
"S044": {
|
|
1262
|
-
"name": "Re-authentication Required for Sensitive Operations",
|
|
1263
|
-
"description": "Require re-authentication before performing sensitive operations such as password changes, email changes, profile updates, and other critical account modifications. This prevents unauthorized access to sensitive account functions even if a session is compromised.",
|
|
1264
|
-
"category": "security",
|
|
1265
|
-
"severity": "error",
|
|
1266
|
-
"languages": ["typescript", "javascript"],
|
|
1267
|
-
"analyzer": "./rules/security/S044_re_authentication_required/analyzer.js",
|
|
1268
|
-
"config": "./rules/security/S044_re_authentication_required/config.json",
|
|
1269
|
-
"version": "1.0.0",
|
|
1270
|
-
"status": "stable",
|
|
1271
|
-
"tags": ["security", "authentication", "re-authentication", "sensitive-operations", "owasp"],
|
|
1272
|
-
"strategy": {
|
|
1273
|
-
"preferred": "ast",
|
|
1274
|
-
"fallbacks": ["ast", "regex"],
|
|
1275
|
-
"accuracy": {
|
|
1276
|
-
"ast": 95,
|
|
1277
|
-
"regex": 85
|
|
1278
|
-
}
|
|
1279
|
-
},
|
|
1280
|
-
"engineMappings": {
|
|
1281
|
-
"heuristic": ["rules/security/S044_re_authentication_required/analyzer.js"]
|
|
1282
|
-
}
|
|
1283
|
-
},
|
|
1284
|
-
"S045": {
|
|
1285
|
-
"name": "Brute-force Protection",
|
|
1286
|
-
"description": "Implement protection against brute-force attacks on authentication endpoints. This rule detects missing rate limiting, account lockout mechanisms, and other brute-force protection measures in authentication flows.",
|
|
1287
|
-
"category": "security",
|
|
1288
|
-
"severity": "error",
|
|
1289
|
-
"languages": ["typescript", "javascript"],
|
|
1290
|
-
"analyzer": "./rules/security/S045_brute_force_protection/analyzer.js",
|
|
1291
|
-
"config": "./rules/security/S045_brute_force_protection/config.json",
|
|
1292
|
-
"version": "1.0.0",
|
|
1293
|
-
"status": "stable",
|
|
1294
|
-
"tags": ["security", "authentication", "brute-force", "rate-limiting", "owasp"],
|
|
1295
|
-
"strategy": {
|
|
1296
|
-
"preferred": "heuristic",
|
|
1297
|
-
"fallbacks": ["heuristic"],
|
|
1298
|
-
"accuracy": {
|
|
1299
|
-
"heuristic": 95
|
|
1300
|
-
}
|
|
1301
|
-
},
|
|
1302
|
-
"engineMappings": {
|
|
1303
|
-
"heuristic": "rules/security/S045_brute_force_protection/analyzer.js"
|
|
1304
|
-
}
|
|
1305
|
-
},
|
|
1306
|
-
"S046": {
|
|
1307
|
-
"name": "Secure Notification on Auth Change",
|
|
1308
|
-
"description": "Require secure notification on authentication changes",
|
|
1309
|
-
"category": "security",
|
|
1310
|
-
"severity": "warning",
|
|
1311
|
-
"languages": ["typescript", "javascript"],
|
|
1312
|
-
"analyzer": "eslint",
|
|
1313
|
-
"eslintRule": "custom/typescript_s046",
|
|
1314
|
-
"version": "1.0.0",
|
|
1315
|
-
"status": "stable",
|
|
1316
|
-
"tags": ["security", "notification", "authentication"]
|
|
1317
|
-
},
|
|
1318
|
-
"S047": {
|
|
1319
|
-
"name": "Secure Random Password Generation",
|
|
1320
|
-
"description": "Require secure and random initial password generation",
|
|
1321
|
-
"category": "security",
|
|
1322
|
-
"severity": "error",
|
|
1323
|
-
"languages": ["typescript", "javascript"],
|
|
1324
|
-
"analyzer": "eslint",
|
|
1325
|
-
"eslintRule": "custom/typescript_s047",
|
|
1326
|
-
"version": "1.0.0",
|
|
1327
|
-
"status": "stable",
|
|
1328
|
-
"tags": ["security", "password", "random"]
|
|
1329
|
-
},
|
|
1330
|
-
"S048": {
|
|
1331
|
-
"name": "Password Credential Recovery",
|
|
1332
|
-
"description": "Secure password credential recovery process",
|
|
1333
|
-
"category": "security",
|
|
1334
|
-
"severity": "error",
|
|
1335
|
-
"languages": ["typescript", "javascript"],
|
|
1336
|
-
"analyzer": "eslint",
|
|
1337
|
-
"eslintRule": "custom/typescript_s048",
|
|
1338
|
-
"version": "1.0.0",
|
|
1339
|
-
"status": "stable",
|
|
1340
|
-
"tags": ["security", "password", "recovery"]
|
|
1341
|
-
},
|
|
1342
|
-
"S049": {
|
|
1343
|
-
"name": "Authentication tokens should have short validity periods",
|
|
1344
|
-
"description": "Authentication tokens (JWT, session tokens, etc.) should have appropriately short validity periods to minimize the risk of token compromise. Long-lived tokens increase the attack surface and potential impact of token theft.",
|
|
1345
|
-
"category": "security",
|
|
1346
|
-
"severity": "error",
|
|
1347
|
-
"languages": ["typescript", "javascript"],
|
|
1348
|
-
"analyzer": "./rules/security/S049_short_validity_tokens/analyzer.js",
|
|
1349
|
-
"config": "./rules/security/S049_short_validity_tokens/config.json",
|
|
1350
|
-
"version": "1.0.0",
|
|
1351
|
-
"status": "stable",
|
|
1352
|
-
"tags": [
|
|
1353
|
-
"security",
|
|
1354
|
-
"authentication",
|
|
1355
|
-
"tokens",
|
|
1356
|
-
"jwt",
|
|
1357
|
-
"session",
|
|
1358
|
-
"owasp"
|
|
1359
|
-
],
|
|
1360
|
-
"strategy": {
|
|
1361
|
-
"preferred": "ast",
|
|
1362
|
-
"fallbacks": ["ast", "regex"],
|
|
2680
|
+
"fallbacks": [
|
|
2681
|
+
"ast",
|
|
2682
|
+
"regex"
|
|
2683
|
+
],
|
|
1363
2684
|
"accuracy": {
|
|
1364
|
-
"ast":
|
|
1365
|
-
"regex":
|
|
2685
|
+
"ast": 85,
|
|
2686
|
+
"regex": 70
|
|
1366
2687
|
}
|
|
1367
2688
|
},
|
|
1368
2689
|
"engineMappings": {
|
|
1369
|
-
"heuristic": ["rules/security/S049_short_validity_tokens/analyzer.js"]
|
|
1370
|
-
}
|
|
1371
|
-
},
|
|
1372
|
-
"S050": {
|
|
1373
|
-
"name": "Session Token Weak Hash",
|
|
1374
|
-
"description": "Prevent weak hashing for session tokens",
|
|
1375
|
-
"category": "security",
|
|
1376
|
-
"severity": "error",
|
|
1377
|
-
"languages": ["typescript", "javascript"],
|
|
1378
|
-
"analyzer": "eslint",
|
|
1379
|
-
"eslintRule": "custom/typescript_s050",
|
|
1380
|
-
"version": "1.0.0",
|
|
1381
|
-
"status": "stable",
|
|
1382
|
-
"tags": ["security", "session", "hashing"]
|
|
1383
|
-
},
|
|
1384
|
-
"S051": {
|
|
1385
|
-
"name": "Password length policy enforcement (12-64 chars recommended, reject >128)",
|
|
1386
|
-
"description": "Enforce strong password length policies with multi-signal detection. Prevent weak validators, missing limits, and FE/BE mismatches.",
|
|
1387
|
-
"category": "security",
|
|
1388
|
-
"severity": "error",
|
|
1389
|
-
"languages": ["typescript", "javascript"],
|
|
1390
|
-
"analyzer": "./rules/security/S051_password_length_policy/analyzer.js",
|
|
1391
|
-
"config": "./rules/security/S051_password_length_policy/config.json",
|
|
1392
|
-
"eslintRule": "custom/typescript_s051",
|
|
1393
|
-
"version": "1.0.0",
|
|
1394
|
-
"status": "stable",
|
|
1395
|
-
"tags": ["security", "password", "validation", "length", "policy"],
|
|
1396
|
-
"engineMappings": {
|
|
1397
|
-
"eslint": ["custom/typescript_s051"],
|
|
1398
2690
|
"heuristic": [
|
|
1399
|
-
"
|
|
2691
|
+
"rules/security/S039_no_session_tokens_in_url/analyzer.js"
|
|
1400
2692
|
]
|
|
1401
2693
|
}
|
|
1402
2694
|
},
|
|
1403
|
-
"
|
|
1404
|
-
"name": "
|
|
1405
|
-
"description": "
|
|
1406
|
-
"category": "common",
|
|
1407
|
-
"severity": "warning",
|
|
1408
|
-
"languages": [
|
|
1409
|
-
"typescript",
|
|
1410
|
-
"javascript",
|
|
1411
|
-
"java",
|
|
1412
|
-
"csharp",
|
|
1413
|
-
"swift",
|
|
1414
|
-
"kotlin",
|
|
1415
|
-
"python"
|
|
1416
|
-
],
|
|
1417
|
-
"analyzer": "./rules/common/C065_one_behavior_per_test/analyzer.js",
|
|
1418
|
-
"config": "./rules/common/C065_one_behavior_per_test/config.json",
|
|
1419
|
-
"version": "1.0.0",
|
|
1420
|
-
"status": "stable",
|
|
1421
|
-
"tags": ["testing", "aaa", "behavior", "maintainability", "clarity"],
|
|
1422
|
-
"engineMappings": {
|
|
1423
|
-
"heuristic": ["./rules/common/C065_one_behavior_per_test/analyzer.js"]
|
|
1424
|
-
}
|
|
1425
|
-
},
|
|
1426
|
-
"S052": {
|
|
1427
|
-
"name": "OTP must have ≥20-bit entropy (≥6 digits) and use CSPRNG",
|
|
1428
|
-
"description": "Prevent guessable OTP by enforcing CSPRNG and minimal entropy. Ban non-crypto RNG and too-short codes.",
|
|
1429
|
-
"category": "security",
|
|
1430
|
-
"severity": "error",
|
|
1431
|
-
"languages": ["typescript", "javascript"],
|
|
1432
|
-
"analyzer": "./rules/security/S052_weak_otp_entropy/analyzer.js",
|
|
1433
|
-
"config": "./rules/security/S052_weak_otp_entropy/config.json",
|
|
1434
|
-
"eslintRule": "custom/typescript_s052",
|
|
1435
|
-
"version": "1.0.0",
|
|
1436
|
-
"status": "stable",
|
|
1437
|
-
"tags": ["security", "otp", "entropy", "csprng"],
|
|
1438
|
-
"engines": {
|
|
1439
|
-
"eslint": ["custom/typescript_s052"],
|
|
1440
|
-
"heuristic": ["./rules/security/S052_weak_otp_entropy/analyzer.js"]
|
|
1441
|
-
}
|
|
1442
|
-
},
|
|
1443
|
-
"S054": {
|
|
1444
|
-
"name": "Disallow Default/Built-in Accounts (admin/root/sa/...)",
|
|
1445
|
-
"description": "Prevent use of default or shared accounts. Enforce per-user identities, initial password change, and disabling well-known built-ins.",
|
|
2695
|
+
"S041": {
|
|
2696
|
+
"name": "Session Tokens must be invalidated after logout or expiration",
|
|
2697
|
+
"description": "Session tokens must be properly invalidated after logout or expiration to prevent session hijacking and unauthorized access. This includes clearing session data, invalidating JWT tokens, and ensuring proper session cleanup.",
|
|
1446
2698
|
"category": "security",
|
|
1447
2699
|
"severity": "error",
|
|
1448
2700
|
"languages": [
|
|
1449
2701
|
"typescript",
|
|
1450
|
-
"javascript"
|
|
1451
|
-
"sql",
|
|
1452
|
-
"terraform",
|
|
1453
|
-
"yaml",
|
|
1454
|
-
"dockerfile",
|
|
1455
|
-
"all"
|
|
2702
|
+
"javascript"
|
|
1456
2703
|
],
|
|
1457
|
-
"analyzer": "./rules/security/
|
|
1458
|
-
"config": "./rules/security/
|
|
1459
|
-
"eslintRule": "custom/typescript_s054",
|
|
2704
|
+
"analyzer": "./rules/security/S041_session_token_invalidation/analyzer.js",
|
|
2705
|
+
"config": "./rules/security/S041_session_token_invalidation/config.json",
|
|
1460
2706
|
"version": "1.0.0",
|
|
1461
2707
|
"status": "stable",
|
|
1462
2708
|
"tags": [
|
|
1463
2709
|
"security",
|
|
1464
|
-
"
|
|
1465
|
-
"
|
|
1466
|
-
"
|
|
1467
|
-
"
|
|
2710
|
+
"session",
|
|
2711
|
+
"token",
|
|
2712
|
+
"logout",
|
|
2713
|
+
"invalidation",
|
|
2714
|
+
"owasp"
|
|
1468
2715
|
],
|
|
1469
|
-
"engines": {
|
|
1470
|
-
"eslint": ["custom/typescript_s054"],
|
|
1471
|
-
"heuristic": ["./rules/security/S054_no_default_accounts/analyzer.js"]
|
|
1472
|
-
}
|
|
1473
|
-
},
|
|
1474
|
-
"S055": {
|
|
1475
|
-
"name": "REST Content-Type Verification",
|
|
1476
|
-
"description": "Verify incoming Content-Type in REST API endpoints",
|
|
1477
|
-
"category": "security",
|
|
1478
|
-
"severity": "error",
|
|
1479
|
-
"languages": ["typescript", "javascript"],
|
|
1480
|
-
"analyzer": "./rules/security/S055_content_type_validation/analyzer.js",
|
|
1481
|
-
"config": "./rules/security/S055_content_type_validation/config.json",
|
|
1482
|
-
"eslintRule": "custom/typescript_s055",
|
|
1483
|
-
"version": "1.0.0",
|
|
1484
|
-
"status": "stable",
|
|
1485
|
-
"tags": ["security", "rest", "content-type"]
|
|
1486
|
-
},
|
|
1487
|
-
"S056": {
|
|
1488
|
-
"name": "Protect against Log Injection attacks",
|
|
1489
|
-
"description": "Protect against Log Injection attacks. Log injection occurs when user-controlled data is written to log files without proper sanitization, potentially allowing attackers to manipulate log entries, inject malicious content, or exploit log processing systems.",
|
|
1490
|
-
"category": "security",
|
|
1491
|
-
"severity": "error",
|
|
1492
|
-
"languages": ["typescript", "javascript"],
|
|
1493
|
-
"analyzer": "./rules/security/S056_log_injection_protection/analyzer.js",
|
|
1494
|
-
"config": "./rules/security/S056_log_injection_protection/config.json",
|
|
1495
|
-
"version": "1.0.0",
|
|
1496
|
-
"status": "stable",
|
|
1497
|
-
"tags": ["security", "logging", "injection", "owasp", "crlf"],
|
|
1498
2716
|
"strategy": {
|
|
1499
2717
|
"preferred": "ast",
|
|
1500
|
-
"fallbacks": [
|
|
2718
|
+
"fallbacks": [
|
|
2719
|
+
"ast",
|
|
2720
|
+
"regex"
|
|
2721
|
+
],
|
|
1501
2722
|
"accuracy": {
|
|
1502
2723
|
"ast": 95,
|
|
1503
2724
|
"regex": 85
|
|
@@ -1505,374 +2726,439 @@
|
|
|
1505
2726
|
},
|
|
1506
2727
|
"engineMappings": {
|
|
1507
2728
|
"heuristic": [
|
|
1508
|
-
"rules/security/
|
|
2729
|
+
"rules/security/S041_session_token_invalidation/analyzer.js"
|
|
1509
2730
|
]
|
|
1510
2731
|
}
|
|
1511
2732
|
},
|
|
1512
|
-
"
|
|
1513
|
-
"name": "
|
|
1514
|
-
"description": "
|
|
2733
|
+
"S042": {
|
|
2734
|
+
"name": "Require Periodic Reauthentication",
|
|
2735
|
+
"description": "Require periodic re-authentication for sensitive operations",
|
|
1515
2736
|
"category": "security",
|
|
1516
|
-
"severity": "
|
|
1517
|
-
"languages": [
|
|
1518
|
-
|
|
1519
|
-
|
|
2737
|
+
"severity": "error",
|
|
2738
|
+
"languages": [
|
|
2739
|
+
"typescript",
|
|
2740
|
+
"javascript"
|
|
2741
|
+
],
|
|
2742
|
+
"analyzer": "./rules/security/S042_require_re_authentication_for_long_lived/analyzer.js",
|
|
2743
|
+
"config": "./rules/security/S042_require_re_authentication_for_long_lived/config.json",
|
|
2744
|
+
"eslintRule": "custom/typescript_s042",
|
|
1520
2745
|
"version": "1.0.0",
|
|
1521
2746
|
"status": "stable",
|
|
1522
|
-
"tags": [
|
|
1523
|
-
|
|
1524
|
-
"
|
|
1525
|
-
"
|
|
1526
|
-
|
|
2747
|
+
"tags": [
|
|
2748
|
+
"security",
|
|
2749
|
+
"authentication",
|
|
2750
|
+
"periodic"
|
|
2751
|
+
]
|
|
1527
2752
|
},
|
|
1528
|
-
"
|
|
1529
|
-
"name": "
|
|
1530
|
-
"description": "
|
|
2753
|
+
"S043": {
|
|
2754
|
+
"name": "Terminate Sessions on Password Change",
|
|
2755
|
+
"description": "Terminate all sessions when password changes",
|
|
1531
2756
|
"category": "security",
|
|
1532
2757
|
"severity": "error",
|
|
1533
|
-
"languages": [
|
|
1534
|
-
|
|
1535
|
-
|
|
2758
|
+
"languages": [
|
|
2759
|
+
"typescript",
|
|
2760
|
+
"javascript"
|
|
2761
|
+
],
|
|
2762
|
+
"analyzer": "./rules/security/S043_password_changes_invalidate_all_sessions/analyzer.js",
|
|
2763
|
+
"config": "./rules/security/S043_password_changes_invalidate_all_sessions/config.json",
|
|
2764
|
+
"eslintRule": "custom/typescript_s043",
|
|
1536
2765
|
"version": "1.0.0",
|
|
1537
2766
|
"status": "stable",
|
|
1538
|
-
"tags": [
|
|
1539
|
-
|
|
1540
|
-
"
|
|
1541
|
-
"
|
|
1542
|
-
|
|
1543
|
-
},
|
|
1544
|
-
"C002": {
|
|
1545
|
-
"id": "C002",
|
|
1546
|
-
"name": "Rule C002",
|
|
1547
|
-
"description": "Auto-migrated rule C002 from ESLint mapping",
|
|
1548
|
-
"category": "general",
|
|
1549
|
-
"severity": "warning",
|
|
1550
|
-
"languages": ["typescript", "javascript"],
|
|
1551
|
-
"version": "1.0.0",
|
|
1552
|
-
"status": "migrated",
|
|
1553
|
-
"tags": ["migrated"],
|
|
1554
|
-
"engineMappings": {
|
|
1555
|
-
"eslint": ["custom/no-duplicate-code"]
|
|
1556
|
-
},
|
|
1557
|
-
"strategy": {
|
|
1558
|
-
"preferred": "regex",
|
|
1559
|
-
"fallbacks": ["regex"],
|
|
1560
|
-
"accuracy": {}
|
|
1561
|
-
}
|
|
1562
|
-
},
|
|
1563
|
-
"C003": {
|
|
1564
|
-
"id": "C003",
|
|
1565
|
-
"name": "Rule C003",
|
|
1566
|
-
"description": "Auto-migrated rule C003 from ESLint mapping",
|
|
1567
|
-
"category": "general",
|
|
1568
|
-
"severity": "warning",
|
|
1569
|
-
"languages": ["typescript", "javascript"],
|
|
1570
|
-
"version": "1.0.0",
|
|
1571
|
-
"status": "migrated",
|
|
1572
|
-
"tags": ["migrated"],
|
|
1573
|
-
"engineMappings": {
|
|
1574
|
-
"eslint": ["custom/no-vague-abbreviations"]
|
|
1575
|
-
},
|
|
1576
|
-
"strategy": {
|
|
1577
|
-
"preferred": "regex",
|
|
1578
|
-
"fallbacks": ["regex"],
|
|
1579
|
-
"accuracy": {}
|
|
1580
|
-
}
|
|
2767
|
+
"tags": [
|
|
2768
|
+
"security",
|
|
2769
|
+
"session",
|
|
2770
|
+
"password"
|
|
2771
|
+
]
|
|
1581
2772
|
},
|
|
1582
|
-
"
|
|
1583
|
-
"name": "
|
|
1584
|
-
"description": "
|
|
1585
|
-
"category": "
|
|
1586
|
-
"severity": "
|
|
1587
|
-
"languages": [
|
|
1588
|
-
|
|
1589
|
-
|
|
2773
|
+
"S044": {
|
|
2774
|
+
"name": "Re-authentication Required for Sensitive Operations",
|
|
2775
|
+
"description": "Require re-authentication before performing sensitive operations such as password changes, email changes, profile updates, and other critical account modifications. This prevents unauthorized access to sensitive account functions even if a session is compromised.",
|
|
2776
|
+
"category": "security",
|
|
2777
|
+
"severity": "error",
|
|
2778
|
+
"languages": [
|
|
2779
|
+
"typescript",
|
|
2780
|
+
"javascript"
|
|
2781
|
+
],
|
|
2782
|
+
"analyzer": "./rules/security/S044_re_authentication_required/analyzer.js",
|
|
2783
|
+
"config": "./rules/security/S044_re_authentication_required/config.json",
|
|
1590
2784
|
"version": "1.0.0",
|
|
1591
2785
|
"status": "stable",
|
|
1592
2786
|
"tags": [
|
|
1593
|
-
"
|
|
1594
|
-
"
|
|
1595
|
-
"
|
|
1596
|
-
"
|
|
1597
|
-
"
|
|
2787
|
+
"security",
|
|
2788
|
+
"authentication",
|
|
2789
|
+
"re-authentication",
|
|
2790
|
+
"sensitive-operations",
|
|
2791
|
+
"owasp"
|
|
1598
2792
|
],
|
|
1599
2793
|
"strategy": {
|
|
1600
2794
|
"preferred": "ast",
|
|
1601
|
-
"fallbacks": [
|
|
2795
|
+
"fallbacks": [
|
|
2796
|
+
"ast",
|
|
2797
|
+
"regex"
|
|
2798
|
+
],
|
|
1602
2799
|
"accuracy": {
|
|
1603
|
-
"ast": 95
|
|
1604
|
-
|
|
1605
|
-
"requirements": {
|
|
1606
|
-
"ast": {
|
|
1607
|
-
"semanticEngine": true,
|
|
1608
|
-
"description": "C014 requires symbol-based analysis for accurate dependency injection pattern detection"
|
|
1609
|
-
}
|
|
2800
|
+
"ast": 95,
|
|
2801
|
+
"regex": 85
|
|
1610
2802
|
}
|
|
1611
2803
|
},
|
|
1612
2804
|
"engineMappings": {
|
|
1613
|
-
"
|
|
1614
|
-
"
|
|
1615
|
-
"no-new-wrappers",
|
|
1616
|
-
"@typescript-eslint/no-unnecessary-constructor"
|
|
2805
|
+
"heuristic": [
|
|
2806
|
+
"rules/security/S044_re_authentication_required/analyzer.js"
|
|
1617
2807
|
]
|
|
1618
2808
|
}
|
|
1619
2809
|
},
|
|
1620
|
-
"
|
|
1621
|
-
"
|
|
1622
|
-
"
|
|
1623
|
-
"
|
|
1624
|
-
"
|
|
1625
|
-
"
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
2810
|
+
"S045": {
|
|
2811
|
+
"name": "Brute-force Protection",
|
|
2812
|
+
"description": "Implement protection against brute-force attacks on authentication endpoints. This rule detects missing rate limiting, account lockout mechanisms, and other brute-force protection measures in authentication flows.",
|
|
2813
|
+
"category": "security",
|
|
2814
|
+
"severity": "error",
|
|
2815
|
+
"languages": [
|
|
2816
|
+
"typescript",
|
|
2817
|
+
"javascript"
|
|
2818
|
+
],
|
|
2819
|
+
"analyzer": "./rules/security/S045_brute_force_protection/analyzer.js",
|
|
2820
|
+
"config": "./rules/security/S045_brute_force_protection/config.json",
|
|
1629
2821
|
"version": "1.0.0",
|
|
1630
|
-
"status": "
|
|
1631
|
-
"tags": [
|
|
1632
|
-
|
|
1633
|
-
"
|
|
1634
|
-
|
|
2822
|
+
"status": "stable",
|
|
2823
|
+
"tags": [
|
|
2824
|
+
"security",
|
|
2825
|
+
"authentication",
|
|
2826
|
+
"brute-force",
|
|
2827
|
+
"rate-limiting",
|
|
2828
|
+
"owasp"
|
|
2829
|
+
],
|
|
1635
2830
|
"strategy": {
|
|
1636
|
-
"preferred": "
|
|
1637
|
-
"fallbacks": [
|
|
2831
|
+
"preferred": "heuristic",
|
|
2832
|
+
"fallbacks": [
|
|
2833
|
+
"heuristic"
|
|
2834
|
+
],
|
|
1638
2835
|
"accuracy": {
|
|
1639
|
-
"
|
|
1640
|
-
"ast": 85,
|
|
1641
|
-
"regex": 70
|
|
2836
|
+
"heuristic": 95
|
|
1642
2837
|
}
|
|
1643
|
-
}
|
|
1644
|
-
},
|
|
1645
|
-
"C030": {
|
|
1646
|
-
"id": "C030",
|
|
1647
|
-
"name": "Rule C030",
|
|
1648
|
-
"description": "Auto-migrated rule C030 from ESLint mapping",
|
|
1649
|
-
"category": "general",
|
|
1650
|
-
"severity": "warning",
|
|
1651
|
-
"languages": ["typescript", "javascript"],
|
|
1652
|
-
"version": "1.0.0",
|
|
1653
|
-
"status": "migrated",
|
|
1654
|
-
"tags": ["migrated"],
|
|
1655
|
-
"engineMappings": {
|
|
1656
|
-
"eslint": ["custom/use-custom-error-classes"]
|
|
1657
2838
|
},
|
|
1658
|
-
"strategy": {
|
|
1659
|
-
"preferred": "regex",
|
|
1660
|
-
"fallbacks": ["regex"],
|
|
1661
|
-
"accuracy": {}
|
|
1662
|
-
}
|
|
1663
|
-
},
|
|
1664
|
-
"C042": {
|
|
1665
|
-
"id": "C042",
|
|
1666
|
-
"name": "Rule C042",
|
|
1667
|
-
"description": "Auto-migrated rule C042 from ESLint mapping",
|
|
1668
|
-
"category": "general",
|
|
1669
|
-
"severity": "warning",
|
|
1670
|
-
"languages": ["typescript", "javascript"],
|
|
1671
|
-
"version": "1.0.0",
|
|
1672
|
-
"status": "migrated",
|
|
1673
|
-
"tags": ["migrated"],
|
|
1674
2839
|
"engineMappings": {
|
|
1675
|
-
"
|
|
1676
|
-
},
|
|
1677
|
-
"strategy": {
|
|
1678
|
-
"preferred": "regex",
|
|
1679
|
-
"fallbacks": ["regex"],
|
|
1680
|
-
"accuracy": {}
|
|
2840
|
+
"heuristic": "rules/security/S045_brute_force_protection/analyzer.js"
|
|
1681
2841
|
}
|
|
1682
2842
|
},
|
|
1683
|
-
"
|
|
1684
|
-
"
|
|
1685
|
-
"
|
|
1686
|
-
"
|
|
1687
|
-
"category": "general",
|
|
2843
|
+
"S046": {
|
|
2844
|
+
"name": "Secure Notification on Auth Change",
|
|
2845
|
+
"description": "Require secure notification on authentication changes",
|
|
2846
|
+
"category": "security",
|
|
1688
2847
|
"severity": "warning",
|
|
1689
|
-
"languages": [
|
|
2848
|
+
"languages": [
|
|
2849
|
+
"typescript",
|
|
2850
|
+
"javascript"
|
|
2851
|
+
],
|
|
2852
|
+
"analyzer": "eslint",
|
|
2853
|
+
"eslintRule": "custom/typescript_s046",
|
|
1690
2854
|
"version": "1.0.0",
|
|
1691
|
-
"status": "
|
|
1692
|
-
"tags": [
|
|
1693
|
-
|
|
1694
|
-
"
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
"
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
"
|
|
1708
|
-
"
|
|
1709
|
-
"config": "./rules/common/C048_no_bypass_architectural_layers/config.json",
|
|
2855
|
+
"status": "stable",
|
|
2856
|
+
"tags": [
|
|
2857
|
+
"security",
|
|
2858
|
+
"notification",
|
|
2859
|
+
"authentication"
|
|
2860
|
+
]
|
|
2861
|
+
},
|
|
2862
|
+
"S047": {
|
|
2863
|
+
"name": "Secure Random Password Generation",
|
|
2864
|
+
"description": "Require secure and random initial password generation",
|
|
2865
|
+
"category": "security",
|
|
2866
|
+
"severity": "error",
|
|
2867
|
+
"languages": [
|
|
2868
|
+
"typescript",
|
|
2869
|
+
"javascript"
|
|
2870
|
+
],
|
|
2871
|
+
"analyzer": "eslint",
|
|
2872
|
+
"eslintRule": "custom/typescript_s047",
|
|
1710
2873
|
"version": "1.0.0",
|
|
1711
2874
|
"status": "stable",
|
|
1712
|
-
"tags": [
|
|
1713
|
-
|
|
1714
|
-
"
|
|
1715
|
-
|
|
2875
|
+
"tags": [
|
|
2876
|
+
"security",
|
|
2877
|
+
"password",
|
|
2878
|
+
"random"
|
|
2879
|
+
]
|
|
1716
2880
|
},
|
|
1717
|
-
"
|
|
1718
|
-
"name": "
|
|
1719
|
-
"description": "
|
|
1720
|
-
"category": "
|
|
1721
|
-
"severity": "
|
|
1722
|
-
"languages": [
|
|
1723
|
-
|
|
1724
|
-
|
|
2881
|
+
"S048": {
|
|
2882
|
+
"name": "Password Credential Recovery",
|
|
2883
|
+
"description": "Secure password credential recovery process",
|
|
2884
|
+
"category": "security",
|
|
2885
|
+
"severity": "error",
|
|
2886
|
+
"languages": [
|
|
2887
|
+
"typescript",
|
|
2888
|
+
"javascript"
|
|
2889
|
+
],
|
|
2890
|
+
"analyzer": "eslint",
|
|
2891
|
+
"eslintRule": "custom/typescript_s048",
|
|
1725
2892
|
"version": "1.0.0",
|
|
1726
2893
|
"status": "stable",
|
|
1727
|
-
"tags": [
|
|
1728
|
-
|
|
1729
|
-
"
|
|
1730
|
-
|
|
2894
|
+
"tags": [
|
|
2895
|
+
"security",
|
|
2896
|
+
"password",
|
|
2897
|
+
"recovery"
|
|
2898
|
+
]
|
|
1731
2899
|
},
|
|
1732
|
-
"
|
|
1733
|
-
"name": "
|
|
1734
|
-
"description": "
|
|
1735
|
-
"category": "
|
|
1736
|
-
"severity": "
|
|
1737
|
-
"languages": [
|
|
1738
|
-
|
|
1739
|
-
|
|
2900
|
+
"S049": {
|
|
2901
|
+
"name": "Authentication tokens should have short validity periods",
|
|
2902
|
+
"description": "Authentication tokens (JWT, session tokens, etc.) should have appropriately short validity periods to minimize the risk of token compromise. Long-lived tokens increase the attack surface and potential impact of token theft.",
|
|
2903
|
+
"category": "security",
|
|
2904
|
+
"severity": "error",
|
|
2905
|
+
"languages": [
|
|
2906
|
+
"typescript",
|
|
2907
|
+
"javascript"
|
|
2908
|
+
],
|
|
2909
|
+
"analyzer": "./rules/security/S049_short_validity_tokens/analyzer.js",
|
|
2910
|
+
"config": "./rules/security/S049_short_validity_tokens/config.json",
|
|
1740
2911
|
"version": "1.0.0",
|
|
1741
2912
|
"status": "stable",
|
|
1742
2913
|
"tags": [
|
|
1743
|
-
"
|
|
1744
|
-
"
|
|
1745
|
-
"
|
|
1746
|
-
"
|
|
1747
|
-
"
|
|
2914
|
+
"security",
|
|
2915
|
+
"authentication",
|
|
2916
|
+
"tokens",
|
|
2917
|
+
"jwt",
|
|
2918
|
+
"session",
|
|
2919
|
+
"owasp"
|
|
1748
2920
|
],
|
|
1749
2921
|
"strategy": {
|
|
1750
2922
|
"preferred": "ast",
|
|
1751
|
-
"fallbacks": [
|
|
2923
|
+
"fallbacks": [
|
|
2924
|
+
"ast",
|
|
2925
|
+
"regex"
|
|
2926
|
+
],
|
|
1752
2927
|
"accuracy": {
|
|
1753
|
-
"ast": 90
|
|
2928
|
+
"ast": 90,
|
|
2929
|
+
"regex": 75
|
|
1754
2930
|
}
|
|
1755
2931
|
},
|
|
1756
2932
|
"engineMappings": {
|
|
1757
|
-
"heuristic": [
|
|
2933
|
+
"heuristic": [
|
|
2934
|
+
"rules/security/S049_short_validity_tokens/analyzer.js"
|
|
2935
|
+
]
|
|
1758
2936
|
}
|
|
1759
2937
|
},
|
|
1760
|
-
"
|
|
1761
|
-
"name": "
|
|
1762
|
-
"description": "
|
|
1763
|
-
"category": "
|
|
2938
|
+
"S050": {
|
|
2939
|
+
"name": "Session Token Weak Hash",
|
|
2940
|
+
"description": "Prevent weak hashing for session tokens",
|
|
2941
|
+
"category": "security",
|
|
1764
2942
|
"severity": "error",
|
|
1765
|
-
"languages": [
|
|
1766
|
-
|
|
1767
|
-
|
|
2943
|
+
"languages": [
|
|
2944
|
+
"typescript",
|
|
2945
|
+
"javascript"
|
|
2946
|
+
],
|
|
2947
|
+
"analyzer": "eslint",
|
|
2948
|
+
"eslintRule": "custom/typescript_s050",
|
|
1768
2949
|
"version": "1.0.0",
|
|
1769
2950
|
"status": "stable",
|
|
1770
2951
|
"tags": [
|
|
1771
|
-
"
|
|
1772
|
-
"
|
|
1773
|
-
"
|
|
1774
|
-
|
|
1775
|
-
|
|
2952
|
+
"security",
|
|
2953
|
+
"session",
|
|
2954
|
+
"hashing"
|
|
2955
|
+
]
|
|
2956
|
+
},
|
|
2957
|
+
"S051": {
|
|
2958
|
+
"name": "Password length policy enforcement (12-64 chars recommended, reject >128)",
|
|
2959
|
+
"description": "Enforce strong password length policies with multi-signal detection. Prevent weak validators, missing limits, and FE/BE mismatches.",
|
|
2960
|
+
"category": "security",
|
|
2961
|
+
"severity": "error",
|
|
2962
|
+
"languages": [
|
|
2963
|
+
"typescript",
|
|
2964
|
+
"javascript"
|
|
2965
|
+
],
|
|
2966
|
+
"analyzer": "./rules/security/S051_password_length_policy/analyzer.js",
|
|
2967
|
+
"config": "./rules/security/S051_password_length_policy/config.json",
|
|
2968
|
+
"eslintRule": "custom/typescript_s051",
|
|
2969
|
+
"version": "1.0.0",
|
|
2970
|
+
"status": "stable",
|
|
2971
|
+
"tags": [
|
|
2972
|
+
"security",
|
|
2973
|
+
"password",
|
|
2974
|
+
"validation",
|
|
2975
|
+
"length",
|
|
2976
|
+
"policy"
|
|
1776
2977
|
],
|
|
1777
|
-
"strategy": {
|
|
1778
|
-
"preferred": "ast",
|
|
1779
|
-
"fallbacks": ["regex"],
|
|
1780
|
-
"accuracy": {
|
|
1781
|
-
"ast": 95,
|
|
1782
|
-
"regex": 88
|
|
1783
|
-
}
|
|
1784
|
-
},
|
|
1785
2978
|
"engineMappings": {
|
|
2979
|
+
"eslint": [
|
|
2980
|
+
"custom/typescript_s051"
|
|
2981
|
+
],
|
|
1786
2982
|
"heuristic": [
|
|
1787
|
-
"
|
|
2983
|
+
"./rules/security/S051_password_length_policy/analyzer.js"
|
|
1788
2984
|
]
|
|
1789
2985
|
}
|
|
1790
2986
|
},
|
|
1791
|
-
"
|
|
1792
|
-
"
|
|
1793
|
-
"
|
|
1794
|
-
"
|
|
1795
|
-
"
|
|
1796
|
-
"
|
|
1797
|
-
|
|
2987
|
+
"S052": {
|
|
2988
|
+
"name": "OTP must have ≥20-bit entropy (≥6 digits) and use CSPRNG",
|
|
2989
|
+
"description": "Prevent guessable OTP by enforcing CSPRNG and minimal entropy. Ban non-crypto RNG and too-short codes.",
|
|
2990
|
+
"category": "security",
|
|
2991
|
+
"severity": "error",
|
|
2992
|
+
"languages": [
|
|
2993
|
+
"typescript",
|
|
2994
|
+
"javascript"
|
|
2995
|
+
],
|
|
2996
|
+
"analyzer": "./rules/security/S052_weak_otp_entropy/analyzer.js",
|
|
2997
|
+
"config": "./rules/security/S052_weak_otp_entropy/config.json",
|
|
2998
|
+
"eslintRule": "custom/typescript_s052",
|
|
1798
2999
|
"version": "1.0.0",
|
|
1799
3000
|
"status": "stable",
|
|
1800
|
-
"tags": [
|
|
1801
|
-
|
|
1802
|
-
"
|
|
1803
|
-
"
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
"
|
|
1808
|
-
|
|
3001
|
+
"tags": [
|
|
3002
|
+
"security",
|
|
3003
|
+
"otp",
|
|
3004
|
+
"entropy",
|
|
3005
|
+
"csprng"
|
|
3006
|
+
],
|
|
3007
|
+
"engines": {
|
|
3008
|
+
"eslint": [
|
|
3009
|
+
"custom/typescript_s052"
|
|
3010
|
+
],
|
|
3011
|
+
"heuristic": [
|
|
3012
|
+
"./rules/security/S052_weak_otp_entropy/analyzer.js"
|
|
3013
|
+
]
|
|
1809
3014
|
}
|
|
1810
3015
|
},
|
|
1811
|
-
"
|
|
1812
|
-
"
|
|
1813
|
-
"
|
|
1814
|
-
"
|
|
1815
|
-
"category": "configuration",
|
|
3016
|
+
"S054": {
|
|
3017
|
+
"name": "Disallow Default/Built-in Accounts (admin/root/sa/...)",
|
|
3018
|
+
"description": "Prevent use of default or shared accounts. Enforce per-user identities, initial password change, and disabling well-known built-ins.",
|
|
3019
|
+
"category": "security",
|
|
1816
3020
|
"severity": "error",
|
|
1817
|
-
"languages": [
|
|
3021
|
+
"languages": [
|
|
3022
|
+
"typescript",
|
|
3023
|
+
"javascript",
|
|
3024
|
+
"sql",
|
|
3025
|
+
"terraform",
|
|
3026
|
+
"yaml",
|
|
3027
|
+
"dockerfile",
|
|
3028
|
+
"all"
|
|
3029
|
+
],
|
|
3030
|
+
"analyzer": "./rules/security/S054_no_default_accounts/analyzer.js",
|
|
3031
|
+
"config": "./rules/security/S054_no_default_accounts/config.json",
|
|
3032
|
+
"eslintRule": "custom/typescript_s054",
|
|
1818
3033
|
"version": "1.0.0",
|
|
1819
3034
|
"status": "stable",
|
|
1820
|
-
"tags": [
|
|
1821
|
-
|
|
1822
|
-
"
|
|
1823
|
-
|
|
3035
|
+
"tags": [
|
|
3036
|
+
"security",
|
|
3037
|
+
"accounts",
|
|
3038
|
+
"default",
|
|
3039
|
+
"authentication",
|
|
3040
|
+
"authorization"
|
|
3041
|
+
],
|
|
3042
|
+
"engines": {
|
|
3043
|
+
"eslint": [
|
|
3044
|
+
"custom/typescript_s054"
|
|
1824
3045
|
],
|
|
1825
|
-
"
|
|
1826
|
-
"rules/
|
|
3046
|
+
"heuristic": [
|
|
3047
|
+
"./rules/security/S054_no_default_accounts/analyzer.js"
|
|
1827
3048
|
]
|
|
1828
|
-
}
|
|
3049
|
+
}
|
|
3050
|
+
},
|
|
3051
|
+
"S055": {
|
|
3052
|
+
"name": "REST Content-Type Verification",
|
|
3053
|
+
"description": "Verify incoming Content-Type in REST API endpoints",
|
|
3054
|
+
"category": "security",
|
|
3055
|
+
"severity": "error",
|
|
3056
|
+
"languages": [
|
|
3057
|
+
"typescript",
|
|
3058
|
+
"javascript"
|
|
3059
|
+
],
|
|
3060
|
+
"analyzer": "./rules/security/S055_content_type_validation/analyzer.js",
|
|
3061
|
+
"config": "./rules/security/S055_content_type_validation/config.json",
|
|
3062
|
+
"eslintRule": "custom/typescript_s055",
|
|
3063
|
+
"version": "1.0.0",
|
|
3064
|
+
"status": "stable",
|
|
3065
|
+
"tags": [
|
|
3066
|
+
"security",
|
|
3067
|
+
"rest",
|
|
3068
|
+
"content-type"
|
|
3069
|
+
]
|
|
3070
|
+
},
|
|
3071
|
+
"S056": {
|
|
3072
|
+
"name": "Protect against Log Injection attacks",
|
|
3073
|
+
"description": "Protect against Log Injection attacks. Log injection occurs when user-controlled data is written to log files without proper sanitization, potentially allowing attackers to manipulate log entries, inject malicious content, or exploit log processing systems.",
|
|
3074
|
+
"category": "security",
|
|
3075
|
+
"severity": "error",
|
|
3076
|
+
"languages": [
|
|
3077
|
+
"typescript",
|
|
3078
|
+
"javascript"
|
|
3079
|
+
],
|
|
3080
|
+
"analyzer": "./rules/security/S056_log_injection_protection/analyzer.js",
|
|
3081
|
+
"config": "./rules/security/S056_log_injection_protection/config.json",
|
|
3082
|
+
"version": "1.0.0",
|
|
3083
|
+
"status": "stable",
|
|
3084
|
+
"tags": [
|
|
3085
|
+
"security",
|
|
3086
|
+
"logging",
|
|
3087
|
+
"injection",
|
|
3088
|
+
"owasp",
|
|
3089
|
+
"crlf"
|
|
3090
|
+
],
|
|
1829
3091
|
"strategy": {
|
|
1830
|
-
"preferred": "
|
|
1831
|
-
"fallbacks": [
|
|
3092
|
+
"preferred": "ast",
|
|
3093
|
+
"fallbacks": [
|
|
3094
|
+
"ast",
|
|
3095
|
+
"regex"
|
|
3096
|
+
],
|
|
1832
3097
|
"accuracy": {
|
|
1833
|
-
"
|
|
1834
|
-
"
|
|
3098
|
+
"ast": 95,
|
|
3099
|
+
"regex": 85
|
|
1835
3100
|
}
|
|
3101
|
+
},
|
|
3102
|
+
"engineMappings": {
|
|
3103
|
+
"heuristic": [
|
|
3104
|
+
"rules/security/S056_log_injection_protection/analyzer.js"
|
|
3105
|
+
]
|
|
1836
3106
|
}
|
|
1837
3107
|
},
|
|
1838
|
-
"
|
|
1839
|
-
"
|
|
1840
|
-
"
|
|
1841
|
-
"
|
|
1842
|
-
"category": "general",
|
|
3108
|
+
"S057": {
|
|
3109
|
+
"name": "Log with UTC Timestamps",
|
|
3110
|
+
"description": "Ensure all logs use synchronized UTC time with ISO 8601/RFC3339 format to avoid timezone discrepancies across systems",
|
|
3111
|
+
"category": "security",
|
|
1843
3112
|
"severity": "warning",
|
|
1844
|
-
"languages": [
|
|
3113
|
+
"languages": [
|
|
3114
|
+
"typescript",
|
|
3115
|
+
"javascript"
|
|
3116
|
+
],
|
|
3117
|
+
"analyzer": "./rules/security/S057_utc_logging/analyzer.js",
|
|
3118
|
+
"config": "./rules/security/S057_utc_logging/config.json",
|
|
1845
3119
|
"version": "1.0.0",
|
|
1846
|
-
"status": "
|
|
1847
|
-
"tags": [
|
|
3120
|
+
"status": "stable",
|
|
3121
|
+
"tags": [
|
|
3122
|
+
"security",
|
|
3123
|
+
"logging",
|
|
3124
|
+
"timezone",
|
|
3125
|
+
"utc"
|
|
3126
|
+
],
|
|
1848
3127
|
"engineMappings": {
|
|
1849
|
-
"eslint": [
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
"
|
|
1853
|
-
|
|
1854
|
-
|
|
3128
|
+
"eslint": [
|
|
3129
|
+
"custom/typescript_s057"
|
|
3130
|
+
],
|
|
3131
|
+
"heuristic": [
|
|
3132
|
+
"./rules/security/S057_utc_logging/analyzer.js"
|
|
3133
|
+
]
|
|
1855
3134
|
}
|
|
1856
3135
|
},
|
|
1857
|
-
"
|
|
1858
|
-
"
|
|
1859
|
-
"
|
|
1860
|
-
"
|
|
1861
|
-
"category": "type-safety",
|
|
3136
|
+
"S058": {
|
|
3137
|
+
"name": "No SSRF (Server-Side Request Forgery)",
|
|
3138
|
+
"description": "Prevent SSRF attacks by validating URLs from user input before making HTTP requests",
|
|
3139
|
+
"category": "security",
|
|
1862
3140
|
"severity": "error",
|
|
1863
|
-
"languages": [
|
|
3141
|
+
"languages": [
|
|
3142
|
+
"typescript",
|
|
3143
|
+
"javascript"
|
|
3144
|
+
],
|
|
3145
|
+
"analyzer": "./rules/security/S058_no_ssrf/analyzer.js",
|
|
3146
|
+
"config": "./rules/security/S058_no_ssrf/config.json",
|
|
1864
3147
|
"version": "1.0.0",
|
|
1865
3148
|
"status": "stable",
|
|
1866
|
-
"tags": [
|
|
3149
|
+
"tags": [
|
|
3150
|
+
"security",
|
|
3151
|
+
"ssrf",
|
|
3152
|
+
"url-validation",
|
|
3153
|
+
"http-requests"
|
|
3154
|
+
],
|
|
1867
3155
|
"engineMappings": {
|
|
1868
3156
|
"heuristic": [
|
|
1869
|
-
"rules/
|
|
3157
|
+
"./rules/security/S058_no_ssrf/analyzer.js"
|
|
3158
|
+
],
|
|
3159
|
+
"eslint": [
|
|
3160
|
+
"custom/typescript_s058"
|
|
1870
3161
|
]
|
|
1871
|
-
},
|
|
1872
|
-
"strategy": {
|
|
1873
|
-
"preferred": "symbol",
|
|
1874
|
-
"fallbacks": ["symbol"],
|
|
1875
|
-
"accuracy": {}
|
|
1876
3162
|
}
|
|
1877
3163
|
},
|
|
1878
3164
|
"T002": {
|
|
@@ -1881,16 +3167,25 @@
|
|
|
1881
3167
|
"description": "Auto-migrated rule T002 from ESLint mapping",
|
|
1882
3168
|
"category": "typescript",
|
|
1883
3169
|
"severity": "warning",
|
|
1884
|
-
"languages": [
|
|
3170
|
+
"languages": [
|
|
3171
|
+
"typescript",
|
|
3172
|
+
"javascript"
|
|
3173
|
+
],
|
|
1885
3174
|
"version": "1.0.0",
|
|
1886
3175
|
"status": "migrated",
|
|
1887
|
-
"tags": [
|
|
3176
|
+
"tags": [
|
|
3177
|
+
"migrated"
|
|
3178
|
+
],
|
|
1888
3179
|
"engineMappings": {
|
|
1889
|
-
"eslint": [
|
|
3180
|
+
"eslint": [
|
|
3181
|
+
"custom/interface-prefix-i"
|
|
3182
|
+
]
|
|
1890
3183
|
},
|
|
1891
3184
|
"strategy": {
|
|
1892
3185
|
"preferred": "regex",
|
|
1893
|
-
"fallbacks": [
|
|
3186
|
+
"fallbacks": [
|
|
3187
|
+
"regex"
|
|
3188
|
+
],
|
|
1894
3189
|
"accuracy": {}
|
|
1895
3190
|
}
|
|
1896
3191
|
},
|
|
@@ -1900,16 +3195,25 @@
|
|
|
1900
3195
|
"description": "Auto-migrated rule T003 from ESLint mapping",
|
|
1901
3196
|
"category": "typescript",
|
|
1902
3197
|
"severity": "warning",
|
|
1903
|
-
"languages": [
|
|
3198
|
+
"languages": [
|
|
3199
|
+
"typescript",
|
|
3200
|
+
"javascript"
|
|
3201
|
+
],
|
|
1904
3202
|
"version": "1.0.0",
|
|
1905
3203
|
"status": "migrated",
|
|
1906
|
-
"tags": [
|
|
3204
|
+
"tags": [
|
|
3205
|
+
"migrated"
|
|
3206
|
+
],
|
|
1907
3207
|
"engineMappings": {
|
|
1908
|
-
"eslint": [
|
|
3208
|
+
"eslint": [
|
|
3209
|
+
"custom/ts-ignore-reason"
|
|
3210
|
+
]
|
|
1909
3211
|
},
|
|
1910
3212
|
"strategy": {
|
|
1911
3213
|
"preferred": "regex",
|
|
1912
|
-
"fallbacks": [
|
|
3214
|
+
"fallbacks": [
|
|
3215
|
+
"regex"
|
|
3216
|
+
],
|
|
1913
3217
|
"accuracy": {}
|
|
1914
3218
|
}
|
|
1915
3219
|
},
|
|
@@ -1919,16 +3223,25 @@
|
|
|
1919
3223
|
"description": "Auto-migrated rule T004 from ESLint mapping",
|
|
1920
3224
|
"category": "typescript",
|
|
1921
3225
|
"severity": "warning",
|
|
1922
|
-
"languages": [
|
|
3226
|
+
"languages": [
|
|
3227
|
+
"typescript",
|
|
3228
|
+
"javascript"
|
|
3229
|
+
],
|
|
1923
3230
|
"version": "1.0.0",
|
|
1924
3231
|
"status": "migrated",
|
|
1925
|
-
"tags": [
|
|
3232
|
+
"tags": [
|
|
3233
|
+
"migrated"
|
|
3234
|
+
],
|
|
1926
3235
|
"engineMappings": {
|
|
1927
|
-
"eslint": [
|
|
3236
|
+
"eslint": [
|
|
3237
|
+
"custom/no-empty-type"
|
|
3238
|
+
]
|
|
1928
3239
|
},
|
|
1929
3240
|
"strategy": {
|
|
1930
3241
|
"preferred": "regex",
|
|
1931
|
-
"fallbacks": [
|
|
3242
|
+
"fallbacks": [
|
|
3243
|
+
"regex"
|
|
3244
|
+
],
|
|
1932
3245
|
"accuracy": {}
|
|
1933
3246
|
}
|
|
1934
3247
|
},
|
|
@@ -1938,16 +3251,25 @@
|
|
|
1938
3251
|
"description": "Auto-migrated rule T007 from ESLint mapping",
|
|
1939
3252
|
"category": "typescript",
|
|
1940
3253
|
"severity": "warning",
|
|
1941
|
-
"languages": [
|
|
3254
|
+
"languages": [
|
|
3255
|
+
"typescript",
|
|
3256
|
+
"javascript"
|
|
3257
|
+
],
|
|
1942
3258
|
"version": "1.0.0",
|
|
1943
3259
|
"status": "migrated",
|
|
1944
|
-
"tags": [
|
|
3260
|
+
"tags": [
|
|
3261
|
+
"migrated"
|
|
3262
|
+
],
|
|
1945
3263
|
"engineMappings": {
|
|
1946
|
-
"eslint": [
|
|
3264
|
+
"eslint": [
|
|
3265
|
+
"custom/no-fn-in-constructor"
|
|
3266
|
+
]
|
|
1947
3267
|
},
|
|
1948
3268
|
"strategy": {
|
|
1949
3269
|
"preferred": "regex",
|
|
1950
|
-
"fallbacks": [
|
|
3270
|
+
"fallbacks": [
|
|
3271
|
+
"regex"
|
|
3272
|
+
],
|
|
1951
3273
|
"accuracy": {}
|
|
1952
3274
|
}
|
|
1953
3275
|
},
|
|
@@ -1957,16 +3279,25 @@
|
|
|
1957
3279
|
"description": "Auto-migrated rule T010 from ESLint mapping",
|
|
1958
3280
|
"category": "typescript",
|
|
1959
3281
|
"severity": "warning",
|
|
1960
|
-
"languages": [
|
|
3282
|
+
"languages": [
|
|
3283
|
+
"typescript",
|
|
3284
|
+
"javascript"
|
|
3285
|
+
],
|
|
1961
3286
|
"version": "1.0.0",
|
|
1962
3287
|
"status": "migrated",
|
|
1963
|
-
"tags": [
|
|
3288
|
+
"tags": [
|
|
3289
|
+
"migrated"
|
|
3290
|
+
],
|
|
1964
3291
|
"engineMappings": {
|
|
1965
|
-
"eslint": [
|
|
3292
|
+
"eslint": [
|
|
3293
|
+
"custom/no-nested-union-tuple"
|
|
3294
|
+
]
|
|
1966
3295
|
},
|
|
1967
3296
|
"strategy": {
|
|
1968
3297
|
"preferred": "regex",
|
|
1969
|
-
"fallbacks": [
|
|
3298
|
+
"fallbacks": [
|
|
3299
|
+
"regex"
|
|
3300
|
+
],
|
|
1970
3301
|
"accuracy": {}
|
|
1971
3302
|
}
|
|
1972
3303
|
},
|
|
@@ -1976,16 +3307,25 @@
|
|
|
1976
3307
|
"description": "Auto-migrated rule T019 from ESLint mapping",
|
|
1977
3308
|
"category": "typescript",
|
|
1978
3309
|
"severity": "warning",
|
|
1979
|
-
"languages": [
|
|
3310
|
+
"languages": [
|
|
3311
|
+
"typescript",
|
|
3312
|
+
"javascript"
|
|
3313
|
+
],
|
|
1980
3314
|
"version": "1.0.0",
|
|
1981
3315
|
"status": "migrated",
|
|
1982
|
-
"tags": [
|
|
3316
|
+
"tags": [
|
|
3317
|
+
"migrated"
|
|
3318
|
+
],
|
|
1983
3319
|
"engineMappings": {
|
|
1984
|
-
"eslint": [
|
|
3320
|
+
"eslint": [
|
|
3321
|
+
"custom/no-this-assign"
|
|
3322
|
+
]
|
|
1985
3323
|
},
|
|
1986
3324
|
"strategy": {
|
|
1987
3325
|
"preferred": "regex",
|
|
1988
|
-
"fallbacks": [
|
|
3326
|
+
"fallbacks": [
|
|
3327
|
+
"regex"
|
|
3328
|
+
],
|
|
1989
3329
|
"accuracy": {}
|
|
1990
3330
|
}
|
|
1991
3331
|
},
|
|
@@ -1995,16 +3335,25 @@
|
|
|
1995
3335
|
"description": "Auto-migrated rule T020 from ESLint mapping",
|
|
1996
3336
|
"category": "typescript",
|
|
1997
3337
|
"severity": "warning",
|
|
1998
|
-
"languages": [
|
|
3338
|
+
"languages": [
|
|
3339
|
+
"typescript",
|
|
3340
|
+
"javascript"
|
|
3341
|
+
],
|
|
1999
3342
|
"version": "1.0.0",
|
|
2000
3343
|
"status": "migrated",
|
|
2001
|
-
"tags": [
|
|
3344
|
+
"tags": [
|
|
3345
|
+
"migrated"
|
|
3346
|
+
],
|
|
2002
3347
|
"engineMappings": {
|
|
2003
|
-
"eslint": [
|
|
3348
|
+
"eslint": [
|
|
3349
|
+
"custom/no-default-multi-export"
|
|
3350
|
+
]
|
|
2004
3351
|
},
|
|
2005
3352
|
"strategy": {
|
|
2006
3353
|
"preferred": "regex",
|
|
2007
|
-
"fallbacks": [
|
|
3354
|
+
"fallbacks": [
|
|
3355
|
+
"regex"
|
|
3356
|
+
],
|
|
2008
3357
|
"accuracy": {}
|
|
2009
3358
|
}
|
|
2010
3359
|
},
|
|
@@ -2014,415 +3363,27 @@
|
|
|
2014
3363
|
"description": "Auto-migrated rule T021 from ESLint mapping",
|
|
2015
3364
|
"category": "typescript",
|
|
2016
3365
|
"severity": "warning",
|
|
2017
|
-
"languages": [
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
"engineMappings": {
|
|
2022
|
-
"eslint": ["custom/limit-nested-generics"]
|
|
2023
|
-
},
|
|
2024
|
-
"strategy": {
|
|
2025
|
-
"preferred": "regex",
|
|
2026
|
-
"fallbacks": ["regex"],
|
|
2027
|
-
"accuracy": {}
|
|
2028
|
-
}
|
|
2029
|
-
},
|
|
2030
|
-
"R001": {
|
|
2031
|
-
"id": "R001",
|
|
2032
|
-
"name": "Rule R001",
|
|
2033
|
-
"description": "Auto-migrated rule R001 from ESLint mapping",
|
|
2034
|
-
"category": "react",
|
|
2035
|
-
"severity": "warning",
|
|
2036
|
-
"languages": ["typescript", "javascript"],
|
|
2037
|
-
"version": "1.0.0",
|
|
2038
|
-
"status": "migrated",
|
|
2039
|
-
"tags": ["migrated"],
|
|
2040
|
-
"engineMappings": {
|
|
2041
|
-
"eslint": [
|
|
2042
|
-
"react/no-this-in-sfc",
|
|
2043
|
-
"no-param-reassign",
|
|
2044
|
-
"react/function-component-definition",
|
|
2045
|
-
"react/forbid-component-props"
|
|
2046
|
-
]
|
|
2047
|
-
},
|
|
2048
|
-
"strategy": {
|
|
2049
|
-
"preferred": "regex",
|
|
2050
|
-
"fallbacks": ["regex"],
|
|
2051
|
-
"accuracy": {}
|
|
2052
|
-
}
|
|
2053
|
-
},
|
|
2054
|
-
"R002": {
|
|
2055
|
-
"id": "R002",
|
|
2056
|
-
"name": "Rule R002",
|
|
2057
|
-
"description": "Auto-migrated rule R002 from ESLint mapping",
|
|
2058
|
-
"category": "react",
|
|
2059
|
-
"severity": "warning",
|
|
2060
|
-
"languages": ["typescript", "javascript"],
|
|
2061
|
-
"version": "1.0.0",
|
|
2062
|
-
"status": "migrated",
|
|
2063
|
-
"tags": ["migrated"],
|
|
2064
|
-
"engineMappings": {
|
|
2065
|
-
"eslint": [
|
|
2066
|
-
"react-hooks/rules-of-hooks",
|
|
2067
|
-
"react-hooks/exhaustive-deps",
|
|
2068
|
-
"react/no-did-mount-set-state",
|
|
2069
|
-
"react/no-did-update-set-state"
|
|
2070
|
-
]
|
|
2071
|
-
},
|
|
2072
|
-
"strategy": {
|
|
2073
|
-
"preferred": "regex",
|
|
2074
|
-
"fallbacks": ["regex"],
|
|
2075
|
-
"accuracy": {}
|
|
2076
|
-
}
|
|
2077
|
-
},
|
|
2078
|
-
"R003": {
|
|
2079
|
-
"id": "R003",
|
|
2080
|
-
"name": "Rule R003",
|
|
2081
|
-
"description": "Auto-migrated rule R003 from ESLint mapping",
|
|
2082
|
-
"category": "react",
|
|
2083
|
-
"severity": "warning",
|
|
2084
|
-
"languages": ["typescript", "javascript"],
|
|
2085
|
-
"version": "1.0.0",
|
|
2086
|
-
"status": "migrated",
|
|
2087
|
-
"tags": ["migrated"],
|
|
2088
|
-
"engineMappings": {
|
|
2089
|
-
"eslint": [
|
|
2090
|
-
"react/no-direct-mutation-state",
|
|
2091
|
-
"react/jsx-no-constructed-context-values",
|
|
2092
|
-
"react/forbid-dom-props"
|
|
2093
|
-
]
|
|
2094
|
-
},
|
|
2095
|
-
"strategy": {
|
|
2096
|
-
"preferred": "regex",
|
|
2097
|
-
"fallbacks": ["regex"],
|
|
2098
|
-
"accuracy": {}
|
|
2099
|
-
}
|
|
2100
|
-
},
|
|
2101
|
-
"R004": {
|
|
2102
|
-
"id": "R004",
|
|
2103
|
-
"name": "Rule R004",
|
|
2104
|
-
"description": "Auto-migrated rule R004 from ESLint mapping",
|
|
2105
|
-
"category": "react",
|
|
2106
|
-
"severity": "warning",
|
|
2107
|
-
"languages": ["typescript", "javascript"],
|
|
2108
|
-
"version": "1.0.0",
|
|
2109
|
-
"status": "migrated",
|
|
2110
|
-
"tags": ["migrated"],
|
|
2111
|
-
"engineMappings": {
|
|
2112
|
-
"eslint": ["no-param-reassign", "react/forbid-foreign-prop-types"]
|
|
2113
|
-
},
|
|
2114
|
-
"strategy": {
|
|
2115
|
-
"preferred": "regex",
|
|
2116
|
-
"fallbacks": ["regex"],
|
|
2117
|
-
"accuracy": {}
|
|
2118
|
-
}
|
|
2119
|
-
},
|
|
2120
|
-
"R005": {
|
|
2121
|
-
"id": "R005",
|
|
2122
|
-
"name": "Rule R005",
|
|
2123
|
-
"description": "Auto-migrated rule R005 from ESLint mapping",
|
|
2124
|
-
"category": "react",
|
|
2125
|
-
"severity": "warning",
|
|
2126
|
-
"languages": ["typescript", "javascript"],
|
|
2127
|
-
"version": "1.0.0",
|
|
2128
|
-
"status": "migrated",
|
|
2129
|
-
"tags": ["migrated"],
|
|
2130
|
-
"engineMappings": {
|
|
2131
|
-
"eslint": ["react/jsx-no-bind"]
|
|
2132
|
-
},
|
|
2133
|
-
"strategy": {
|
|
2134
|
-
"preferred": "regex",
|
|
2135
|
-
"fallbacks": ["regex"],
|
|
2136
|
-
"accuracy": {}
|
|
2137
|
-
}
|
|
2138
|
-
},
|
|
2139
|
-
"R006": {
|
|
2140
|
-
"id": "R006",
|
|
2141
|
-
"name": "Rule R006",
|
|
2142
|
-
"description": "Auto-migrated rule R006 from ESLint mapping",
|
|
2143
|
-
"category": "react",
|
|
2144
|
-
"severity": "warning",
|
|
2145
|
-
"languages": ["typescript", "javascript"],
|
|
3366
|
+
"languages": [
|
|
3367
|
+
"typescript",
|
|
3368
|
+
"javascript"
|
|
3369
|
+
],
|
|
2146
3370
|
"version": "1.0.0",
|
|
2147
3371
|
"status": "migrated",
|
|
2148
|
-
"tags": [
|
|
3372
|
+
"tags": [
|
|
3373
|
+
"migrated"
|
|
3374
|
+
],
|
|
2149
3375
|
"engineMappings": {
|
|
2150
3376
|
"eslint": [
|
|
2151
|
-
"
|
|
2152
|
-
"react/jsx-uses-react",
|
|
2153
|
-
"react/jsx-uses-vars"
|
|
3377
|
+
"custom/limit-nested-generics"
|
|
2154
3378
|
]
|
|
2155
3379
|
},
|
|
2156
3380
|
"strategy": {
|
|
2157
3381
|
"preferred": "regex",
|
|
2158
|
-
"fallbacks": [
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
},
|
|
2162
|
-
"R007": {
|
|
2163
|
-
"id": "R007",
|
|
2164
|
-
"name": "Rule R007",
|
|
2165
|
-
"description": "Auto-migrated rule R007 from ESLint mapping",
|
|
2166
|
-
"category": "react",
|
|
2167
|
-
"severity": "warning",
|
|
2168
|
-
"languages": ["typescript", "javascript"],
|
|
2169
|
-
"version": "1.0.0",
|
|
2170
|
-
"status": "migrated",
|
|
2171
|
-
"tags": ["migrated"],
|
|
2172
|
-
"engineMappings": {
|
|
2173
|
-
"eslint": ["react-hooks/rules-of-hooks"]
|
|
2174
|
-
},
|
|
2175
|
-
"strategy": {
|
|
2176
|
-
"preferred": "regex",
|
|
2177
|
-
"fallbacks": ["regex"],
|
|
2178
|
-
"accuracy": {}
|
|
2179
|
-
}
|
|
2180
|
-
},
|
|
2181
|
-
"R008": {
|
|
2182
|
-
"id": "R008",
|
|
2183
|
-
"name": "Rule R008",
|
|
2184
|
-
"description": "Auto-migrated rule R008 from ESLint mapping",
|
|
2185
|
-
"category": "react",
|
|
2186
|
-
"severity": "warning",
|
|
2187
|
-
"languages": ["typescript", "javascript"],
|
|
2188
|
-
"version": "1.0.0",
|
|
2189
|
-
"status": "migrated",
|
|
2190
|
-
"tags": ["migrated"],
|
|
2191
|
-
"engineMappings": {
|
|
2192
|
-
"eslint": ["react-hooks/rules-of-hooks"]
|
|
2193
|
-
},
|
|
2194
|
-
"strategy": {
|
|
2195
|
-
"preferred": "regex",
|
|
2196
|
-
"fallbacks": ["regex"],
|
|
2197
|
-
"accuracy": {}
|
|
2198
|
-
}
|
|
2199
|
-
},
|
|
2200
|
-
"R009": {
|
|
2201
|
-
"id": "R009",
|
|
2202
|
-
"name": "Rule R009",
|
|
2203
|
-
"description": "Auto-migrated rule R009 from ESLint mapping",
|
|
2204
|
-
"category": "react",
|
|
2205
|
-
"severity": "warning",
|
|
2206
|
-
"languages": ["typescript", "javascript"],
|
|
2207
|
-
"version": "1.0.0",
|
|
2208
|
-
"status": "migrated",
|
|
2209
|
-
"tags": ["migrated"],
|
|
2210
|
-
"engineMappings": {
|
|
2211
|
-
"eslint": ["react-hooks/rules-of-hooks"]
|
|
2212
|
-
},
|
|
2213
|
-
"strategy": {
|
|
2214
|
-
"preferred": "regex",
|
|
2215
|
-
"fallbacks": ["regex"],
|
|
3382
|
+
"fallbacks": [
|
|
3383
|
+
"regex"
|
|
3384
|
+
],
|
|
2216
3385
|
"accuracy": {}
|
|
2217
3386
|
}
|
|
2218
3387
|
}
|
|
2219
|
-
},
|
|
2220
|
-
"categories": {
|
|
2221
|
-
"quality": {
|
|
2222
|
-
"name": "Code Quality",
|
|
2223
|
-
"description": "Rules for code quality improvement",
|
|
2224
|
-
"rules": [
|
|
2225
|
-
"C002",
|
|
2226
|
-
"C003",
|
|
2227
|
-
"C006",
|
|
2228
|
-
"C010",
|
|
2229
|
-
"C013",
|
|
2230
|
-
"C014",
|
|
2231
|
-
"C017",
|
|
2232
|
-
"C018",
|
|
2233
|
-
"C023",
|
|
2234
|
-
"C024",
|
|
2235
|
-
"C029",
|
|
2236
|
-
"C030",
|
|
2237
|
-
"C035",
|
|
2238
|
-
"C041",
|
|
2239
|
-
"C042",
|
|
2240
|
-
"C043",
|
|
2241
|
-
"C047",
|
|
2242
|
-
"C048",
|
|
2243
|
-
"C052",
|
|
2244
|
-
"C065",
|
|
2245
|
-
"C072",
|
|
2246
|
-
"C073",
|
|
2247
|
-
"C075",
|
|
2248
|
-
"T002",
|
|
2249
|
-
"T003",
|
|
2250
|
-
"T004",
|
|
2251
|
-
"T007",
|
|
2252
|
-
"T010",
|
|
2253
|
-
"T019",
|
|
2254
|
-
"T020",
|
|
2255
|
-
"T021",
|
|
2256
|
-
"R001",
|
|
2257
|
-
"R002",
|
|
2258
|
-
"R003",
|
|
2259
|
-
"R004",
|
|
2260
|
-
"R005",
|
|
2261
|
-
"R006"
|
|
2262
|
-
],
|
|
2263
|
-
"severity": "warning"
|
|
2264
|
-
},
|
|
2265
|
-
"security": {
|
|
2266
|
-
"name": "Security",
|
|
2267
|
-
"description": "Rules for security best practices",
|
|
2268
|
-
"rules": [
|
|
2269
|
-
"S001",
|
|
2270
|
-
"S002",
|
|
2271
|
-
"S003",
|
|
2272
|
-
"S005",
|
|
2273
|
-
"S006",
|
|
2274
|
-
"S007",
|
|
2275
|
-
"S008",
|
|
2276
|
-
"S009",
|
|
2277
|
-
"S010",
|
|
2278
|
-
"S011",
|
|
2279
|
-
"S012",
|
|
2280
|
-
"S013",
|
|
2281
|
-
"S014",
|
|
2282
|
-
"S015",
|
|
2283
|
-
"S016",
|
|
2284
|
-
"S017",
|
|
2285
|
-
"S018",
|
|
2286
|
-
"S019",
|
|
2287
|
-
"S020",
|
|
2288
|
-
"S022",
|
|
2289
|
-
"S023",
|
|
2290
|
-
"S024",
|
|
2291
|
-
"S025",
|
|
2292
|
-
"S026",
|
|
2293
|
-
"S027",
|
|
2294
|
-
"S029",
|
|
2295
|
-
"S030",
|
|
2296
|
-
"S031",
|
|
2297
|
-
"S032",
|
|
2298
|
-
"S033",
|
|
2299
|
-
"S034",
|
|
2300
|
-
"S035",
|
|
2301
|
-
"S036",
|
|
2302
|
-
"S037",
|
|
2303
|
-
"S038",
|
|
2304
|
-
"S039",
|
|
2305
|
-
"S041",
|
|
2306
|
-
"S042",
|
|
2307
|
-
"S043",
|
|
2308
|
-
"S044",
|
|
2309
|
-
"S045",
|
|
2310
|
-
"S046",
|
|
2311
|
-
"S047",
|
|
2312
|
-
"S048",
|
|
2313
|
-
"S050",
|
|
2314
|
-
"S051",
|
|
2315
|
-
"S052",
|
|
2316
|
-
"S054",
|
|
2317
|
-
"S055",
|
|
2318
|
-
"S056",
|
|
2319
|
-
"S057",
|
|
2320
|
-
"S058"
|
|
2321
|
-
],
|
|
2322
|
-
"severity": "error"
|
|
2323
|
-
},
|
|
2324
|
-
"logging": {
|
|
2325
|
-
"name": "Logging Standards",
|
|
2326
|
-
"description": "Rules related to logging practices",
|
|
2327
|
-
"rules": ["C019", "S057"],
|
|
2328
|
-
"severity": "warning"
|
|
2329
|
-
},
|
|
2330
|
-
"naming": {
|
|
2331
|
-
"name": "Naming Conventions",
|
|
2332
|
-
"description": "Rules for consistent naming patterns",
|
|
2333
|
-
"rules": ["C006"],
|
|
2334
|
-
"severity": "warning"
|
|
2335
|
-
},
|
|
2336
|
-
"design": {
|
|
2337
|
-
"name": "Design Principles",
|
|
2338
|
-
"description": "Rules for software design best practices",
|
|
2339
|
-
"rules": ["C006"],
|
|
2340
|
-
"severity": "warning"
|
|
2341
|
-
},
|
|
2342
|
-
"validation": {
|
|
2343
|
-
"name": "Data Validation",
|
|
2344
|
-
"description": "Rules for proper data validation practices",
|
|
2345
|
-
"rules": ["C031", "S018", "S025", "S026"],
|
|
2346
|
-
"severity": "error"
|
|
2347
|
-
},
|
|
2348
|
-
"architecture": {
|
|
2349
|
-
"name": "Architecture Guidelines",
|
|
2350
|
-
"description": "Rules for system architecture best practices",
|
|
2351
|
-
"rules": ["C014", "C033"],
|
|
2352
|
-
"severity": "error"
|
|
2353
|
-
}
|
|
2354
|
-
},
|
|
2355
|
-
"presets": {
|
|
2356
|
-
"recommended": {
|
|
2357
|
-
"name": "Recommended Rules",
|
|
2358
|
-
"description": "Essential rules for code quality",
|
|
2359
|
-
"rules": {
|
|
2360
|
-
"C019": "warning",
|
|
2361
|
-
"C006": "warning",
|
|
2362
|
-
"C029": "error",
|
|
2363
|
-
"C031": "error"
|
|
2364
|
-
}
|
|
2365
|
-
},
|
|
2366
|
-
"strict": {
|
|
2367
|
-
"name": "Strict Rules",
|
|
2368
|
-
"description": "All rules with maximum enforcement",
|
|
2369
|
-
"rules": {
|
|
2370
|
-
"C019": "error",
|
|
2371
|
-
"C006": "error",
|
|
2372
|
-
"C029": "error",
|
|
2373
|
-
"C031": "error"
|
|
2374
|
-
}
|
|
2375
|
-
},
|
|
2376
|
-
"beginner": {
|
|
2377
|
-
"name": "Beginner Friendly",
|
|
2378
|
-
"description": "Basic rules for learning",
|
|
2379
|
-
"rules": {
|
|
2380
|
-
"C019": "info",
|
|
2381
|
-
"C006": "warning",
|
|
2382
|
-
"C029": "warning"
|
|
2383
|
-
}
|
|
2384
|
-
}
|
|
2385
|
-
},
|
|
2386
|
-
"languages": {
|
|
2387
|
-
"typescript": {
|
|
2388
|
-
"extensions": [".ts", ".tsx"],
|
|
2389
|
-
"analyzer": "ast",
|
|
2390
|
-
"parser": "@typescript-eslint/parser"
|
|
2391
|
-
},
|
|
2392
|
-
"javascript": {
|
|
2393
|
-
"extensions": [".js", ".jsx"],
|
|
2394
|
-
"analyzer": "ast",
|
|
2395
|
-
"parser": "@typescript-eslint/parser"
|
|
2396
|
-
},
|
|
2397
|
-
"dart": {
|
|
2398
|
-
"extensions": [".dart"],
|
|
2399
|
-
"analyzer": "pattern",
|
|
2400
|
-
"parser": "regex"
|
|
2401
|
-
},
|
|
2402
|
-
"kotlin": {
|
|
2403
|
-
"extensions": [".kt", ".kts"],
|
|
2404
|
-
"analyzer": "ast",
|
|
2405
|
-
"parser": "kotlin-parser"
|
|
2406
|
-
}
|
|
2407
|
-
},
|
|
2408
|
-
"metadata": {
|
|
2409
|
-
"version": "1.1.7",
|
|
2410
|
-
"lastUpdated": "2025-08-25",
|
|
2411
|
-
"totalRules": 98,
|
|
2412
|
-
"qualityRules": 33,
|
|
2413
|
-
"securityRules": 51,
|
|
2414
|
-
"stableRules": 45,
|
|
2415
|
-
"experimentalRules": 1,
|
|
2416
|
-
"supportedLanguages": 4,
|
|
2417
|
-
"features": [
|
|
2418
|
-
"Security rules integration",
|
|
2419
|
-
"Category-based rule filtering",
|
|
2420
|
-
"Dynamic rule configuration",
|
|
2421
|
-
"ESLint 9.x integration",
|
|
2422
|
-
"React rules integration",
|
|
2423
|
-
"Memory leak fixes",
|
|
2424
|
-
"S032 HttpOnly session cookies"
|
|
2425
|
-
],
|
|
2426
|
-
"consolidatedFrom": "/Users/bach.ngoc.hoai/Docs/ee/coding-quality/extensions/sunlint/config/rules/rules-registry.json"
|
|
2427
3388
|
}
|
|
2428
3389
|
}
|