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)條短信...
貼上官方文檔提供的配置代碼:
開(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值。
更多建議: