【问题标题】:Quick CSRF Token快速 CSRF 令牌
【发布时间】:2015-05-09 13:32:54
【问题描述】:

所以我在上一个帖子中找到了一个关于生成 CSRF 令牌的教程......现在我应该如何实现它?

我尝试让它为每个表单请求生成一个新令牌(但是尝试执行多个表单请求使其无效,因此不在列表中),并且通过读取其他线程为每个用户登录制作一个会话令牌是要走的路.

那么最好的方法是什么?我应该这样做,当用户登录时,它会自动分配一个

   $_SESSION['CSRFToken']

并让它分配一个散列/256 位值?然后将该会话令牌分配给每个表单。我想我只是不明白 CSRF 是如何工作的,以及如何实际做一些事情。基本上听起来我应该让每个用户登录都有一个称为安全令牌的会话,该会话出现在每个表单中。

感谢大家的帮助!

【问题讨论】:

    标签: php csrf


    【解决方案1】:

    你有基本的想法。从本质上讲,CSRF 令牌的目的是确保页面不能包含触发应用程序中某些内容的 iFrame。作为一个基本的例子:

    <iframe src="http://example/delete.php?accept=true"></iframe>

    通常,每个会话生成一个 CSRF 令牌是可以的,但您可能希望为每个请求生成一个唯一令牌并检查它。这样做会增加应用程序的安全性,但不是必需的。

    可以在此处找到快速参考:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29

    更新

    你不会通过 $_REQUEST 本身来做,你会在表单生成页面上创建类似的东西

    $form_session_key = bin2hex(random_bytes(32)); // For more options see http://stackoverflow.com/a/31683058/453273
    !isset($_SESSION['CSRF_CONTENTS']) ? $_SESSION['CSRF_CONTENTS'] = array() : 0;
    $_SESSION['CSRF_CONTENTS'][] = $form_session_key;
    
    //SNIP
    
    <form action="process.php" method="POST">
        <input type="text" style="display: none" id="CSRF" contents="<?php echo $form_session_key; ?>" />
    </form>
    

    在您的处理页面上

    !in_array($_POST['CSRF'], $_SESSION['CSRF_CONTENTS']) ? exit : 0;
    

    如果 CSRF 密钥不在页面加载时生成的 CSRF_CONTENTS 数组中,则上述 sn-p 退出。

    【讨论】:

    • 我将如何使用 $_REQUEST?会不会是一样的,我如何让它根据请求改变会话?
    • 刚刚检查了你的编辑,但你在这一行有一个错误 !isset($_SESSION['CSRF_CONTENTS'] ? $_SESSION['CSRF_CONTENTS'] = array() : 0; 而我没有'不知道是不是因为没有右括号,因为我添加的时候还是说不正确。
    • 固定,大海捞针的差异总是让我着迷
    【解决方案2】:

    第一次登录时将生成一个带有 CSRFToken 的会话,并且这个令牌将分配给每个页面表单,直到注销。 因此,对于一个会话,会生成一个 CSRFToken 来验证表单,当然它是一个哈希值。

    在表单提交期间,如果我们的 cookie 或会话被劫持,则无法提交不可预测的数据,因为每次提交表单时都会检查 CSRFToken。

    【讨论】:

    • 这基本上就是我刚才在这个帖子中所说的,xD。所以这是最好的方法吗?
    猜你喜欢
    • 2016-01-08
    • 2017-08-23
    • 1970-01-01
    • 2014-05-17
    • 2011-09-24
    • 2014-04-29
    • 2016-01-31
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多