JavaScript(Ajax)和Cookie的同源策略
2012-01-20 20:39
302 查看
一个URL由四部分组成,拿http://blog.csdn.net/yanical来说(http的默认端口是80,https的默认端口是443。如果是默认端口,可以省略,所以这个URL等价于http://blog.csdn.net:80/yanical)
协议:http
主机:blog.csdn.net
端口:80
路径:/yanical
所谓的同源就是要求这个URL的协议,主机,端口三部分都相同。一般我们说的域或者domain也是这里的源的概念。
对于上面的URL,有以下结果:
存在一种异常情况,javascript可以通过设置document.domain来修改主机和端口部分的值,如果这样做,设置后的值就会作为同源策略检查的标准。比如对于http://blog.csdn.net/yanical和http://bbs.csdn.net/可以执行下面的javascript:
我们看到,javascript中只有主机的部分被设置了,没有提到端口的部分。事实上,在执行上面的javascript的时候,端口也被设置了,且被设置成了null值。所以,对于http://blog.csdn.net:81/yanical和http://blog.csdn.net/yanical如果都执行上面的javascript,那么端口都被设为了null,他们也就变成同源了。
同源策略最早被用来阻止一个源的js去获取或者修改另外一个源的文档属性,这里的javascript的源指的是加载javascript的HTML页面的源,而不是javascript自己所在的源。
举个例子,有两个HTML和两个javascript。test.html包含一个iframe引用了frame.html,且他们在不同的源;test.html还引用了两个js,他们其中一个也和test.html的源不同;test.html的javascript还试图去修改frame.html。
test.html:
frame.html:
我们访问http://localhost/test.html,执行结果如下:
![](http://hi.csdn.net/attachment/201201/20/0_1327034151iPOn.gif)
可以看到,尽管test.html和otherdomain.js的源不同,但是因为otherdomain.js是test.html加载进来的,所以他们还是同一个源。但是test.html和frame.html就不是同一个源,浏览器阻止了修改请求。
现在同源策略还被用来判断一个XMLHTTPRequest(AJAX)是否合法,一个页面只能向同一个源的服务器发起AJAX请求。
需要注意的是,Cookie的同源策略和javascript略有不同,就是默认情况下,Cookie忽略了协议和端口,只考虑主机这一部分(端口这一部分听说可以设置,设置后就也会考虑端口,但是java api里我没看到可以设置端口的地方),所以https://blog.csdn.net/yanical和http://blog.csdn.net/yanical的Cookie是共享的。
关键字:Javascript, AJAX,Cookie,同源,同域,同domain
版权所有,转载请注明来源
协议:http
主机:blog.csdn.net
端口:80
路径:/yanical
所谓的同源就是要求这个URL的协议,主机,端口三部分都相同。一般我们说的域或者domain也是这里的源的概念。
对于上面的URL,有以下结果:
其他URL | 是否同源 | 原因 |
---|---|---|
http://blog.csdn.net/xilang/index.html | 是 | |
http://blog.csdn.net/yanical/othersub | 是 | |
https://blog.csdn.net/yanical | 否 | 协议,端口不同 |
http://blog.csdn.net:81/yanical | 否 | 端口不同 |
http://www.csdn.net/ | 否 | 主机不同 |
document.domain = "csdn.net";这样后,这两个页面就是同一个源了。出于安全的考虑,不能设置为其他主domain,比如http://www.csdn.net/不能设置为sina.com
我们看到,javascript中只有主机的部分被设置了,没有提到端口的部分。事实上,在执行上面的javascript的时候,端口也被设置了,且被设置成了null值。所以,对于http://blog.csdn.net:81/yanical和http://blog.csdn.net/yanical如果都执行上面的javascript,那么端口都被设为了null,他们也就变成同源了。
同源策略最早被用来阻止一个源的js去获取或者修改另外一个源的文档属性,这里的javascript的源指的是加载javascript的HTML页面的源,而不是javascript自己所在的源。
举个例子,有两个HTML和两个javascript。test.html包含一个iframe引用了frame.html,且他们在不同的源;test.html还引用了两个js,他们其中一个也和test.html的源不同;test.html的javascript还试图去修改frame.html。
test.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> </head> <body> <iframe id="vFrame" name="vFrame" src="http://127.0.0.1/content/frame.html"></iframe> </body> <script language="javascript" src="http://127.0.0.1/content/otherdomain.js"></script> <script language="javascript" src="http://localhost/content/samedomain.js"></script> <script> document.write('------write from test.html'); alert(document.getElementById('vFrame').contentDocument.body.innerHTML='------overwrite frame from test.html'; </script> </html>
frame.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> </head> <body> <script> document.write('------write from frame.html'); </script> </body> </html>otherdomain.js:
document.write('------write from otherdomain.js');samedomain.js:
document.write('------write from samedomain.js');
我们访问http://localhost/test.html,执行结果如下:
![](http://hi.csdn.net/attachment/201201/20/0_1327034151iPOn.gif)
可以看到,尽管test.html和otherdomain.js的源不同,但是因为otherdomain.js是test.html加载进来的,所以他们还是同一个源。但是test.html和frame.html就不是同一个源,浏览器阻止了修改请求。
现在同源策略还被用来判断一个XMLHTTPRequest(AJAX)是否合法,一个页面只能向同一个源的服务器发起AJAX请求。
需要注意的是,Cookie的同源策略和javascript略有不同,就是默认情况下,Cookie忽略了协议和端口,只考虑主机这一部分(端口这一部分听说可以设置,设置后就也会考虑端口,但是java api里我没看到可以设置端口的地方),所以https://blog.csdn.net/yanical和http://blog.csdn.net/yanical的Cookie是共享的。
关键字:Javascript, AJAX,Cookie,同源,同域,同domain
版权所有,转载请注明来源
相关文章推荐
- javascript 拖动_cookie_ajax等
- javascript 拖动_cookie_ajax等
- 黑马程序员_学习日记73_725ASP.NET(禁用Cookie、ASP.NET中的重要对象、JavaScript实现AJAX、两种Json格式的序列化方法、JQuery中实现ajax的五种方法)
- 如何解决Asp.Net Ajax 1.0跨域名框架情况下javascript“访问拒绝”的问题[翻译]
- 使用JavaScript和AJAX发出异步请求
- javascript-ajax学习
- Dojo入门——《Dojo_.Using.the.Dojo.JavaScript.Library.to.Build.Ajax.Applications》读书笔记
- javascript怎么实现Ajax的异步传输
- AJAX——JavaScript面向对象
- JavaScript之AjAX
- 关于document.cookie的使用javascript
- Javascript操作Cookie[3]
- javascript获取cookie
- JavaScript操作cookie
- c#(SVG)无刷新,动态执行Javascript处理SVG对象:ajax 页面 (三)
- 使用JavaScript和Ajax发出异步请求
- 以Base64字符串形式上传文件——在web浏览器端使用原生Javascript及Ajax读取本地文件并发送请求到服务器
- java基础知识记录--html javascript ajax(摘自张孝祥整理java面试题)
- AJAX(Asynchronous Javascript And Xml)
- Asynchronous JavaScript Technology and XML (AJAX)