gpt4 book ai didi

php - 这是验证我的 CSRF token 的正确方法吗?

转载 作者:行者123 更新时间:2023-12-05 03:19:58 24 4
gpt4 key购买 nike

我想在我的网站表单中正确实现带有验证的 CSRF token 。

token 的生成方式如下:

$_SESSION["token"] = bin2hex(random_bytes(32));

这是我表单中的隐藏字段,每次提交表单或每次刷新页面时都会更改:

<input type="hidden" name="token" value="<?=$_SESSION["token"]?>">

这是检查表单时看到的示例:

<input type="hidden" name="token" value="3c33c5dc178293f9bcaff264b90836780887efe16c339d01c1cbe34bf9ecbddd">

现在,当提交表单时,这是我为 token 设置的验证:

  if($_SERVER["REQUEST_METHOD"] == "POST")
{
//CSRF TOKEN + VALIDATION
if (!isset($_POST['token']) || ($_POST['token'] !== $_SESSION['token'])) {
exit;
}

我想知道这是否验证了 ($_POST['token'] !== $_SESSION['token'])

因为当我将脚本更改为:

if($_SERVER["REQUEST_METHOD"] == "POST")
{
//CSRF TOKEN + VALIDATION
if (!isset($_POST['token'])) {
exit;
}

没有任何变化,表单完全像以前一样提交。

我原来的 IF 语句是否只检查是否设置了 $_POST

如果是这样,这仍然是防止 CSRF 攻击的安全方法吗?

最佳答案

 if (!isset($_POST['token']) || ($_POST['token'] !== $_SESSION['token'])) {

这会检查:

  • 如果有 token (如果没有则失败)
  • 如果提交中的 token 与 session 中的 token 匹配(如果不匹配则失败)。

 if (!isset($_POST['token'])) {

这会检查:

  • 如果有 token (如果没有则失败)

…但是不关心它是否匹配 session 中的那个。

这意味着第二个版本易受攻击,因为进行 CSRF 攻击的攻击者可能会在他们提交的表单中推送任何旧 token ,只要用户登录,它就会起作用。


第一个版本不容易受到攻击,因为攻击者无法知道访问者在您网站上的 session 中有什么 token ,因此他们无法将其放入他们的表单中。

关于php - 这是验证我的 CSRF token 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73312646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com