当前位置:  开发笔记 > 编程语言 > 正文

Laravel如何具体构建和检查CSRF令牌?

如何解决《Laravel如何具体构建和检查CSRF令牌?》经验,为你挑选了1个好方法。

我在我的公共网站上使用Laravel的CSRF保护.但是,由于Laravel使用会话来维护这一点,我担心用户可能会离开他们的计算机并返回他们之前打开的页面,但却发现ajax请求不起作用.ajax请求不起作用,因为会话已超时(并且令牌不再验证?).如果这些用户"登录"了用户,那么我可以简单地将他们重定向回登录页面.由于它们是公共用户,因此用户被迫刷新页面以使其恢复工作(笨拙).

或者我错了吗?是否仍然会通过Laravel对CSRF令牌进行验证(即使会话超时后,页面仍将通过令牌发送......但是Laravel会用它做什么?).最佳解决方案是使令牌部分基于时间戳,以便我们可以将令牌到期限制与会话时间限制区分开来.我可以让我的CSRF令牌持续2天(因此只有那些离开2天的用户才能返回死页).

最后,这让我想到了一个问题:Laravel框架中的具体代码在哪里处理?我正在尝试找到它.另外,我可以轻松地替换掉,或者我留下来创建我自己的版本csrf_token();输出到我的页面然后我需要创建自己的路由过滤器来配合它.



1> Antonio Carl..:

Laravel通过将令牌保存在会话中来为您提供便利,但代码实际上是您的(根据需要进行更改).看看filters.php你应该看到:

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

它告诉我们,如果你有一条路线:

Route::post('myform', ['before' => 'csrf', 'uses' => 'MyController@update']);

并且用户会话到期,它会引发异常,但您可以自己完成工作,将您自己的令牌存储在您认为更好的任何位置,而不是抛出该异常,将您的用户重定向到登录页面:

Route::filter('csrf', function()
{
    if (MySession::token() != MyCSRFToken::get())
    {
        return Redirect::to('login');
    }
});

而且,是的,您可以创建自己的csrf_token(),只需在Laravel之前加载它.如果你看一下Laravel源代码中的helpers.php文件,你会看到它只创建了那个函数,如果它还不存在:

if ( ! function_exists('csrf_token'))
{
    function csrf_token()
    {
       ...
    }
}

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有