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

ModSecurity/Coraza中混合逻辑AND与OR的规则配置及Host匹配优化

解决ModSecurity/Coraza中混合AND与OR的规则配置问题

需求回顾

需要实现的逻辑:当源IP属于指定CIDR网段 且 请求Host头是指定域名之一时,拒绝请求,等价于:

if (srcIp in ['3.4.5.0/24', '2.3.4.0/24']) AND (host in ['foo.com', 'bar.com'])
  deny

问题分析

  • 链式规则默认是AND逻辑,适合实现IP和Host的组合判断
  • 使用@pm匹配Host会导致子串误匹配(如abar.com、bar.coma),因为@pm是子串匹配,而非精确匹配

解决方案

方法1:链式规则 + 正则精确匹配Host(推荐)

利用链式规则实现AND逻辑,第二条规则用@rx正则精确匹配多个域名(通过|实现OR):

SecRule REQUEST_HEADERS:X-Forwarded-For "@ipMatch 3.4.5.0/24,2.3.4.0/24" "id:9,phase:1,chain,deny"
  SecRule REQUEST_HEADERS:Host "@rx ^(foo\.com|bar\.com)$" "id:10,phase:1"
  • 正则中的^和$确保匹配整个Host头内容,避免子串误匹配
  • 链式规则要求两条规则同时满足,完美实现IP匹配 AND Host匹配任一指定域名的逻辑

方法2:使用@pmFromFile配合精确域名列表

如果域名数量较多,可以将精确域名写入文件(每行一个域名),然后用@pmFromFile结合anchored参数实现精确匹配:

  1. 创建域名文件domains.txt:
foo.com
bar.com
  1. 配置链式规则:
SecRule REQUEST_HEADERS:X-Forwarded-For "@ipMatch 3.4.5.0/24,2.3.4.0/24" "id:9,phase:1,chain,deny"
  SecRule REQUEST_HEADERS:Host "@pmFromFile domains.txt" "id:10,phase:1,anchored"
  • anchored参数强制规则匹配整个字符串,实现精确匹配,避免子串误判

方法3:多个Host规则用OR逻辑组合(适合域名极少场景)

如果不想用正则,也可以用OR操作符将多个Host精确匹配规则组合,再和IP规则链式:

SecRule REQUEST_HEADERS:X-Forwarded-For "@ipMatch 3.4.5.0/24,2.3.4.0/24" "id:9,phase:1,chain,deny"
  SecRule REQUEST_HEADERS:Host "@eq foo.com" "id:10,phase:1,OR"
  SecRule REQUEST_HEADERS:Host "@eq bar.com" "id:11,phase:1"
  • 这种方式需要为每个域名单独写规则,维护性不如正则或文件配置

验证要点

  • 测试X-Forwarded-For为3.4.5.10且Host为foo.com:应触发拒绝
  • 测试X-Forwarded-For为3.4.5.10且Host为abar.com:不应触发
  • 测试X-Forwarded-For为1.2.3.4且Host为foo.com:不应触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:42:37