我在互联网上找到了这几行代码,其目标是使用一次性令牌来防止CSRF。 由于隐藏的值可以很容易地从源代码中读取,我试图弄清楚是什么让这段代码阻止跨站点请求伪造?任何想法?
**form.php**
<?php
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
?>
<form action="process.php" method="post">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<p>
Symbol: <input type="text" name="symbol" /><br />
Shares: <input type="text" name="shares" /><br />
<input type="submit" value="Buy" />
</p>
</form>
**process.php**
<?php
if ($_POST['token'] == $_SESSION['token'])
{
/* Valid Token */
}
?>
答案 0 :(得分:0)
为每个响应生成令牌,攻击者通常无法访问被攻击页面的内容。
答案 1 :(得分:0)
CSRF的想法是用户无法做他不打算做的动作。
例如,用户可以在wordpress网站上以管理员身份登录,而他的登录有效则会浏览到其他网站,其中包含用于更改用户wordpress网站密码的恶意代码。
由于登录有效(会话存在),请求会通过用户验证,但会失败,因为它缺少该特定操作的令牌(每次查看表单时都会生成该令牌)。
答案 2 :(得分:0)
为每个会话唯一生成令牌并将其存储到全局会话变量中。当攻击者通过iframe或他们使用的任何形式的攻击访问站点时,[希望]生成的令牌将与存储在DB中的令牌(在这种情况下,发布到process.php)不匹配。由于令牌不匹配,攻击者将无法访问process.php中if语句中的内容。