对于JavaScript限制跨域访问的原因一直不明白,因为他给我的开发过程中带来不少的麻烦,也实在想不明白JavaScript限制跨域的作用,今天带着这个疑问到开元中国提问了,没想到一个大神的解答让我茅塞顿开啊。
大神的解答
在Firebug控制台中运行
$.ajax('http://www.baidu.com/');
请求会被Firefox阻止并提示:
已阻止交叉源请求:同源策略不允许读取 http://www.baidu.com/ 上的远程资源。可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题。
由于浏览器实现的同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,所以AJAX是不允许跨域的。不过 像<script>,<link>,<img>,<iframe>这些标签是允许跨域的,但你并不能修 改这些资源,比如iframe里的内容。
为什么浏览器要实现同源限制?我们举例说明:
比如一个黑客,他利用iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名和密码登录时,如果没有同源限制,他的页面就可以通过 JavaScript读取到你的表单中输入的内容,这样用户名和密码就轻松到手了.又比如你登录了OSC,同时浏览了恶意网站,如果没有同源限制,该恶意 网站就可以构造AJAX请求频繁在OSC发广告帖.
想必大家已经明白了吧,假如不阻止JavaScript的跨域访问那将发生多么危险的事情啊。
但是有时候我们确实是要跨域访问的,我们要的是正常跨域访问,对于这个问题我们可以用JSONP的格式来实现跨域访问,但是这个访问必须是服务端返回一个回调函数,所以这种访问是基于访问者和被访问者直接的一种约定好的方式访问的,也就不存在上面的安全隐患了。
原问题地址: http://www.oschina.net/question/2321543_229731
答疑人地址(感谢): http://my.oschina.net/eechen
大神的解答
在Firebug控制台中运行
$.ajax('http://www.baidu.com/');
请求会被Firefox阻止并提示:
已阻止交叉源请求:同源策略不允许读取 http://www.baidu.com/ 上的远程资源。可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题。
由于浏览器实现的同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,所以AJAX是不允许跨域的。不过 像<script>,<link>,<img>,<iframe>这些标签是允许跨域的,但你并不能修 改这些资源,比如iframe里的内容。
为什么浏览器要实现同源限制?我们举例说明:
比如一个黑客,他利用iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名和密码登录时,如果没有同源限制,他的页面就可以通过 JavaScript读取到你的表单中输入的内容,这样用户名和密码就轻松到手了.又比如你登录了OSC,同时浏览了恶意网站,如果没有同源限制,该恶意 网站就可以构造AJAX请求频繁在OSC发广告帖.
想必大家已经明白了吧,假如不阻止JavaScript的跨域访问那将发生多么危险的事情啊。
但是有时候我们确实是要跨域访问的,我们要的是正常跨域访问,对于这个问题我们可以用JSONP的格式来实现跨域访问,但是这个访问必须是服务端返回一个回调函数,所以这种访问是基于访问者和被访问者直接的一种约定好的方式访问的,也就不存在上面的安全隐患了。
原问题地址: http://www.oschina.net/question/2321543_229731
答疑人地址(感谢): http://my.oschina.net/eechen