開(kāi)啟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)站的惡意利用。。。。詳見(jiàn)百度

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

      thinkjs如何配置?

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

      開(kāi)啟 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)用場(chǎng)景:

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

        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)頁(yè)面就能獲取到CSRF的值了 在前臺(tái)login.html頁(yè)面里可以弄個(gè)隱藏域來(lái)放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的簡(jiǎn)單應(yīng)用就完成了。

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

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

      掃描二維碼

      下載編程獅App

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

      編程獅公眾號(hào)