開啟csrf

2018-01-19 19:37 更新

什么是CSRF?

CSRF(Cross-site request forgery跨站請(qǐng)求偽造,也被稱為“One Click Attack”或者Session Riding,通??s寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用。。。。詳見百度

通俗地講:就是防止批量、重復(fù)地模擬表單提交,達(dá)到惡人的目的。所有項(xiàng)目,考慮安全問題,最好所有提交請(qǐng)求都加一下。某公司因?yàn)樽詴r(shí)候的短信驗(yàn)證碼請(qǐng)求時(shí)未加,導(dǎo)致被人利用發(fā)送好幾萬條短信...

thinkjs如何配置?

貼上官方文檔提供的配置代碼:

開啟 CSRF

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

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

CSRF 默認(rèn)的配置如下,可以在配置文件 src/common/config/csrf.js 中修改:
(在 src/common/config下新建csrf.js文件貼上代碼)

export default {
session_name: "__CSRF__", // Token 值存在 session 的名字
form_name: "__CSRF__", // CSRF 字段名字,從該字段獲取值校驗(yàn)
errno: 400, //錯(cuò)誤號(hào)
errmsg: "token error" // 錯(cuò)誤信息
};

如此,thinkjs端的配置完成了,注意兩個(gè)配置項(xiàng):session_name: "CSRF",和form_name: "CSRF"。

應(yīng)用場景:

假如后臺(tái)登錄需要添加csrf: 在controller/login.js的session里獲取csrf值,并assign到前臺(tái)頁面

  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");
            }
       //判斷是否登陸 
  }

這樣前臺(tái)頁面就能獲取到CSRF的值了 在前臺(tái)login.html頁面里可以弄個(gè)隱藏域來放CSRF值


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

然后在前臺(tái)表單提交的時(shí)候,傳輸?shù)臄?shù)據(jù)添加CSRF參數(shù)

$("#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的簡單應(yīng)用就完成了。

進(jìn)階用法,可以考慮在controller/base.js里統(tǒng)一assign系統(tǒng)的CSRF值,這樣所有頁面都有了。CSRF值寫在前臺(tái)的公用頭部的meta標(biāo)簽里,其他頁面,然后表單提交的時(shí)候獲取一下并提交CSRF值。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)