查看文档目录

边缘脚本

边缘脚本:用几十行 Lua 在节点上做自定义认证和自定义跳转,在 WAF 规则里选择“运行脚本”动作;含开通方式、可用 API 和失败策略。

作用

边缘脚本是一段用 Lua 写的小程序,在 WAF 规则命中后由节点运行。脚本读取请求信息,然后决定放行、返回某个状态码、跳转到别的地址,或给请求和响应加头。固定形状的条件写不出来的逻辑,可以用它实现。

使用场景

  • 校验自定义的登录令牌或签名头,没有就返回 401。
  • 按 Cookie、国家、路径把访客跳转到不同地址。
  • 给发往源站的请求加一个头,或给响应加一个头。

开通方式

边缘脚本默认不开通,需要同时满足两项:授权里包含“边缘脚本”模块;账号所在套餐里开启了边缘脚本。未开通时菜单页面会提示“边缘脚本尚未开通”,请联系平台运营开通。

在哪里配置

  1. 控制台菜单“边缘脚本”:新建脚本,编写源码,语法检查,试运行,发布。
  2. 安全策略的 WAF 规则里,动作选“运行脚本”,选择已发布的脚本。

脚本在 WAF、挑战之后、HTTP 策略和缓存之前运行,所以缓存命中的请求也会先经过脚本。观察模式下规则只记日志,不运行脚本。一个请求最多运行一个脚本。

示例

没有 X-Sign 请求头就返回 401,有就继续:

local sign = cdnca.req.headers["x-sign"]
if not sign then
  return cdnca.resp.exit(401)
end

可用 API

名称内容
cdnca.req只读:method、uri、args、headers、ip、country、cookie(name);set_header(name, value) 修改发往源站的请求头
cdnca.respset_header(name, value) 设置响应头;exit(status) 返回状态码;redirect(url, status) 跳转
cdnca.cryptosha256、hmac_sha256、base64_encode、base64_decode、hex_encode、hex_decode
cdnca.jsondecode、encode
标准库string、table、math、bit 里的常用函数,以及 assert、error、ipairs、pairs、select、tonumber、tostring、type、unpack

exit 的状态码可用 200、204 和 400 到 599;redirect 的状态码可用 301、302、303、307、308。

配置项

配置项默认值范围说明
名称、描述无名称在账号内唯一
出错或超限时拒绝请求(503)拒绝请求(503)、放行请求选“放行”时,出错的请求会绕过脚本里的认证逻辑
指令数10000010000 到 1000000一次运行最多执行的指令数
时间(毫秒)21 到 10一次运行最长耗时
内存(KiB)2048256 到 16384一次运行的内存预算
源码无最大 32 KiB只接受源码

每个账号最多 50 个脚本,每个脚本保留最近 100 个版本。

版本、发布与回滚

  • “保存草稿”只保存,不影响线上。
  • “发布”前先做语法检查;通过后生成新版本并设为当前版本,引用它的网站自动重新发布。
  • “回滚到此版本”把当前版本指回历史版本,草稿不变;“载入为草稿”把历史版本的源码复制到草稿。
  • 被规则引用的脚本不能删除。

试运行

“试运行”页签填写模拟请求(方法、URI、客户端 IP、国家、请求头、Cookie),可以用草稿运行而不保存。结果显示放行、返回的状态码、跳转地址、设置的头或失败原因。这是主控上的模拟结果,节点上的真实结果以安全日志为准;每个账号每分钟可试运行 30 次。

常见问题

脚本出错时访客看到什么

按“出错或超限时”的设置:默认返回 503,选“放行”则请求继续。失败原因分为语法、指令数、超时、内存、超出长度或复杂度、运行出错和源码不可用。

在哪里看脚本的执行结果

安全日志里检测器显示为 script,匹配内容写明脚本和版本以及结果。只有失败和返回 400 以上状态码的结果会记录,放行和跳转不记。

提示检查未通过

页面会列出问题和行号,例如语法错误、使用了不允许的名称或字段、一个表达式拼接超过 16 段、源码超过 32 KiB。

脚本能用 print、io、os 或请求外部地址吗

脚本只能使用上表的 API。