快速 CSRF 令牌

Quick CSRF Token

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

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

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

   $_SESSION['CSRFToken']

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

感谢大家的帮助!

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

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

你已经掌握了基本思路。本质上,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 
!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 数组中,上述代码段将退出。