【问题标题】:Best ways to protect against CSRF attacks in PHP在 PHP 中防止 CSRF 攻击的最佳方法
【发布时间】:2012-08-20 12:51:15
【问题描述】:

在 PHP 中再次保护CSRF 攻击的最佳方法是什么。

建议使用表单标记,因此基本上生成一个随机值并将其存储在隐藏字段中。然后还将这个随机值存储在用户会话中。

最后在表单动作中,确保会话和表单令牌匹配。

if($_SESSION['token'] !== $_POST['token']) {
   die("bad... spanking...");
}

有没有更好/更简单的方法,因为这需要在我的应用程序中进行大量代码修改(大量表单和操作)。

【问题讨论】:

  • 使用 CSRF 预防令牌是要走的路。

标签: php security csrf


【解决方案1】:

没有。为了防止 CSRF,当您有理由相信用户实际提交了您的表单时,您需要确保只信任自动附加到请求(如 cookie)的凭据。做到这一点的唯一方法是让表单携带服务器用来授权处理的某种秘密。

如果您使用框架或库来编写表单,生成随机数、设置 cookie 或会话属性以及将隐藏输入添加到表单可能会有所帮助,但这三个步骤确实需要进行。

【讨论】:

  • 检查referer怎么样?
  • cgisecurity.com/csrf-faq.html#referer 说不:“首先,可以通过多种方式清除或修改 Referer 标头,例如通过 Web 过滤软件、家长控制软件、隐私软件、代理或 DOM 欺骗。这使得referer 标头本质上不可靠。第二个Referer 标头可以使用XMLHTTP 和使用Flash 进行欺骗,如Amit Klein 和rapid7 所示。虽然这些特定方法已由供应商修补,但并非每个访问您网站的用户都应用了这些修补程序. 即使他们这样做了,第一个问题仍然存在。”
  • 好的,我应该在每次重新加载页面时生成一个新的token 吗?那么每次reload都会生成一个新的token,存储在session中,并设置在隐藏字段中?
  • @Justin,您希望令牌的寿命相当短,但如果用户同时打开您网站上的两个页面,并且这两个页面共享会话,那么您可能会遇到以下情况如果您在每次重新加载时生成一个令牌,用户将被拒绝从一个表单访问。
猜你喜欢
  • 1970-01-01
  • 2018-01-08
  • 2014-11-29
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2015-09-28
  • 1970-01-01
相关资源
最近更新 更多