【问题标题】:CSRF protection in PHPPHP 中的 CSRF 保护
【发布时间】:2015-01-13 03:35:54
【问题描述】:

我有一些 PHP POST 脚本需要保护它们免受 CSRF 攻击并且有多个问题:

1) 如果我在没有 HTML 表单的情况下使用 jquery 向 PHP 提交 POST 请求,只是直接从 HTML 元素中获取值并使用 jquery 提交,我是否仍然面临 CSRF 的风险?

2) 当用户登录网站时,我将他们的唯一令牌存储在会话变量中。在 PHP POST 脚本中,我检查该会话变量是否已设置并且与我之前设置的值相同。这还不够吗?为什么令牌也需要包含在 HTML 表单中?

谢谢

【问题讨论】:

    标签: php jquery security csrf


    【解决方案1】:
    1. 是的。不管你如何构造请求,攻击者都可以用同样的方式构造一个。 (理论上,您可以强制执行复杂请求的功能(这将触发 CORS 预检请求),以便另一个站点无法让用户的浏览器复制整个请求,但我不想依赖它) .
    2. 没有

    令牌的目的是检查包含负责决定请求中的内容(即表单或 JavaScript)的代码的页面是否是您网站上的页面。

    如果表单(或 JavaScript)可以从页面的 HTML 中读取令牌(与会话中的令牌匹配)并将其放入请求中,那么您就知道构建请求的代码来自您的站点。

    如果您只是检查它是否在会话中,那么您所检查的只是用户已经生成了一个令牌(这通常意味着访问您网站上的任何页面......可能在一个隐藏的框架中) .

    【讨论】:

    • 好的。如果攻击者有一个 JS 可以将我网站中的实际 HTML FORM 包含到隐藏的 iframe 中,那该怎么办?我在另一个例子中看到过,如果用户在登录时访问攻击者网站,令牌不会包含在表单中吗?在这种情况下,请求将是真实的,因为令牌存在于表单和会话中,还是我遗漏了什么?
    • 没有。如果您将框架放入表单中,则框架加载的页面中的字段将不会包含在表单数据中。您不能通过带有 JavaScript 的框架跨域读取数据(除非该站点与 postMessage 合作,您不会这样做)。
    • 抱歉,表单内的框架是什么意思?我的意思是反过来,在框架内形成
    • 如果表单在框架中,那么承载框架的页面仍然无法访问表单。
    【解决方案2】:
    1. 是的,它仍然不安全

    2. 每次生成表单时,CSRF 令牌都应该是新生成的令牌。对于每个请求,它必须是唯一且不可预测的。从登录设置的会话令牌仅对于整个记录的会话是唯一的。

    如果你不发布生成的令牌来检查,你在哪里检查呢?您将会话令牌与...匹配?原因是,如果令牌不是随请求本身发送的,但所有检查都由会话/cookies 完成,您仍然可以让人们进行请求伪造。如果您只检查会话,它不会对 csrf 执行任何操作。它需要在请求本身中发送并检查它是否与您的会话匹配。当您为每个请求生成一个唯一令牌时,坏人就无法伪造某人的请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2017-03-26
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2020-12-18
      相关资源
      最近更新 更多