TP8.1.2安全配置

17 阅读1分钟

启用全局过滤

在app/Request.php中设置:

<?php
namespace app;

// 应用请求对象类
class Request extends \think\Request
{
    protected $filter = ['htmlspecialchars'];
}

设置后,会自动对所有input助手函数和Request对象的GET和POST请求数据进行过滤。

设置路由

设置路由后,可以隐藏ajax的提交页面,保护后台页面。 设置规则示例:

Route::rule('admin/login2','admin/login_post','POST');

前端提交到login2页面即可,保护后台真实接口地址。

表单令牌

表单令牌可以防止跨域请求。设置步骤如下:

  1. 在表单页面头部添加:
<meta name="csrf-token" content="{:token()}">
  1. 如果使用ajax方式提交,在JS代码中添加:
$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
});
  1. 在路由中添加验证:
Route::rule('admin/login2','admin/login_post','POST')->token();

表单令牌在提交失败后需要获取新的token值

JS完整代码:

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });


    $.ajax({
        type: "post",
        url: "login2.html",
        data: postData,
        dataType: "json",
        success: function (response) {
            if(response=='1'){
                $("#login_submit").text('登录中…');
                message('登录成功!',2);
                setTimeout(function(){
                    window.location.href = 'home.html';
                },1000)
            }else{
                message('账号或者密码错误!',1);
                $.post(
                    'token.html', // 获取新的token
                    function(response) {
                        $('meta[name="csrf-token"]').attr('content',response);
                    }
                );

                return false;
            }
        }
    });

TP8代码:

/*2.4 获得新的token */
    public function get_token()
    {
        // 生成新的表单令牌
        $a = token();
        return $a;
 
    }
    

路由安全代码:

Route::rule('admin/token','admin/get_token','POST');//获取新的token值