如何在php中跨站点请求伪造攻击

时间:2018-03-30 15:41:44

标签: php

我已经在Stackoverflow.com上阅读了很多关于如何防止任何CSRF攻击的帖子。我在这里找到的解决方案似乎不是我想要的方式。 以下是来自以下链接的stackoverflow.com答案,其中有人试图删除记录,同时确保无法进行CSRF攻击。

preventing csrf in php

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.
 }

?>

1 个答案:

答案 0 :(得分:0)

我意识到最好的选择仍然是使用如上所述的md5()哈希函数,并在每次重新加载页面时生成一个新令牌。以隐藏形式传递令牌仍然是安全的。谢谢

<?php
 session_start();
 $token= md5(uniqid());
?>