如何在php中进行跨站点请求伪造攻击
Posted
技术标签:
【中文标题】如何在php中进行跨站点请求伪造攻击【英文标题】:how to cross site request forgery attack in php 【发布时间】:2018-09-09 15:55:21 【问题描述】:我在 ***.com 上阅读了很多关于如何防止任何 CSRF 攻击的帖子。我在这里找到的解决方案似乎不是我想要的方式。 以下是来自以下链接的 ***.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['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.
?>
【问题讨论】:
您引用的解决方案也使用会话。它生成一个令牌,将其保存到会话中,然后 填充隐藏字段。提交时,然后根据会话值验证提交的令牌值。 @patrick 要求仅检查用户会话数据并在我的脚本中实现 session_regenerate _id(),正如我发布的那样。我是否仍然容易受到 CSRF 攻击 但是您问题的整个基础都是基于错误的逻辑。您引用的解决方案并不像您认为的那样不安全。 “攻击者不会通过使用萤火虫打开它来访问它”这无关紧要,因为令牌也保存在会话中。既然已经有很好的方法,为什么要重新创建***? 【参考方案1】:我意识到最好的办法仍然是使用如上所述的 md5() 哈希函数,并在每次重新加载页面时生成一个新令牌。以隐藏形式传递令牌是安全的。谢谢
<?php
session_start();
$token= md5(uniqid());
?>
【讨论】:
以上是关于如何在php中进行跨站点请求伪造攻击的主要内容,如果未能解决你的问题,请参考以下文章