为什么跨域 JSONP 安全,而跨域 JSON 不安全?

2024-03-14

我在连接最近了解 JSONP 的一些点时遇到了困难。这是我的理解:

  • 由于同源政策,禁止任何内容(包括 JSON)的跨域 XmlHttpRequest。这可以防止 XSRF。
  • 您可以使用带有返回 JSONP 的 src 的脚本标记 - 在对 Javascript 函数的调用中填充一些 JSON(例如“Foo”)
  • 您可以在返回 JSONP 数据时调用的页面上实现“foo”,并且您可以使用函数传递的 JSON 数据执行操作

为什么 JSONP 可以接收跨域数据,而 JSON 则不行?

是否存在这样的假设:JSON 倾向于允许 XSRF 而 JSONP 则不允许?如果是这样,除了 JSONP 是某种事实上的数据格式,永远不会提供支持 XSRF 的数据之外,还有什么原因吗?为什么选择 JSONP 而不是 XML 上的任意根标记?

预先感谢您的回答,请在未能解决这个问题后让我的大脑再次运转。


我理解这个问题是关于为什么浏览器认为 JSONP 安全,而不是关于它是否安全(事实并非如此)。我将逐步解答这个问题。

常规 ol' AJAX

为了执行常规 AJAX 请求,浏览器创建一个XHR对象,将其指向 URL 并提取数据。 XHR 对象仅信任来自同一域的数据。这是一个硬限制。在当前的浏览器中无法绕过它(编辑 - 您现在可以使用 CORS)。

解决方案 - 不要使用 XHR

由于 XHR 受相同的域策略约束,我们不能使用XHR来做跨域AJAX。幸运的是,还有其他方法可以访问远程服务器。例如,我们可以将图像标签附加到页面。我们还可以附加一个脚本标签,并为其指定一个指向远程服务器的 src 属性。例如,我们可以从 CDN 中提取 JQuery 并期望它能够工作。

JSONP 的工作原理。

当我们发出 JSONP 请求时,我们的代码动态地将脚本标签附加到页面。 script 标签有一个 source 属性,该属性指向远程 JSONP API url,就像您从 CDN 插入脚本一样。

服务器返回的JSONP脚本为封装在函数调用中。下载脚本后,该函数将自动执行。

这就是为什么我们必须告诉 JSONP 我们想要包装脚本的回调函数的名称。脚本下载后将调用该函数。

安全问题

这里存在一些相当大的安全问题。您正在下载的脚本可能会控制您的页面并使您的用户面临风险。 JSONP 对于您的用户来说并不安全,它只是没有被 Web 浏览器阻止。JSONP 实际上是我们正在利用的浏览器漏洞。谨慎使用。

如果使用得当,JSONP 是相当棒的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么跨域 JSONP 安全,而跨域 JSON 不安全? 的相关文章

  • AngularJS 中的 401 未经授权的错误处理

    我是 AngularJS 的新手 现在花了 3 天寻找处理 401 状态的方法 我尝试过拦截器 使用 http 使用 resource 但没有任何效果 我的应用程序在同一服务器上调用 JSONP 调用 当错误发生时 它会被错误回调函数捕获
  • jQuery、ajax 和 jsonp 的问题

    我正在使用 jsonp 和 ajax 访问另一台服务器上的 Web 服务 这是 jQuery ajax type GET url wsurl callback dataType jsonp crossDomain true error fu
  • Angular:$http 和 $resource 会忽略自定义标头。为什么?

    我正在尝试访问我无法控制的 REST 服务 第一个问题是该服务不包含 Access Control Allow Origin 标头 如果我理解正确的话 这个问题会立即限制我使用 JSONP 此外 默认情况下 此服务发送 XML 而不是 JS
  • 当 API 不允许 Access-Control-Allow-Origin 时该怎么办

    我对所有这些同源策略的事情感到疯狂 当我尝试向 Google Maps API 发出请求时 没有出现任何问题 var jsonData ajax url http maps googleapis com maps api geocode j
  • SoundCloud API 给出“Uncaught SyntaxError: Unexpected token:”错误

    在控制台中 它给我错误 Uncaught SyntaxError Unexpected token 但如果我在浏览器中直接访问 SoundCloud URL 那么它会给出有效的 JSON 早些时候 这段代码运行良好 今天这个问题开始出现 h
  • jasonp跨域请求“将json包装成回调方法”

    我添加了 回调 使用匿名函数获取请求中的 url 我必须在服务器端代码中添加什么才能使其跨域工作 这里使用getJSON是否正确 这是没有 JSONP 的播放器的示例http www freeenergymedia com shared P
  • 支持 JSONP 的 ASP.NET 通用 HTTP 处理程序 (.ashx)

    有人可以展示一个返回 JSON 并支持跨域调用的 HTTP 处理程序的示例吗 我正在使用 jQuery 的 getJSON 向我的 Web 服务器上的 ashx 文件发送请求 我知道我需要添加 callback 到 getJSON url
  • 如何在 jsonp ajax 调用中使用 type: "POST"

    我正在使用 JQuery ajax jsonp 我有下面jQuery 代码 ajax type GET url Login aspx Send the login info to this page data str dataType js
  • 单点登录、同一服务器上的多个域、Ruby on Rails

    如果我有一台具有多个域的服务器 那么在同一域上实现单点登录解决方案的首选方法是什么 我目前正在使用该设备 在不同的域上放置了几百万个 cookie 但我陷入了困境 除了实现 SSO 之外 我还需要将各种 cookie 迁移到中央域 对于各种
  • 如何检查客户端网络/防火墙上的端口是否打开?

    最后通过 jQuery AJAX 和 JSONP 的 超时 属性解决了这个问题 看我自己的回答 请参阅更新的部分 我也尝试过使用小程序 如果您能提供小程序实现的解决方案 我们将毫不犹豫地接受您的答案 我正在使用基于 Java 的 Web 应
  • 如何在 php 中创建类似 twitter 的 search.json

    我在我的网站上创建了一个 search php 文件 它生成一个 JSON 字符串 帮助我为我的应用程序使用实时 ajax 但现在 我想将它作为 API 向其他人开放 但我发现 get getJSON ajax 不允许使用来自其他服务器 域
  • 简单的 jQuery、PHP 和 JSONP 示例?

    我面临着同源策略问题 通过研究该主题 我发现对于我的特定项目来说 最好的方法是使用 JSONP 来执行跨源请求 我一直在读IBM 的这篇关于 JSONP 的文章 http www ibm com developerworks library
  • jsFiddle 中的 AJAX

    如何模拟 jQuery get http api jquery com jQuery get 在 jsFiddle 中加载来自不同域的数据 This won t work in jsFiddle get http www google co
  • 第三方脚本可以设置第一方 cookie 吗?

    我在网上阅读了很多有关 cookie 的内容 但没有解决这个问题 假设我在 a com 上有一台服务器 而 b com 提供的网页在我的服务器上的该网页中嵌入了一个脚本 该脚本在设置 cookie 方面可以做什么 它可以设置一个cookie
  • 关于客户端安全,CORS 除了破坏同源策略之外还有其他作用吗?

    如果没有 它真的可以提高客户端安全性吗 我正在考虑来自服务器 X 的脚本使用 XHR 从服务器 Y 支持 CORS 获取并运行不受信任的代码的情况 显然评估不受信任的代码是不好的 我根本不使用 CORS 来提高安全性 我使用 CORS 访问
  • jQuery .ajax() 与 jsonp 不调用成功回调函数

    我有一个 facebook iframe 应用程序 它向我的服务器发出跨域请求并请求 JSONP 格式的数据 这是我的客户端代码 jQuery ajax url type post data method set user prizes d
  • Google Storage 的 CORS 策略允许来自我的来源,但不存在“Access-Control-Allow-Origin”标头

    我是 CORS 配置的新手 并试图弄清楚这一点 但根据文档 我的设置看起来是正确的 我希望你能帮我看看我错过了什么 我的代码正在尝试上传 PUT 使用签名 URL 直接将文件保存到 Google 存储 访问 XMLHttpRequest 从
  • Angularjs JSONP 不工作

    我可能在这里遗漏了一些东西 但我无法使这个 JSONP 请求工作 这里是代码 var url http server callback JSON CALLBACK http jsonp url success function data c
  • 如何在 AngularJS 中插入命令或阻止 $http 的 JSONP 自动解析?

    似乎我发现的关于 http 或 angularjs 的几乎每个问题或解释通常都假设您可以修改请求的响应 我不能这样做 而且我得到的响应格式错误 根据 AngularJS 解析器 它的格式错误一致 因此我可以在解析纯文本之前修改它来解决问题
  • 从 Google Places API 获取 JSON 文件

    我正在尝试使用 Places API 最初尝试使用 jQuery 中的 ajax 但我一直在文件的第一个元素上收到意外的标记错误 但我后来意识到你无法从 Places API 获取 JSONP 所以下面是它返回的示例 我一生都无法让它将 i

随机推荐