我在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'uid'和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.
}
?>发布于 2019-07-20 06:52:32
我意识到最好的选择仍然是像上面提到的那样使用md5()散列函数,并在每个页面重新加载时生成一个新的令牌。以隐藏的形式传递令牌是静态安全的。谢谢
<?php
session_start();
$token= md5(uniqid());
?>https://stackoverflow.com/questions/49577277
复制相似问题