开启csrf

由 livisky 创建, 最后一次修改 2017-01-19

什么是CSRF?

CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。。。。详见百度

通俗地讲:就是防止批量、重复地模拟表单提交,达到恶人的目的。所有项目,考虑安全问题,最好所有提交请求都加一下。某公司因为注册时候的短信验证码请求时未加,导致被人利用发送好几万条短信...

thinkjs如何配置?

贴上官方文档提供的配置代码:

开启 CSRF

配置 hook 文件 src/common/config/hook.js,添加如下的配置:

export default {
logic_before: ["prepend", "csrf"]
}

CSRF 默认的配置如下,可以在配置文件 src/common/config/csrf.js 中修改: (在 src/common/config下新建csrf.js文件贴上代码)

export default {
session_name: "__CSRF__", // Token 值存在 session 的名字
form_name: "__CSRF__", // CSRF 字段名字,从该字段获取值校验
errno: 400, //错误号
errmsg: "token error" // 错误信息
};

如此,thinkjs端的配置完成了,注意两个配置项:session_name: "CSRF",和form_name: "CSRF"。

应用场景:

假如后台登录需要添加csrf: 在controller/login.js的session里获取csrf值,并assign到前台页面

  async indexAction(){
      this.assign("title","管理员登陆")
      let csrf=await this.session("__CSRF__");
      this.assign("csrf",csrf);
      //判断是否登陆
            let data=await this.session('userInfo');
            if(think.isEmpty(data)){
                  return  this.display();
                }else{
                  return  this.redirect("/admin/index");
            }
       //判断是否登陆 
  }

这样前台页面就能获取到CSRF的值了 在前台login.html页面里可以弄个隐藏域来放CSRF值


   <div class="form-group">
    用户名
    <input type="text" class="form-control" id="username" placeholder="用户名">
   <input type="hidden" id="csrf" value="%=csrf%">
 </div>

然后在前台表单提交的时候,传输的数据添加CSRF参数

$("#loginBtn").on('click', function () {
    $.ajax(
    {
        url: 'http://localhost:8361/login/dologin',

        data: {
            username: $("#username").val(),
            password: $("#password").val(),
            __CSRF__: $("#csrf").val()
        },
        type: 'POST',
        success: function (json) {

            if (json.errno === 0) {

                alert(json.errmsg);

                window.location.href = "/admin/index";
            } else {
                alert(json.errmsg);
            }
        }
    }
    )
})

如此,CSRF的简单应用就完成了。

进阶用法,可以考虑在controller/base.js里统一assign系统的CSRF值,这样所有页面都有了。CSRF值写在前台的公用头部的meta标签里,其他页面,然后表单提交的时候获取一下并提交CSRF值。

以上内容是否对您有帮助:
python零基础入门到爬虫实战
二维码
建议反馈
二维码