异步请求

异步请求包含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.jsJS文件),加在POST参数中即可。

var _csrf = getCookie('csrf_cookie_name');

Last updated