gpt4 book ai didi

javascript - 我不明白 JSONP 与 AJAX 有何不同

转载 作者:可可西里 更新时间:2023-11-01 02:31:58 25 4
gpt4 key购买 nike

  • 我看不出 JSONP 中的回调函数与 AJAX 中的成功回调函数有何不同。
  • 鉴于#1,我看不出它从根本上如何更安全。
  • 那么唯一的区别是与 AJAX 的人工同域约束吗?
  • 为什么AJAX不能只允许跨域请求;如果这会导致安全漏洞,那么攻击不会只是对 JSONP 请求进行 XSS 攻击吗?

  • 使困惑,
    最大限度

    最佳答案

    ajax 调用是从客户端直接向服务器发出的实际 HTTP 请求。 Ajax 调用可以是同步的(阻塞直到它们完成)或异步的。由于同源安全保护,除非目标服务器明确允许使用 CORS 的跨源请求,否则只能对网页来自的同一服务器进行 ajax 调用。

    JSONP 调用是使用 <script> 的一个有趣的技巧。允许跨源通信的标签。在 JSONP 调用中,客户端创建一个脚本标记并在其上放置一个带有 callback=xxxx 的 URL。查询参数就可以了。该脚本请求(通过脚本标签插入)由浏览器发送到外部服务器。浏览器只是认为它正在请求一些 javascript 代码。然后,服务器为此调用创建了一些特殊的 javascript,在该 javascript 返回时将由浏览器执行,服务器将函数调用置于 callback=xxxx 中命名的函数中。查询参数。通过将数据传递给该函数来定义变量,服务器可以将数据传送回客户端。对于 JSONP,客户端和服务器必须在 JSONP 调用如何工作以及如何定义数据方面进行合作。客户端无法对不明确支持 JSONP 的服务器进行 JSONP 调用,因为服务器必须构建完全正确类型的 JSONP 响应,否则它将无法工作。

    因此,这两种通信方式的工作方式完全不同。只有 ajax 调用可以是同步的。按性质<script>标签插入,JSONP 调用总是异步的。

    在 Ajax 调用中,响应在 ajax 事件处理程序中返回。

    在 JSONP 调用中,当返回的 Javascript 调用您的函数时会出现响应。

    在某些方面,JSONP 是一个绕过跨域安全机制的安全漏洞。但是,您只能调用明确选择支持类似 JSONP 机制的服务器,因此如果服务器不希望您能够跨域调用它,它可以通过不支持 JSONP 来阻止它。您不能对这些其他服务器进行常规 ajax 调用。

    浏览器制造商无法真正关闭这个漏洞,因为如果他们做了无数网页,就会破坏已经使用 JSONP 或从其他域加载脚本的网页。例如,Web 上使用 Google 或 Microsoft CDN 之外的 jQuery 的每个页面都会中断,因为不允许浏览器从跨域域下载 javascript。

    JSONP 主要是作为一种能够发出跨域请求的变通方法而发明的。但是,由于 JSONP 需要明确的服务器支持才能工作,因此这并不是真正的安全问题,因为 JSONP 调用只能对明确决定允许这种类型的跨源调用的服务器进行。现在 JSONP 的使用比以前少得多,因为 CORS 被发明为一种更优雅的控制/允许方式。 CORS 代表 Cross Origin Resource Sharing它为目标服务器提供了一种方法,可以准确地告诉 Web 浏览器允许哪种类型的跨源请求,甚至可以告诉它哪些网页域可以发出此类请求。它具有比 JSONP 更精细的控制,并且所有现代浏览器现在都支持 CORS。

    下面是一个跨域调用如何导致问题的示例。如果您可以从任何其他网页加载任意网页或进行任意 ajax 调用,那么假设您已经在其他浏览器窗口中登录到 Yahoo 上的网络邮件界面。这意味着您的 cookie 设置为允许来自您的浏览器的请求从 Yahoo 获取数据。如果允许其他网页中的 javascript 向 Yahoo 发出网络邮件请求(这将自动附加您的 cookie),那么它可以获取您的所有网络邮件数据并将其发送回它自己的站点。一个网站可以窃取任何其他网站的所有登录数据。所有的网络安全都会被破坏。

    但是,按照我们今天的方式,只要 Yahoo 不支持使用相同 Web cookie 的 JSONP 接口(interface),它就可以避免未经授权的 JSONP 请求。

    这里有一些关于跨域 ajax 的危险以及为什么必须防止它的其他好文章:

    Why the cross-domain Ajax is a security concern?

    Why Cross-Domain AJAX call is not allowed?

    Why are cross-domain AJAX requests labelled as a "security risk"?

    关于javascript - 我不明白 JSONP 与 AJAX 有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10289789/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com