异步请求
异步请求包含POST,ajax等多种请求方式,系统会自动进行异步验证(csrf)
及处理,框架提供了一整套csrf验证
机制,默认开启
,可通过在config/config.php
中将'csrf_token_on' => false
关闭。
'request' => [
'csrf_token_on' => false, // 是否开启令牌验证
'csrf_token_name' => 'csrf_token_name', // 令牌验证的表单隐藏字段名称
'csrf_token_reset' => true, // 令牌验证出错后是否重置令牌 默认为true
'csrf_cookie_name' => 'csrf_cookie_name', // 令牌存放的cookie名称
'csrf_expire' => 86400, // 令牌过期时间,一天
'csrf_white_ips' => [ // csrf IP白名单
'127.0.0.1/24'
],
'csrf_exclude_uris' => [ // csrf URL白名单
],
]
当csrf验证开启时,前端ajax请求需要预先加载引用static/frame/js/main.js
文件,ajax提交时,系统会在请求头自动加上验证字段。
//ajax.js
jQuery(document).ajaxSend(function(event, xhr, settings) {
function getCookie(name) {
var reg = new RegExp("(^| )" + name + "(?:=([^;]*))?(;|$)"),
val = document.cookie.match(reg);
return val ? (val[2] ? unescape(val[2]) : "") : null;
}
if (typeof xhr.setRequestHeader == "function") {
if (getCookie('csrf_cookie_name')) {
xhr.setRequestHeader('X-CSRF-TOKEN', getCookie('csrf_cookie_name'));
}
}
});
POST请求同样也会触发csrf验证,需要在form中添加如下数据字段:
<!-- 加在form中提交 -->
<input type="text" name="_csrf" hidden value="<{form_token type="token"}>"/>
<!-- 或直接传form参数通过smarty生成一个完整的input -->
<{form_token type="form"}>
同样也可以在js中获取(前提是引用static/frame/js/main.js
JS文件),加在POST参数中即可。
var _csrf = getCookie('csrf_cookie_name');
Last updated
Was this helpful?