首页 课程 师资 教程 报名

使用jsonp进行跨域请求

  • 2022-09-13 08:34:39
  • 377次 星辉

JSONP 只是指“带填充的 JSON”。它本质上是一个包裹在 URL 中指定的回调函数的 JSON 响应。例如,下面是一个 JSON 响应。

{“用户名”:“sdaityari”,“名称”:“Shaumik Daityari”}

回调函数指定为 processData 的相同响应如下。

processData({ “用户名”: “sdaityari”, “名称”: “Shaumik Daityari”})

JSONP 如何帮助解决同源策略?

由于浏览器不允许对其他域的请求,那么我们如何将外部文件添加到 CDN(内容交付网络)以加快页面加载并仍然让它们工作?隐藏的议程是这些文件存在于<script>标签的 src 属性下。这导致了一个结论,即<script>标签下的任何内容都是由浏览器在当前域的上下文下执行的!

使用相同的想法,我们向<script>标签中的 src 提供一个回调函数,通常作为 GET 变量,我们得到一个用回调函数包装的 JSON 的响应。这实质上意味着回调函数以 JSON 响应作为参数执行。这有助于解决应用程序,就像我们在 AJAX 的情况下所做的那样。

在提供的 JSONP 示例中,我们将执行如下函数

 <script src="http://www.example.com/json_data?callback=processData"></script>

通过这样做, processData 将使用给定的参数执行。

如果它只返回 JSON,为什么这不起作用?

代替在函数中填充的 JSON 响应,如果服务器只返回 JSON,则数据不会被执行,而是引发语法错误。您可以通过将一些 JSON 粘贴到 JavaScript 控制台来模拟响应。

什么时候会出错?

在上面的示例中,通过 JSON 返回的数据不是那么敏感。它只包含用户名和名称。但是,想象一个电子商务网站,它将信用卡详细信息存储为您的个人资料的一部分。让我们假设正在提出以下请求

<script src=" http://api.myecommercesite.com/profile?callback=processData "></script>

网站api.myecommercesite.com将返回以下响应,与请求信息的网站无关。

处理数据({
   “名称”:“Shaumik Daityari”,
   “card_no”:“xxxx xxxx xxxx xxxx”,
   “到期日期”:“xx-xxxx”
 });

攻击者如何使用它来获取您的数据?

在理想情况下,此数据由目标网站接收并相应使用。但是,假设一个恶意站点www.attacker.com获取信息并诱使您将您重定向到他们的服务器。

基本上,您正在浏览www.attacker.com并要求您单击某些内容。然后他们的服务器发送相同的响应,并且由于您已登录电子商务站点,因此会返回包含您信息的数据。(还有其他与 JSONP 无关的安全检查可以防止这种情况发生,但我们假设没有其他安全措施可以防止这种情况发生。)

一旦恶意站点掌握了敏感数据,它就可以处理站点上下文中的数据,因此可以对数据进行任何操作,很可能将其存储在自己的服务器中以备后用。不仅如此,恶意网站还可以获取您的 cookie,其中包含网站用来跟踪您在其网站上的进度的重要信息。

安全使用 JSONP

JSONP 如此受欢迎的原因是易于使用和实现。您所需要的只是一个回调,您就完成了。因此,在使用此技术时需要注意许多安全问题。

清理回调

这是一件可能导致危险后果的小事。事实上,许多讨论 JSONP 方法中的安全性的教程都未能正确理解这一点。在 PHP 中,您通常会执行以下操作。

 回声 $_GET[“回调”] 。“(” .json_encode($my_data) . “);”;

除此之外,JSONP 中的漏洞也已通过称为闪存注入的术语进行识别。

正如Dylan Tack在他的博客中所解释的那样,正确的方法是使用适当的标头来操纵输出,以防回调被用于 XSS 攻击。他使用以下代码

函数 generate_jsonp($data) {
 if (preg_match('/\W/', $_GET['callback'])) {
   // 如果 $_GET['callback'] 包含非单词字符,
   // 这可能是 XSS 攻击。
   header('HTTP/1.1 400 错误请求');
   出口();
 }
 header('内容类型: application/javascript; charset=utf-8');
 print sprintf('%s(%s);', $_GET['callback'], json_encode($data));
}

完全信任不同的域

使用 JSONP 要求您完全信任远程域。这实质上意味着,如果由于某种原因,远程域的功能中断,您的服务也会中断。但是,您是否要依赖第三方服务仍然是您的决定。

此外,由于我们在脚本标签下使用它,因此很难在其中捕获错误,并且浏览器之间的错误处理会发生变化,从而难以管理适当的结构。

用户认证

为了论证的缘故,仅使用 JSONP 将用户登录到远程站点的一种可能方法是将用户名和密码作为 GET 变量发送(因为这是 HTTP 请求可以在脚本标记中获取数据的唯一方法)。这是一种不安全的身份验证方法,因此应该避免。

出于用户身份验证的目的,您最好遵循 OAuth 的一般工作流程 - 重定向到父网站,对用户进行身份验证,并在成功身份验证后生成并共享令牌。

使用 CSRF 令牌进行写操作

如果您使用 JSONP 技术将数据写入服务器(无论是创建还是更新),您必须知道 JSONP 使用 GET,这是不安全的。为了确保一切按计划进行,您可以在每个请求的标头中发出一个令牌。需要为使用上述步骤进行身份验证的每个用户生成一个令牌。

话虽如此,考虑到写入、更新或删除期间的安全性,有更好的选择,您应该遵循它们,而不是使用 JSONP 寻找解决方法,理想情况下,它应该仅用于读取。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交