防重放攻击

插件名称

名称字段属性
防重放攻击replay_attack_defender安全防控

功能描述

防重放插件通过timestamp以及nonce参数保证请求的唯一性,其基本原理如下:

客户端发起请求时,需要在Header中加入该请求的发起时间X-Ca-Timestamp以及该请求所对应的随机数X-Ca-Nonce(每个请求的nonce都要求是唯一的,建议客户端使用uuid作为nonce的值),并且请求头部还需要加上“X-Ca-Timestamp+X-Ca-Nonce+防重放token”经过md5加密之后的签名X-Ca-Signature,防重放token在插件内设置,也可由网关自动生成。

网关接收到客户端请求后,会首先将“X-Ca-Timestamp+X-Ca-Nonce+防重放token”进行md5加密,并且与X-Ca-Signature对比,因为防重放token是网关生成的并且在网络传输过程中无法被破解,因此校验X-Ca-Signature的一致性可以防止X-Ca-Timestamp和X-Ca-Nonce被人篡改;随后会校验X-Ca-Timestamp是否已经过期,如果未过期,会检查X-Ca-Nonce是否已经存在,如果X-Ca-Nonce不存在,则说明该请求未被篡改并且第一次到达网关。

配置示例

{
    "nonce_header": "x-ca-nonce",
    "replay_attack_token": "apinto",
    "sign_header": "x-ca-signature",
    "timestamp_header": "x-ca-timestamp",
    "ttl": 600
}

字段描述

字段类型描述
nonce_headerstringAPI调用者生成的唯一UUID存放的请求头
replay_attack_tokenstring与nonce_header、timestamp_header设置的头部值一起参与签名
sign_headerstring防重放签名存放的请求头
timestamp_headerstring10位时间戳存放的请求头
ttlint防重放攻击有效时间,单位秒

注意事项

该插件需要配合Redis使用,Redis配置可参考Redis配置教程open in new window

请求示例

假设API配置的重定向插件,插件配置如下:

{
    "nonce_header": "x-ca-nonce",
    "replay_attack_token": "93c5a393-3a96-423a-84ad-f8fd4b9f55b9",
    "sign_header": "x-ca-signature",
    "timestamp_header": "x-ca-timestamp",
    "ttl": 600
}

此时发送的API请求应包含以下请求头:

  • X-Ca-Nonce:API调用者生成的唯一UUID,结合时间戳防重放。
  • X-Ca-Timestamp:10位unix时间戳,值为当前时间的秒数,时间戳默认有效时间为600秒(即10分钟)。
  • X-Ca-Signature:请求签名,值为32位小写MD5加密:MD5(X-Ca-Timestamp + X-Ca-Nonce + replayAttackToken),参数顺序不能有误。

X-Ca-Timestamp = "1750148912"  // 时间戳根据实际情况填写
X-Ca-Nonce = "0ca206d0-aabb-4314-84e7-7b735a0b27c3"
replayAttackToken = "93c5a393-3a96-423a-84ad-f8fd4b9f55b9"

此时X-Ca-Signature=MD5("17501489120ca206d0-aabb-4314-84e7-7b735a0b27c393c5a393-3a96-423a-84ad-f8fd4b9f55b9")

使用Curl发起请求:

curl --location '127.0.0.1:8099/api/router' \
--header 'X-Ca-Nonce: 0ca206d0-aabb-4314-84e7-7b735a0b27c3' \
--header 'X-Ca-Timestamp: 1750148912' \
--header 'X-Ca-Signature: 211ec0d061d97cb84b44a5f351ff5bf5' \
--header 'Cookie: uid=1'

第一次访问:

第二次访问: