马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
配置信息
- {
- key: token的密钥
- expires:过期时间,默认7200(秒)
- name: token在cookie中的名称,默认是apisix-csrf-token
- }
复制代码 插件解释
先在cookie中写入csrf-token- local function gen_sign(random, expires, key)
- local sha256 = resty_sha256:new()
- local sign = "{expires:" .. expires .. ",random:" .. random .. ",key:" .. key .. "}"
- sha256:update(sign)
- local digest = sha256:final()
- return str.to_hex(digest)
- end
- local function gen_csrf_token(conf)
- local random = math.random()
- local timestamp = ngx_time()
- local sign = gen_sign(random, timestamp, conf.key)
- local token = {
- random = random,
- expires = timestamp,
- sign = sign,
- }
- local cookie = ngx_encode_base64(core.json.encode(token))
- return cookie
- end
- function _M.header_filter(conf, ctx)
- local csrf_token = gen_csrf_token(conf)
- local cookie = conf.name .. "=" .. csrf_token .. ";path=/;SameSite=Lax;Expires="
- .. ngx_cookie_time(ngx_time() + conf.expires)
- core.response.add_header("Set-Cookie", cookie)
- end
复制代码 一个csrf-token由随机数,过期时间,签名组成,下面介绍一下这3个参数
- random 随机数
- expires 过期时间
- sign = 上面两个参数+key的sha256的散列数
- 末了把这三个数进行base64写到cookie里
post,put,delete这些会改变数据状态的哀求,需要进行csrf的防护,在postman里可以这样测试
- var xsrfCookie = postman.getResponseCookie("apisix-csrf-token");
- if (xsrfCookie) {
- // console.log(encodeURIComponent(xsrfCookie.value))
- // pm.environment.set("xsrf-token", decodeURIComponent(xsrfCookie.value));
- pm.environment.set("xsrf-token",xsrfCookie.value);//base64的值在cookie被url编码,不需要关心
- }
复制代码
- header中添加csrf
- cookie里的csrf也会被传到apisix
- 末了将header和cookie里的值进行比较
假如出现apisix-csrf-token被篡改,会返回401- {"error_msg":"csrf token mismatch"}
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |