1、egg在进行表单提交时,会验证csrf,以防止网站被攻击。
2、在中间件中设置全局csrf变量,并将csrf存在state中,给前端使用
module.exports = options => {
return async function adminauth(ctx, next) {
// 定义全局csrf安全认证变量
ctx.state.csrf = ctx.csrf;
}
}
3、前端表单代码,添加隐藏的input,将csrf提交
<form method="post" action="/admin/addRole">
<input type="hidden" name="_csrf" value="<%= csrf %>" />
<button type="submit" class="btn btn-default">提交</button>
</form>
4、提交表单,在后台接口打印请求参数,即可看到csrf
5、在含有图片上传的表单中,csrf不可以放在隐藏表单域,需要放到action后
6、csrf配置/取消指定api验证(在支付宝与微信支付后,第三方会异步给服务端POST数据,没有csrf字段)
exports.security = {
csrf: {
// 判断是否需要 ignore 的方法,请求上下文 context 作为第一个参数
ignore: ctx => {
if (ctx.request.url == '/alipay/alipayNotify' || ctx.request.url == '/weixinpay/weixinpayNotify') {
return true;
}
return false;
}
}
};