对于存储令牌,哪个更好--SESSION或Cookie,用于CSRF预防?

时间:2012-01-25 11:55:31

标签: php mysql

我正在处理我的网络应用程序的安全问题。我必须处理CSRF。通过许多引用,但其中一些使用 Cookie ,而其他使用 SESSION

1 个答案:

答案 0 :(得分:1)

对于CSRF预防,您需要在服务器的客户端上存储共享令牌,因此当客户端发出请求时,可以将其提交的值与您的已知值进行比较。

对于客户端,您可以使用 cookie 或隐藏的表单字段(我个人更喜欢隐藏字段 - 所以我不会为每个人堆积cookie客户端浏览器中的表单。)

服务器上,您可以使用会话(无论如何会话ID存储在cookie中)或将其存储在数据库中(尽管您可能需要)使用会话来识别属于客户端的记录。

以下是一些非常基本的CSRF预防代码示例。

session_start();

if (isset($_POST) && isset($_POST['csrf'])) {
    var_dump($_POST, $_SESSION);
    if ($_POST['csrf'] == $_SESSION['CSRF_FORM1']) {
        print 'You win cookies!';
    }
    else {
        print 'You win a bucket of vomit!';
    }
}

$_SESSION['CSRF_FORM1'] = md5(microtime());

?>
<form action="" method="post">
    <input type="hidden" name="csrf" value="<?php print $_SESSION['CSRF_FORM1']; ?>" />
    <input type="submit" value="Good form Jack!" />
</form>

<form action="" method="post">
    <input type="hidden" name="csrf" value="badValue" />
    <input type="submit" value="Bad form Jack!" />
</form>