codecamp

开启csrf

什么是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值。

liblog线上部署
邮件配置
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

快速入门

进阶应用

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }