代码之家  ›  专栏  ›  技术社区  ›  Owen Allen

跨域JSONP通信有哪些风险?

  •  8
  • Owen Allen  · 技术社区  · 14 年前

    在我们的web应用程序中,我们遇到了这样的情况:我们需要从一个我们完全控制的域到另一个我们完全控制的域进行跨域AJAX调用。我一直在寻找最佳解决方案,想到的两个是本地文件代理(使用php::fopen的本地文件)或jquery/JSONP。

    跨域JSONP会打开哪些特定的攻击向量?

    根据我的理解,JSONP的唯一向量就是通过包含 <script> 任何 不受您控制的站点:他们可能会变得恶意,并开始管理用户会话/cookies/数据。如果这是真的,那么问题似乎不是协议(JSONP),而是协议 从中收集数据。

    因为不管是服务器端代理 <脚本>

    我在网上听到的许多向量都依赖于对用户提交的表单和数据的不正确验证。在本例中,JSONP用于提取一些文件,将数据放入表单中,然后提交表单以插入数据库。如果来自该表单的数据是可信的,因为它来自被认为是安全的源(JSONP数据),并且在未经验证的情况下放入,那么同样的,它不是JSONP的错,而是未正确验证的用户输入。用户可以使用Firebug对该表单进行完全相同的修改,但上次我检查时没有人将Firebug称为安全向量。

    最后一个元素是这样一个概念:使用服务器端代理,在将结果传递给客户机之前,可以更好地过滤结果。然而,无论是PHP还是Javascript,我都可以过滤结果来删除onclick或iframe之类的内容。当然,某个客户端可以修改我的javascript函数来删除过滤,但是过滤只会影响他们特定的客户端体验,不会对其他用户进行修改,从而防止永久性的多客户端XSS攻击。

    <脚本> 标记,因为至少在JSONP中,结果会通过一个函数,这意味着它会被过滤掉,而不是像 <脚本> .

    是否存在我遗漏或忽略的风险?如果我正确地理解了这个问题,那么使用JSONP包含来自我们信任的源的我们信任的文件的内容就不会有安全风险。这个评估准确吗?

    解决方案

    1. 如果两端都是可信的,那么JSONP中就没有危险(它基本上只是一个 <脚本> 标签)。

    2. 这两个脚本/JSONP都有相同的安全漏洞,因为它们是自动执行的,而不是简单地作为数据传输。使用服务器端代理意味着跨域返回作为数据传递,并且可以过滤恶意内容。如果跨域是完全可信的,那么JSONP/SCRIPT是安全的,如果怀疑有风险,那么通过一个过滤器代理传递它。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Dave Ward    14 年前

    当您控制请求的两端时,大多数 安全 对JSONP的担忧不是问题。

        2
  •  6
  •   Sripathi Krishnan    14 年前

    两者之间有很大的区别 server-side-proxy <script>/JSONP 数据 自动执行 代码

    XmlHttpRequest 下载 eval() ,以使其执行。即使数据格式是JSON,而另一台服务器已经被破坏,并且您自己的服务器端代理没有捕获到这种破坏,您仍然可以在您的客户机代码中使用一条防线。例如,您可以使用 safe JSON parser

    但是当你使用JSONP或者 <script> 标签,你直接包括别人的 . 因为它的代码(而不是数据),浏览器会自动执行它,而不会给您检查或修改它的机会。

    1. 数据 在服务器上查找恶意内容
    2. 检查能力 数据