我已经在Stackoverflow.com上阅读了很多关于如何防止任何CSRF攻击的帖子。我在这里找到的解决方案似乎不是我想要的方式。 以下是来自以下链接的stackoverflow.com答案,其中有人试图删除记录,同时确保无法进行CSRF攻击。
confirm.php
<?php
session_start();
$token= md5(uniqid());
$_SESSION['delete_customer_token']= $token;
session_write_close();
?>
<html>
<body>
<form method="post" action="confirm_save.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />
</form>
</body>
</html>
然后,当涉及到实际删除记录时:
confirm_save.php
<?php
session_start();
$token = $_SESSION['delete_customer_token'];
unset($_SESSION['delete_customer_token']);
session_write_close();
if ($token && $_POST['token']==$token) {
// delete the record
} else {
// log potential CSRF attack.
}
?>
我不想使用上面的脚本,因为令牌以隐藏的形式传递,攻击者不会通过用firebug打开它来访问它。这是我自己的概念,使用用户登录会话数据 $ _ session [&#39; uid&#39;] 和 session_regenerate_id(); 。使用下面的代码,我仍然容易受到CSRF攻击......
<?php
Assuming user is logged in and session has been initialized..
$session_start();
//Regenerate Session Id to ensure that Session Fixation Attack is not Possible...
session_regenerate_id();
$user_session = $_session['uid'];
if (!$user_session=='') {
// update the record
} else {
// there is CSRF attack.
}
?>
答案 0 :(得分:0)
我意识到最好的选择仍然是使用如上所述的md5()哈希函数,并在每次重新加载页面时生成一个新令牌。以隐藏形式传递令牌仍然是安全的。谢谢
<?php
session_start();
$token= md5(uniqid());
?>