边缘脚本
边缘脚本:用几十行 Lua 在节点上做自定义认证和自定义跳转,在 WAF 规则里选择“运行脚本”动作;含开通方式、可用 API 和失败策略。
作用
边缘脚本是一段用 Lua 写的小程序,在 WAF 规则命中后由节点运行。脚本读取请求信息,然后决定放行、返回某个状态码、跳转到别的地址,或给请求和响应加头。固定形状的条件写不出来的逻辑,可以用它实现。
使用场景
- 校验自定义的登录令牌或签名头,没有就返回 401。
- 按 Cookie、国家、路径把访客跳转到不同地址。
- 给发往源站的请求加一个头,或给响应加一个头。
开通方式
边缘脚本默认不开通,需要同时满足两项:授权里包含“边缘脚本”模块;账号所在套餐里开启了边缘脚本。未开通时菜单页面会提示“边缘脚本尚未开通”,请联系平台运营开通。
在哪里配置
- 控制台菜单“边缘脚本”:新建脚本,编写源码,语法检查,试运行,发布。
- 安全策略的 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.resp | set_header(name, value) 设置响应头;exit(status) 返回状态码;redirect(url, status) 跳转 |
cdnca.crypto | sha256、hmac_sha256、base64_encode、base64_decode、hex_encode、hex_decode |
cdnca.json | decode、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)、放行请求 | 选“放行”时,出错的请求会绕过脚本里的认证逻辑 |
| 指令数 | 100000 | 10000 到 1000000 | 一次运行最多执行的指令数 |
| 时间(毫秒) | 2 | 1 到 10 | 一次运行最长耗时 |
| 内存(KiB) | 2048 | 256 到 16384 | 一次运行的内存预算 |
| 源码 | 无 | 最大 32 KiB | 只接受源码 |
每个账号最多 50 个脚本,每个脚本保留最近 100 个版本。
版本、发布与回滚
- “保存草稿”只保存,不影响线上。
- “发布”前先做语法检查;通过后生成新版本并设为当前版本,引用它的网站自动重新发布。
- “回滚到此版本”把当前版本指回历史版本,草稿不变;“载入为草稿”把历史版本的源码复制到草稿。
- 被规则引用的脚本不能删除。
试运行
“试运行”页签填写模拟请求(方法、URI、客户端 IP、国家、请求头、Cookie),可以用草稿运行而不保存。结果显示放行、返回的状态码、跳转地址、设置的头或失败原因。这是主控上的模拟结果,节点上的真实结果以安全日志为准;每个账号每分钟可试运行 30 次。
常见问题
脚本出错时访客看到什么
按“出错或超限时”的设置:默认返回 503,选“放行”则请求继续。失败原因分为语法、指令数、超时、内存、超出长度或复杂度、运行出错和源码不可用。
在哪里看脚本的执行结果
安全日志里检测器显示为 script,匹配内容写明脚本和版本以及结果。只有失败和返回 400 以上状态码的结果会记录,放行和跳转不记。
提示检查未通过
页面会列出问题和行号,例如语法错误、使用了不允许的名称或字段、一个表达式拼接超过 16 段、源码超过 32 KiB。
脚本能用 print、io、os 或请求外部地址吗
脚本只能使用上表的 API。