我不知道JSONP与AJAX有什么不同

Max*_*Max 10 javascript jsonp

  1. 我没有看到JSONP中的回调函数与AJAX中的成功回调函数有什么不同.

  2. 鉴于#1,我不知道它是如何从根本上更安全.

  3. 那么与AJAX的人工同域约束的唯一区别是什么?

  4. 为什么AJAX不允许跨域请求; 如果这可能导致安全漏洞,攻击不会只是XSS一个JSONP请求吗?

困惑,最大

jfr*_*d00 20

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

JSONP调用是一个有趣的hack,其<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或从其他域加载脚本.例如,网络上使用jQuery关闭Google或Microsoft CDN的每个页面都会中断,因为浏览器不允许从跨域域下载javascript.

JSONP在很大程度上被发明为一种解决方案,可以进行跨源请求.但是,由于JSONP需要显式服务器支持才能工作,因此它不是真正的安全问题,因为只能对明确决定允许该类型的跨源调用的服务器进行JSONP调用.JSONP的使用现在比过去少得多,因为CORS被发明为一种更优雅的控制/允许方式.CORS代表跨源资源共享,它为目标服务器提供了一种方法,可以准确地告诉Web浏览器允许哪种类型的跨源请求,甚至告诉它允许哪些网页域发出此类请求.它比JSONP具有更精细的控制,所有现代浏览器现在都支持CORS.

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

但是,就我们今天的方式而言,只要雅虎不支持使用这些相同网络cookie的JSONP接口,就可以避免未经授权的JSONP请求.

以下是关于跨源ajax危险的一些其他好的文章以及必须要防止它的原因:

为什么跨域Ajax是一个安全问题?

为什么不允许跨域AJAX调用?

为什么跨域AJAX请求被标记为"安全风险"?