php - 是否有可能在 PHP 中使用 file_get_contents 破坏 CSRF token 验证

标签 php security csrf file-get-contents

在每个 session 的表单上使用 token 的 CSRF 预防方法是一种流行的方法。但是,如果 PHP 的 file_get_contents 可以获取跨域文件表单的内容,我不明白这种 token 方式如何保护 --> 它可以获取表单上的 token 并使用它。

那么这种 token 方式是如何工作的呢?

最佳答案

如果我很好地理解你的问题,你正在想象这样一个可能的漏洞利用:

  1. 攻击者创建一个 PHP 页面,该页面将向目标用户呈现虚假表单
  2. 攻击者的 PHP 脚本将执行 file_get_contents 从他试图利用的目标站点下载表单 (HTML),并从下载的 HTML 中删除 CSRF token ,并添加此 CSRF呈现给用户的虚假表单中的 token 。

  3. 毫无戒心的用户将提交表单,并且将在此用户 session 的上下文中在目标站点中执行意外请求。

  4. 目标站点的 CSRF 检查将通过 OK,因为我们的请求中有一个有效的 CSRF token

但是等等..我们有有效的 token 吗?我们真的吗! 如果目标站点以正确的方式实现 CSRF 检查,则不会。

session 是这里的关键。当您执行 file_get_contents 从目标站点下载表单时,请求在其自己的 session 上下文中执行,file_get_contents 进程是那里的客户端,CSRF token 为该请求生成的将(必须)仅在该特定 session 的上下文中有效。 稍后,当目标用户提交您的伪造表单时,该请求在该用户 session 的上下文中执行,该 session 不同于 file_get_contents session ,因此如果 CSRF 检查,CSRK token 将被拒绝由目标网站以适当的方式实现。

这里有一篇来自 OWASP 的好文章,可以了解更多关于推荐的 Synchronizer Token Pattern for prevention of CSRF

关于php - 是否有可能在 PHP 中使用 file_get_contents 破坏 CSRF token 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29787950/

相关文章:

php - PHP和MySQL-警告:mysqli_num_rows()期望参数1为mysqli_result,给定 bool 值

php - CodeIgniter 中的 MySQL 更新查询使用 where in

php 定时任务中断

php - zend 和安全

asp.net - 如何使用 Windows 集成身份验证强制显示登录窗口

python - CSRF token 只是在 django 中随机触发

javascript - 单击按钮添加和删除具有唯一 ID 的 div

c# - C# Windows 服务的安全性

javascript - 尝试使用 CSRF/XSRF 测试我们的网站 - 我可以使用 iframe 进行 POST 吗?

php - 为什么我们在操作前禁用 Yii2 中的 enableCsrfValidation?