我在所有表单上都使用了反 CSRF 令牌来防止 CSRF 攻击。此外,令牌被保存在 $_COOKIE 变量中,以验证我从表单中获得的值。每次加载表单时我都会重置令牌。
但是有一些表单使用 $.post,即 AJAX 提交并获得 JSON 响应。
由于使用了 AJAX,因此未设置 $_COOKIE 变量。
有解决方法还是我做错了什么?
编辑:添加客户端和服务器端代码示例
客户端:
<?php
$tokenVal = md5(uniqid(mt_rand(), true));
setcookie ("token", $tokenVal);
?>
<form action="target.php" method="post" name="abc">
<input type="text" name="city" id="city" value="abc" size="25" maxlength="10">
<input type="hidden" name="csrf" value="<?php echo $tokenVal; ?>">
<a class="cssButton buttonColor right" id="billToSubmit">Save</a>
</form>
服务器端:
if($_POST['csrf'] == $_COOKIE['token']) {
//process further
} else {
die("Invalid form source")
}
表单正在使用 $.post 提交。我面临的问题是 $_POST['csrf'] 永远不等于 $_COOKIE['token']!