gpt4 book ai didi

php - 每个请求是否有新的 CSRF token ?

转载 作者:IT王子 更新时间:2023-10-29 01:04:10 24 4
gpt4 key购买 nike

所以我在四处阅读,对拥有一个 CSRF token 感到非常困惑,我应该为每个请求生成一个新 token ,还是每小时生成一个新 token ?

$data['token'] = md5(uniqid(rand(), true));
$_SESSION['token'] = $data['token'];

但是假设最好每小时生成一个 token ,那么我需要两个 session : token ,到期,

我将如何处理表格?只需将 echo $_SESSION['token'] 放在隐藏值表单上,然后在提交时进行比较?

最佳答案

如果您根据表单请求执行此操作 - 那么您基本上消除了发生 CSRF 攻击的能力并且您可以解决另一个常见问题:多个表单提交

简单来说 - 如果用户在提交前要求表单,您的应用程序将只接受表单输入。

正常情况:用户 A 访问您的网站并请求表格 A,并获得表格 A 和表格 A 的唯一代码。当用户提交表格 A 时,他/她必须包括仅用于表格 A 的唯一代码。

CSRF 攻击场景: 用户 A 访问您的网站并请求表单 A。同时他们访问另一个“不良”网站,该网站试图对他们进行 CSRF 攻击,让他们提交一个伪造的 B 表。

但您的网站知道用户 A 从未请求过表单 B - 因此即使他们拥有表单 A 的唯一代码,表单 B 也会被拒绝,因为他们没有表单 B 唯一代码,只有表单 A 代码.您的用户很安全,您可以安心休眠。

但是,如果您将其作为通用 token 来执行,持续一个小时(如您在上面发布的那样)——那么上述攻击可能会奏效,在这种情况下,您的 CSRF 保护并没有取得多大成就。这是因为应用程序不知道表格 B 从来没有被要求放在首位。它是一个通用 token 。 CSRF 预防的重点是使每个表单 token 对于该表单都是唯一的

编辑:因为您要求提供更多信息:1 - 您不必按表单请求执行此操作,您可以按小时/ session 等执行此操作。要点是提供给用户的 secret 值,并在返回时重新提交。其他网站不知道该值,因此无法提交虚假表格。

因此您要么为每个请求生成 token ,要么为每个 session 生成 token :

// Before rendering the page:
$data['my_token'] = md5(uniqid(rand(), true));
$_SESSION['my_token'] = $data['my_token'];

// During page rendering:
<input type="hidden" name="my_token" id="my_token" value="<? php echo $_SESSION['my_token']?>" />

// After they click submit, when checking form:
if ($_POST['my_token'] === $_SESSION['my_token'])
{
// was ok
}
else
{
// was bad!!!
}

并且因为它是“按表单”- 您不会收到双重表单提交 - 因为您可以在第一次表单提交后删除 token !

关于php - 每个请求是否有新的 CSRF token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466241/

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