网站地图    收藏   

主页 > 后端 > 网站安全 >

关于document.domain的一点tips - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] www.2cto.com:来自大风起兮云飞扬的一老文了首先,关于same origin policy,简单描述如下:http://store.company.com/dir2/other.html = Success http://store.company.com/dir/inner/another.html =......

www.2cto.com:来自大风起兮云飞扬的一老文了

首先,关于same origin policy,简单描述如下:
http://store.company.com/dir2/other.html => Success  

http://store.company.com/dir/inner/another.html =>Success  

https://store.company.com/secure.html =>Failure => Different protocol

http://store.company.com:81/dir/etc.htm => Failure => Different port

http://news.company.com/dir/other.html => Failure => Different host

众所周之,在ajax中,post受到same origin policy的限制,是不能跨域的。这个限制是在浏览器内部完成的。

但是对于同一个域下的不同子域,在一些条件下还是可以跨域post的。

测试环境,如下三个域:
############# test
127.0.0.1   tt1.test.com
127.0.0.1   tt2.test.com
127.0.0.1   test.com

然后设定一个html页面: 4.html, 放到 http://tt1.test.com 下,我们将利用它去跨域post

关键代码如下:
4.html

<script type="text/javascript">
 
 alert(document.domain);
 
 alert("begin cross domain ajax action!");
 
 document.domain = "test.com";
 
 alert(document.domain);

......
(xmlhttprequest实现)
......

var xmlhttp = new XmlHttp();
if (xmlhttp.init()) {
 var url = "http://test.com/4.txt";

 alert("ajax get");
 xmlhttp.get(url, null, function(response, responseHeaders) {
  if (responseHeaders != null) {
   alert(responseHeaders);
  }

  if (response != null) {
   alert(response);
  }
 });


        alert("ajax post");
 xmlhttp.post(url, "", null, function(response, responseHeaders) {
  if (responseHeaders != null) {
   alert(responseHeaders);
  }

  if (response != null) {
   alert(response);
  }
 });
 

 
}

那么通过改变 document.domain 的值,可以得到什么结果呢?

在IE 6 , 安全级别为 时,有如下测试结果:
document.domain = "www.2cto.com";
ajax post("http://www.2cto.com /4.txt"); 失败
ajax post("http://www.2cto.com /4.txt"); 失败 
document.domain = "www.2cto.com ";   失败,不允许这样设置
在IE 6 , 安全级别为 时, 有如下测试结果:
document.domain = "www.2cto.com";
ajax post("http://www.2cto.com /4.txt"); 成功
ajax post("http://www.2cto.com /4.txt"); 成功 
document.domain = "www.2cto.com ";  失败,不允许这样设置
在Firefox 中,无论怎么设置,都无法跨子域post



所以,我们得到结论:

在IE 6中, 跨子域post实际上是和IE的安全级别(Internet Explorer Security Zone)有关系的。

当安全级别为低时,才可以通过设置document.domain来跨子域post数据。

而Firefox则严格禁止了跨域post。




更新(2008-08-22):我犯了一个经验主义错误,纠正一下。

当IE安全级别为低时,不需要修改document.domain即可跨子域post。 
所以本文在这里用document.domain来测试不太合适,因为跟他没关系了。
不过IE允许JS修改document.domain确实会带来一些安全隐患。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论