浏览器的同源策略表现在以下三个方面:
- DOM:限制来自不同源的javascript脚本对当前DOM对象的读写操作
- 数据:限制不同源站点读取当前站点的cookie/indexDB/localStorage等信息
- 网络:限制通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点
同源策略也出让了一些安全性,以提高灵活性:
- 页面中可以引入第三方资源
遭遇XSS攻击,为了解决XSS,浏览器引入CSP(内容安全策略),让服务器决定浏览器可以加载哪些资源,让服务器决定浏览器是否能够执行内联的javascript代码
- 跨域资源共享(CORS)和跨文档消息机制
CORS解决了跨域请求的限制;跨文档消息机制,可以通过window.postMessage的JavaScript接口来和不同源的dom通信
XSS攻击:黑客往页面中注入恶意脚本,然后将页面的一些重要数据上传到恶意服务器。
根据恶意代码注入的方式可以划分一下三种类型XSS:
- 存储型
黑客将恶意代码存储到服务器,用户在浏览含有恶意代码的页面时,恶意脚本执行,盗取用户信息
- 反射型
黑客将恶意代码以请求的参数发送给服务器,服务器将次恶意代码以参数形式返回客户端
- 基于DOM
通过网络劫持修改html页面内容
恶意脚本可以做哪些事情:
- 窃取cookie信息,javascript通过document.cookie
- 监听用户行为:addEventListener
- 修改DOM伪造登录表单
- 在页面中生成浮窗广告,影响用户体验
防范XSS:
服务器对输入脚本进行过滤和转码
充分利用CSP
- 限制加载其他域下的资源文件,这样即使黑客插入了一个 JavaScript 文件,这个 JavaScript 文件也是无法被加载的;
- 禁止向第三方域提交数据,这样用户数据也不会外泄;
- 禁止执行内联脚本和未授权的脚本;
- 还提供了上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击,以便尽快修复问题。
设置cookie为HttpOnly
添加验证码防止脚本冒充用户提交危险