【问题标题】:CSRF - Can forged POSTs contain arbitrary data?CSRF - 伪造的 POST 可以包含任意数据吗?
【发布时间】:2012-06-03 01:12:32
【问题描述】:

不受信任的网站可以通过创建表单并将其发布到目标站点来构造伪造的 POST 请求。但是,此 POST 的原始内容将被浏览器编码为以下格式:

param1=value1&param2=value2

不受信任的网站是否有可能构建包含任意原始内容的伪造 POST——例如字符串化的 JSON?

{param1: value1, param2: value2}

换一种说法:网站会导致浏览器向第三方域发布任意内容吗?

【问题讨论】:

    标签: javascript post security csrf


    【解决方案1】:

    HTML 表单请求的 POST 正文始终为 application/x-www-form-urlencodedmultipart/form-datatext/plain,因为它们反映了 enctype attribute 的有效值。特别是text/plain one can be used to form valid JSON data。所以这里可以使用基于表单的 CSRF,但是需要服务器接受它为text/plain

    此外,基于 XHR 的 CSRF 可以用作XMLHttpRequest API allows so send arbitrary POST data。唯一剩下的障碍是同源策略:只有当两者具有相同的来源您的服务器支持 Cross-Origin Request Sharing 并允许资源共享时,才能伪造此类有效的 POST 请求。

    【讨论】:

    【解决方案2】:

    您可以通过常规表单帖子创建有效的 JSON。这只是创造性地命名表单参数的问题。特别是,参数名称可以包含引号。

    http://blog.opensecurityresearch.com/2012/02/json-csrf-with-parameter-padding.html

    【讨论】:

      【解决方案3】:

      网站的客户端代码很难伪造这样的请求,但服务器端代码可以很容易地做到这一点。

      由于您的网站无法判断请求是来自浏览器还是行为类似于浏览器的服务器,因此浏览器的限制是无法保护的。

      【讨论】:

      • CSRF 仅在请求还包含用户身份时才有效——所以我不担心非浏览器客户端伪造请求。
      • “困难”是指不可能吗?这真的是一个问题:这可能吗?
      • @JS_Riddler:程序在任何方面都可以充当浏览器,因此用户身份不是一种保护。甚至有人可以拿任何开源浏览器项目重写它来做任何事情,所以即使任何当前的浏览器都不能发送带有任意内容的帖子,它肯定是可以做到的。
      • 在这种情况下,请求不会被伪造,因为它们将由用户生成。我真正想说的是:HTML 规范中是否禁止浏览器向其他域发送任意 POST 内容。我相信是的,但想确认一下。
      • @JS_Riddler:HTML 规范并没有提到类似的事情。我不知道 HTTP 规范中是否对此有任何规定,但浏览器中的安全限制通常比标准规定的要严格得多。无论如何,您可以轻松设置一个网页,通过代理服务器发布请求,然后将请求发送到您的服务器,因此访问者可以发布可以替换内容的表单。
      【解决方案4】:

      在纯 HTML 表单的情况下,是的,它将始终根据 spec 进行编码。但是有other encoding schemes比如MIME multipart。还有Javascript和XMLHttpRequest的问题。仅在一种情况下特别提到了编码。这强烈暗示在其他情况下没有应用编码。

      【讨论】:

        【解决方案5】:

        是的!POST 请求只不过是发送到 Web 服务器的特定格式的文本。您可以使用 IE 或 Chrome 开发人员工具查看每个请求的外观。

        所以是的,您可以创建一个伪造的 POST 请求并更改您想要的任何内容,但是如果请求格式不正确,大多数 Web 服务器都会拒绝它。

        https://www.rfc-editor.org/rfc/rfc2616

        【讨论】:

        • 抱歉——我指的是创建这些帖子的不受信任的网站,而不是客户。我已经更新了问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 2019-01-21
        • 2023-03-27
        相关资源
        最近更新 更多