You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多CRS规则触发时,如何降低特定路径的总异常分数?

解决WordPress表单提交被ModSecurity拦截的问题

问题背景

已部署Nginx+最新版ModSecurity+OWASP CRS保护WordPress站点,偏执级别设为3。站点运行基本正常,但提交表单时触发多条规则,最终因累计异常分数超过阈值(默认5分)被拦截。希望通过调整规则异常分数而非直接绕过规则来解决问题,但之前基于GPT方案修改的规则无效。

触发的规则详情

  • Rule ID 920230 - Multiple URL Encoding Detected
    匹配数据:ARGS:data参数存在多次URL编码
    拦截原因:检测到参数编码异常,此类异常常被用于双重编码绕过输入验证
    标签:paranoia-level/2
  • Rule ID 920272 - Invalid Character in Request
    匹配数据:请求包含可打印ASCII范围外的字符
    拦截原因:请求体存在编码或意外字符
    标签:paranoia-level/3
  • Rule ID 942430 & 942431 - SQL Injection-Like Patterns
    匹配数据:表单数据包含过多特殊字符(如&、=、%)
    拦截原因:含过多特殊字符的请求被标记为潜在SQL注入尝试
    标签:paranoia-level/2(942430)、paranoia-level/3(942431)
  • Rule ID 949110 - Inbound Anomaly Score Exceeded
    拦截原因:请求累计异常分数超过默认拦截阈值(5分),由上述多规则触发导致

之前尝试的无效规则

# Adjusting anomaly scores for specific rules and paths

# Rule adjustments for /wp-admin/admin-ajax.php
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900500,\
    phase:1,\
    pass,\
    t:none,\
    setvar:'tx.notice_anomaly_score=1',\
    setvar:'tx.warning_anomaly_score=2',\
    setvar:'tx.error_anomaly_score=3',\
    setvar:'tx.critical_anomaly_score=4'"

# Specific rule: 920230 (Multiple URL Encoding Detected)
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900501,\
    phase:2,\
    pass,\
    t:none,\
    ctl:ruleModifyById=920230;"

# Adjust anomaly score for rule 920230
SecAction \
    "id:900502,\
    phase:2,\
    pass,\
    t:none,\
    setvar:'tx.anomaly_score=-1',\
    chain"
    SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" "t:none"

# Specific rule: 920272 (Invalid character in request body)
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900503,\
    phase:2,\
    pass,\
    t:none,\
    ctl:ruleModifyById=920272;"

# Adjust anomaly score for rule 920272
SecAction \
    "id:900504,\
    phase:2,\
    pass,\
    t:none,\
    setvar:'tx.anomaly_score=-1',\
    chain"
    SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" "t:none"

# Specific rule: 942430 (SQL Character Anomaly Detection, 12 characters)
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900505,\
    phase:2,\
    pass,\
    t:none,\
    ctl:ruleModifyById=942430;"

# Adjust anomaly score for rule 942430
SecAction \
    "id:900506,\
    phase:2,\
    pass,\
    t:none,\
    setvar:'tx.anomaly_score=-1',\
    chain"
    SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" "t:none"

# Specific rule: 942431 (SQL Character Anomaly Detection, 6 characters)
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900507,\
    phase:2,\
    pass,\
    t:none,\
    ctl:ruleModifyById=942431;"

# Adjust anomaly score for rule 942431
SecAction \
    "id:900508,\
    phase:2,\
    pass,\
    t:none,\
    setvar:'tx.anomaly_score=-1',\
    chain"
    SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" "t:none"

# Evaluate and block based on reduced anomaly score
SecRule TX:BLOCKING_INBOUND_ANOMALY_SCORE "@ge 5" \
    "id:900509,\
    phase:2,\
    deny,\
    log,\
    t:none,\
    msg:'Inbound Anomaly Score Exceeded (Adjusted Score)',\
    tag:'OWASP_CRS',\
    tag:'anomaly-evaluation',\
    setvar:'tx.blocking_inbound_anomaly_score=+5'"

可行解决建议

方案1:针对性调整目标路径下规则的异常分数

直接修改触发规则在/wp-admin/admin-ajax.php路径下的严重级别,降低其异常分数权重。默认OWASP CRS中,NOTICE级对应1分、WARNING对应2分、ERROR对应4分、CRITICAL对应5分,调整后总分数不会超过阈值:

# 仅对/wp-admin/admin-ajax.php路径调整指定规则的严重级别
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900001,\
    phase:1,\
    pass,\
    nolog,\
    ctl:ruleUpdateById=920230,severity=NOTICE,\
    ctl:ruleUpdateById=920272,severity=NOTICE,\
    ctl:ruleUpdateById=942430,severity=NOTICE,\
    ctl:ruleUpdateById=942431,severity=NOTICE"

方案2:单独提高目标路径的拦截阈值

如果不想修改规则本身的分数,可以给表单提交的目标路径单独设置更高的异常分数阈值:

# 为/wp-admin/admin-ajax.php路径设置更高的拦截阈值(示例设为10分)
SecRule REQUEST_URI "@beginsWith /wp-admin/admin-ajax.php" \
    "id:900002,\
    phase:1,\
    pass,\
    nolog,\
    setvar:'tx.blocking_inbound_anomaly_score=10'"

方案3:排除特定参数的规则检测

针对频繁触发规则的ARGS:data参数,单独排除对应规则的检测(需确认该参数为合法表单提交参数,无安全风险):

# 排除ARGS:data参数触发920230规则
SecRule ARGS_NAMES "@streq data" \
    "id:900003,\
    phase:2,\
    pass,\
    nolog,\
    ctl:ruleRemoveById=920230"

# 排除ARGS:data参数触发942430、942431规则
SecRule ARGS_NAMES "@streq data" \
    "id:900004,\
    phase:2,\
    pass,\
    nolog,\
    ctl:ruleRemoveById=942430,\
    ctl:ruleRemoveById=942431"

方案4:根源修复表单提交问题

从表单本身出发解决触发规则的原因:

  • 检查前端代码,确保data参数不存在重复URL编码的情况
  • 排查表单输入是否包含非打印ASCII字符,去除或转换此类字符后再提交

内容的提问来源于stack exchange,提问作者user2852591

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:49:59