这是设置令牌CSRF的安全方法吗?

use*_*020 11 php security

我想知道这是否是一种设置令牌的安全方式,除非实际存在令牌,我生成一个令牌,并在整个应用程序和那些表单中使用它.每个会话一个令牌?

if (!isset($_SESSION['token'])) {
    $data['token'] = uniqid(rand(), true);
    session_regenerate_id();
    $_SESSION['token'] = $data['token'];
}
Run Code Online (Sandbox Code Playgroud)

是否有必要在提交的表单上清除令牌?或者只是坚持下去,即使我提交了表格?

pal*_*ako 11

如果你不知道这些链接,应该可以帮助你理解一些场景,特别是将告诉你DO和DONT.希望能帮助到你.


Ben*_*aap 10

我个人会为我想要显示的每个表单生成一个新令牌.如果你这样做,只要会话保持活动状态,有人只需要一个会话cookie来读取你的令牌并使用它.

在我的应用程序中,我为每个表单显示生成一个令牌,如下所示

<?php
$token = uniqid(rand(), true);
$_SESSION['csrf_tokens'][$token] = true;
Run Code Online (Sandbox Code Playgroud)

HTML

<form>
    <input type="hidden" name="token" value="<?php echo $token ?>" />
</form>
Run Code Online (Sandbox Code Playgroud)

在表单验证时,我检查这个令牌是这样的:

if (isset($_SESSION['csrf_tokens'][$token]) && $_SESSION['csrf_tokens'][$token] === true) {
    unset($_SESSION['csrf_tokens'][$token]);
    // additional code here
}
Run Code Online (Sandbox Code Playgroud)