【发布时间】:2023-03-04 05:55:01
【问题描述】:
我正在阅读 Chris Shifflet 所著的“Essential PHP Security”一书。 CSRF中有一章,作者推荐使用token来防止CSRF。书中的代码说要在我们使用的表单中添加一个令牌
<?php
session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();
?>
<form action="buy.php" method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<p>
Item:
<select name="item">
<option name="pen">pen</option>
<option name="pencil">pencil</option>
</select><br />
Quantity: <input type="text" name="quantity" /><br />
<input type="submit" value="Buy" />
</p>
</form>
并且可以使用简单的条件语句检查令牌。
<?php
if (isset($_SESSION['token']) && $_POST['token']== $_SESSION['token'])
{
echo $_POST['token'];
echo "form passed";
}
但上面的代码似乎不起作用。 “表单已通过”消息未显示。上面的代码有什么问题?第一组代码生成令牌,但没有成功消息。
【问题讨论】: