自定义规则

更新时间:
复制 MD 格式

如果您的站点需要自定义控制用户的访问策略,您可以在自定义规则中设置请求匹配条件,并通过拦截、观察等方式控制匹配到的用户请求,帮助您的站点更加灵活的限制用户可访问的内容。

重要

客户端 IP 归属的准确性说明

使用 WAF 自定义规则结合规则引擎来拦截客户端请求时,由于规则引擎对客户端 IP 归属的「洲」、「国家 / 地区」、「省份」、「运营商」信息无法做到 100% 准确,很可能存在误识别的情况,因此请谨慎使用。

如果出现客户端 IP 归属信息识别不准确的情况,可以使用白名单规则放行指定的 IP 地址,避免正常的客户端 IP 被 WAF 误拦截。

配置自定义规则

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择安全防护 > WAF

  3. 单击自定义规则页签,进入自定义规则页签,单击新增规则

    • 填写规则名称

    • 如果请求匹配以下规则...区域设置要匹配的用户请求特征,请求匹配规则参见规则表达式语法

    • 则执行…区域设置当请求命中该规则时,要执行的防护动作,详细信息请参见执行动作说明

  4. 单击确定

说明

配置规则时,请注意以下事项:

  • User-Agent 匹配大小写:配置 User-Agent 匹配规则时,若选择不区分大小写匹配模式,则匹配值需全部设置为小写。同时,请根据实际需求确认选择精准匹配(等于)还是模糊匹配(包含),避免因匹配模式选择不当导致规则未生效(例如状态码仍返回 200)。

  • 规则引擎能力边界:当前 WAF 规则引擎仅支持判断请求字段是否包含特定字符串(返回布尔值),不支持对匹配结果进行数组长度计算或计数判断,因此无法实现"拦截 URL 中包含超过 N 个某关键词"这类复杂逻辑。WAF 防护策略需基于客户端 IP、User-Agent、Referer、URI 等请求特征进行配置,不支持仅通过访客 ID 等业务层标识进行拦截。

执行动作说明

  • 拦截:表示拦截命中规则的请求,并向发起请求的客户端返回拦截响应页面。

    说明

    若需要在拦截操作中自定义拦截页面时,请参见自定义页面

  • 观察:表示不拦截命中规则的请求,只通过日志记录请求命中了规则。您可以通过WAF日志,查询命中当前规则的请求,分析规则的防护效果(例如,是否有误拦截等)。观察模式方便您试运行首次配置的规则,待确认规则没有产生误拦截后,再将规则设置为拦截模式。

    说明

    只有开通日志服务,您才可以使用日志查询功能。

  • JS挑战:表示ESA向客户端返回一段正常浏览器可以自动执行的JavaScript代码。如果客户端正常执行了JavaScript代码,则ESA在一段时间(默认30分钟)内放行该客户端的所有请求(不需要重复验证),否则拦截请求。

  • 滑块挑战ESA向客户端返回滑动验证页面。如果客户端成功执行滑动验证,则ESA在 30 分钟(默认)内放行该客户端的所有请求,否则拦截请求。

    说明
    • 如果结果为通过(即正常用户成功完成滑块挑战),则计入流量。如果结果为拦截,则免计流量。

    • WAF自定义规则、频次控制规则的JS挑战和滑块验证仅适用于静态页面。如需兼容XMLHttpRequestFetch等异步接口响应,需在Bots中启用JS挑战和滑块验证。启用后,当请求命中规则时,ESA对客户端发起JS挑战或滑块验证,当客户端通过后将会在HTTP报文的Header中分别植入Cookie acw_sc__v2acw_sc__v3,用于表示客户端已通过验证。

  • 严格滑块挑战:严格滑块验证模式下,客户端的每次请求都需要验证(无滑块挑战的30分钟内放行已通过挑战客户端请求的特性),请按需谨慎开启。且严格滑块挑战仅企业版可申请开通使用。

自定义规则支持 JS 挑战和滑块验证两种人机验证执行动作:

  • JS 挑战:无感验证。系统向客户端下发 JavaScript 代码自动完成验证,用户无需手动操作。

  • 滑块验证:显式验证。用户需完成滑动操作以通过验证。

说明

使用 JS 挑战和滑块验证时,请注意以下限制:

  • JS挑战滑块挑战仅适用于静态页面请求,不适用于 POST 表单提交、API 接口等动态请求场景,否则可能导致表单数据丢失或重复触发验证。

  • 对图片等纯资源文件启用JS挑战滑块挑战时,可能因浏览器机制导致验证失败从而无法正常显示资源。建议对纯图片类型域名或资源路径配置拦截动作或通过白名单放行,避免使用人机验证。

  • JS挑战通过后,放行时长默认为 30 分钟,暂不支持调整。放行有效期内,已通过验证的客户端无需再次完成人机验证。

如需一点即过等更多验证码类型,可使用AI验证码功能,支持一点即过、滑块、旋转等验证方式,在 ESA 控制台单独配置。

说明

图片类业务的处置动作建议:对以图片等纯资源文件访问为主的业务场景,本文档前述“对纯图片类型域名或资源路径配置拦截动作或通过白名单放行,避免使用人机验证”的建议仍然适用;如果确需对该类资源启用人机验证进行二次确认,建议优先选择无感的JS挑战而非需要用户手动操作的滑块挑战,以降低对图片加载体验的影响。

配置示例

场景:通过安全分析事件分析中发现了IP192.168.0.1的客户端向主机dns.example.com发起了异常请求行为。image

配置方式

image

参数

示例值

如果请求匹配以下规则...

同时满足:

  • 主机名等于dns.example.com

  • 客户端IP等于192.168.0.1

可直接编辑使用表达式:(http.host eq "dns.example.com" and ip.src eq 192.168.0.1)

则执行…

拦截并响应默认拦截页面

防护效果:符合自定义规则条件的请求将被拦截。image

常见配置示例

以下为高频防护场景的配置参考,可根据实际需求调整。

场景 1:拦截特定爬虫(以 Bytespider 为例)

如果请求匹配以下规则...区域设置:匹配字段选择User-Agent,运算符选择包含,值填写 Bytespider;在执行动作区域选择拦截

场景 2:限制请求方法(仅允许 GET 和 POST)

配置规则:请求方法不等于 GET 且不等于 POST 时,执行拦截动作。此场景需高级版及以上套餐支持。

场景 3:仅允许指定 IP 访问特定子域名

组合两个匹配条件:主机名等于目标子域名,同时客户端 IP 不等于指定 IP,执行动作选择拦截

场景 4:拦截空 Referer 请求并放行特定直访路径

需配置两条规则并设置优先级:

  1. 白名单规则(高优先级):当请求URI 等于需支持直访的路径(如首页 /、文章页)时,执行跳过全部规则动作。

  2. 拦截规则(低优先级):当Referer 为空时,执行拦截动作。

白名单规则的优先级必须高于拦截规则,以确保正常直访路径不受影响。

场景 5:拦截特定 URL 路径的异常请求

配置组合条件:URI 包含特定字符串,且Referer 为空,执行动作选择拦截JS 挑战

场景 6:拦截特定 Referer 来源域名

Referer 匹配字段配置需基础版或更高套餐。

当您需要屏蔽特定来源域名的访问请求时,在如果请求匹配以下规则...区域设置:匹配字段选择Referer,运算符选择包含,值填写目标域名(如 example.com);在执行动作区域选择拦截,响应码设为 403

场景 7:允许微信小程序正常访问资源

微信小程序发起的请求通常不携带Referer。如果您已经配置了基于Referer 为空的拦截规则(参见场景 4、场景 5),微信小程序的正常访问请求也会被一并误拦。为避免此问题,建议新增一条优先级高于该拦截规则的自定义规则:在匹配条件区域,匹配字段选择User Agent,运算符选择包含,值填写 WeChat;在执行动作区域选择放行(或跳过全部规则),使命中该条件的微信小程序请求在轮询到低优先级的 Referer 拦截规则之前已被放行。

场景 8:仅允许指定域名访问当前站点

如果您需要严格限制只有指定来源域名才能访问当前站点,实现跨域访问控制,可以组合主机名Referer 两个匹配条件:匹配字段选择主机名,运算符选择等于,值填写当前站点域名(如 blog.example.com);再新增一个匹配条件,匹配字段选择Referer,运算符选择包含,值填写允许访问的来源域名(如 api.example.com);两个匹配条件之间的逻辑关系选择同时满足。在执行动作区域选择拦截。配置完成后,只有主机名等于目标域名且 Referer 包含指定来源域名的请求才能正常访问,其余请求将被拦截。

说明

对异常User Agent(例如版本号异常,如 0.0.0)配置拦截规则时,命中真实用户的概率极低,但仍建议谨慎处理:如果担心误拦截,可以将执行动作拦截调整为滑块挑战JS挑战进行二次确认,而非直接拦截。您还可以结合安全分析观察 User Agent 分布规律与Referer 特征,综合判断是否为爬虫流量,并据此配置针对性的防护规则。

不同套餐的支持情况

功能项

免费版

基础版

标准版

高级版

企业版

自定义规则条数

5

10

50

100

100

说明

免费版套餐不支持 Ip.Geoip.Country 等资源类型匹配条件。若在自定义规则中使用该字段,系统将报错 Ip.Geoip.Country.NotSupport,需升级套餐方可使用地理位置相关匹配条件。

常见问题

配置 IP 相关匹配条件时,应该使用哪个字段来防止 IP 伪造?

自定义规则的匹配字段中,客户端IPip.src)与X-Forwarded-Forhttp.x_forwarded_for)是两个语义不同的独立匹配字段:客户端IP 取自与 ESA 建立连接的客户端 IP,不受客户端请求头影响;X-Forwarded-For 是 HTTP 请求头中的字段,可以被客户端任意伪造。因此配置基于 IP 的匹配条件(如地域限制、IP 黑白名单)时,建议优先使用客户端IP 作为匹配字段,避免使用X-Forwarded-For,以防止攻击者通过伪造该请求头绕过拦截规则。

如果您的源站需要获取客户端真实 IP,建议在转换规则托管转换中开启添加真实客户端 IP 请求头,默认会在回源请求中添加名为 ali-real-client-ip 的请求头(标头名称可自定义),源站侧读取该请求头即可获取真实客户端 IP,而不依赖可能被伪造的 X-Forwarded-For 头。

如果您需要避免客户端提交的 X-Forwarded-For 头传递到源站造成干扰,可以在转换规则中配置修改出站请求头功能,对指定请求头执行新增、删除或修改操作。

为什么配置了地域/国家拦截规则,但非目标地区 IP 仍能访问?

如果规则中除国家/地区匹配条件外,还组合了其他匹配条件(如主机名URI 等),当这些组合条件与实际请求不完全一致时,整条规则不会被触发,非目标地区的 IP 就可能正常访问。建议检查规则表达式中主机名URI 等字段的值是否与实际访问的请求特征一致,也可以先通过安全分析或事件分析查看实际流量特征,再据此调整规则逻辑。组合条件的表达式语法可参见请求匹配规则

为什么基于国家/地区的拦截规则会出现误拦截或无法识别 Unknown 地区?

IP 归属地信息(洲、国家/地区、省份、运营商)无法做到 100% 准确,且 VPN 或代理服务会改变 IP 的归属地显示,导致地理位置拦截失效。

私有 IP 段(如 100.64.0.0/10)及代理 IP 可能被识别为 Unknown 地区,ESA 不支持直接拦截 Unknown 地区。

建议:

  • 在地域限制规则中增加 User-AgentReferer 的组合条件(例如:非指定地域 AND User-Agent 不是特定值),降低单独依赖地域判断带来的误报。

  • 出现误拦截时,可配置白名单规则放行正常 IP。

第三方回调(如支付宝回调)被 WAF 误拦截,如何处理?

分析回调请求的共性特征(例如:URI 路径包含 /pay/notify/、特定 User-Agent 标识、固定请求方式为 POST 等),然后在自定义规则中配置白名单放行规则:当请求同时满足上述特征时,跳过全部规则动作。

若无法确定完整特征,可先针对攻击特征配置拦截规则,再逐步测试验证回调是否正常通过。

访问出现 403 Forbidden 错误如何排查?

访问返回 403 Forbidden,常见原因包括:命中了 WAF 的自定义规则拦截动作、命中了 IP 黑名单、触发了 Referer 防盗链规则、或触发了地域/国家访问限制等访问控制策略。

排查时,建议先获取完整的 HTTP 响应头信息,响应头中通常会包含命中规则的相关标识,可用于定位具体触发的规则;然后登录 ESA 控制台,在安全防护模块下逐一检查自定义规则的匹配条件与执行动作、IP 访问规则(黑名单)配置,以及缓存资源相关配置,确认是哪条规则或策略导致了本次拦截。

相关文档

规则相关的功能,在生效优先级、可重入性、生效颗粒度上存在差异,详细情况请查看规则相关功能的特性说明