API Shield 顺序自定义规则使用配置的 API Shield 会话标识符 来跟踪用户发出的请求顺序以及请求之间的时间,并使其通过 Cloudflare 规则 (Cloudflare Rules) 可用。这允许您编写匹配有效或无效顺序的规则。
这些规则类似于常规 Cookie 顺序规则,但具有不同的一组前提条件:
- 它们要求在 API Shield 中设置会话标识符。
- 因为它们要求会话标识符,所以它们只能用于可以通过会话标识符清楚地归因于单个用户的流量(已验证身份的流量)。
- 因为 Cloudflare 将用户状态存储在内存中而不是 cookie 中,所以会话的顺序生命周期限制为 10 分钟。
- 您必须设置至少一个 API 顺序规则 才能激活顺序系统。
使用这些自定义规则构建的规则类似于通过 API 或 Cloudflare 仪表板配置的顺序规则,因为它们利用了相同的底层技术。然而,这些自定义规则通过在记录的顺序之上使用自由格式逻辑,并提供对规则集提供的完整响应选项的访问,从而允许更大的灵活性。
以下序列字段可用于:
- 自定义规则(
http_request_firewall_custom阶段) - 速率限制规则(
http_request_ratelimit) - 批量重定向(
http_request_redirect) - 请求头转换规则(
http_request_late_transform)
| 字段名称 | 描述 | 示例值 |
|---|---|---|
| 此字段包含与当前请求匹配的操作 ID。如果当前请求与 Endpoint Management 中定义的任何操作均不匹配,则该值为空字符串。 |
|
| 此字段包含序列中先前操作 ID 的数组,按从最近到最早的顺序排列,不包含当前请求。 |
|
| 此字段包含一个映射,其中键为操作 ID,值为该操作最近一次发生距今的毫秒数。 |
|
-
在 Cloudflare 仪表板中,转到 Security rules(安全规则) 页面。
Go to Security rules ↗ -
要创建新的空规则,请选择 Create rule(创建规则) > Custom rules(自定义规则)。
-
在 Rule name(规则名称) 中输入该规则的描述性名称。
-
在 When incoming requests match(当传入请求匹配时) 下,使用 Field(字段) 下拉列表按 Sequences 进行筛选,然后从以下选项中进行选择:
- Current Operation
- Previous Operations
- Elapsed time
-
在 Value(值) 下,选择编辑图标以使用 Builder 并并在侧面板上构建序列。
-
在 Select a hostname for this sequence 下,从下拉列表中选择所有或特定的主机名。或者,您可以使用搜索栏搜索特定的主机名。
-
从 Methods 下拉列表中选择所有方法或特定的请求方法。
-
按照您希望它们在序列中出现的顺序,选中每个端点的复选框。
-
设置完成时间。
-
选择 Save(保存)。
-
在 Then take action(接着采取措施) 下,在 Choose action(选择操作) 下拉菜单中选择规则操作。例如,选择 Block(阻止)将指示 Cloudflare 拒绝符合您指定条件的请求。
-
(可选)如果您选择了 Block 操作,您可以配置自定义响应。
-
在 Place at(放置位置) 下,选择规则触发的顺序。
-
要保存并部署您的规则,请选择 Deploy(部署)。如果您还没准备好部署规则,请选择 Save as Draft(保存为草稿)。
- 登录到 Cloudflare 仪表板 ↗,并选择您的账户和域。
- 转到 Security(安全性) > WAF > Custom rules(自定义规则)。
- 要创建新的空规则,请选择 Create rule(创建规则)。
- 在 Rule name(规则名称) 中输入该规则的描述性名称。
- 在 When incoming requests match(当传入请求匹配时) 下,使用 Field(字段) 下拉列表并选择:
- Current Operation
- Previous Operations
- Elapsed time
- 在 Value(值) 下,通过为序列选择主机名来构建序列。
- 按照您希望它们在序列中出现的顺序,选中每个端点的复选框。
- 设置完成时间。
- 选择 Save(保存)。
- 在 Then take action(接着采取措施) 下,在 Choose action(选择操作) 下拉菜单中选择规则操作。例如,选择 Block(阻止)将指示 Cloudflare 拒绝符合您指定条件的请求。
- (可选)如果您选择了 Block 操作,您可以配置自定义响应。
- 在 Place at(放置位置) 下,选择规则触发的顺序。
- 要保存并部署您的规则,请选择 Deploy(部署)。如果您还没准备好部署规则,请选择 Save as Draft(保存为草稿)。
每个保存的端点在端点管理的详细信息页面中都会有一个 UUID 格式的端点 ID。下面的引用(aaaaaaaa、bbbbbbbb 和 cccccccc)是端点 ID 的前八个字符。
访问者在请求端点 aaaaaaaa 之后必须等待超过 2 秒才能请求端点 bbbbbbbb:
cf.sequence.current_op eq "bbbbbbbb" and
cf.sequence.msec_since_op["aaaaaaaa"] ge 2000访问者必须严格按照该顺序请求端点 aaaaaaaa,然后是 bbbbbbbb,接着是 cccccccc:
cf.sequence.current_op eq "cccccccc" and
cf.sequence.previous_ops[0] == "bbbbbbbb" and
cf.sequence.previous_ops[1] == "aaaaaaaa"访问者必须在请求端点 bbbbbbbb 之前请求端点 aaaaaaaa,但是端点 aaaaaaaa 可以出现在之前的 10 个请求中的任何位置:
cf.sequence.current_op eq "bbbbbbbb" and
any(cf.sequence.previous_ops[*] == "aaaaaaaa")访问者必须在请求端点 bbbbbbbb 之前请求端点 aaaaaaaa,或者在请求端点 bbbbbbbb 之前请求端点 cccccccc:
(cf.sequence.current_op eq "bbbbbbbb" and
any(cf.sequence.previous_ops[*] == "aaaaaaaa")) or
(cf.sequence.current_op eq "bbbbbbbb" and
any(cf.sequence.previous_ops[*] == "cccccccc"))