同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也最基本的安全功能。
同源是指host、子域名、端口、协议。
在浏览器中,一些标签(<script>、<img>、<iframe>、<link>等)是可以跨域加载资源的而不受同源策略影响的。
对于浏览器来说,除了dom、cookie、xhr会受到同源策略限制外,浏览器加载的一些第三方插件也有各自的同源策略。比方说,flash它主要通过目标网站提供的crossdomain.xml文件(策略文件)判断是否允许当前“源”的flash跨域访问目标资源。
浏览器通过多进程架构和sandbox的保护,提高安全性。浏览器还会周期性地从服务端获取一份最新的恶意网址黑名单,实现对恶意网址的拦截。
XSS(跨站脚本攻击):通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
反射型XSS:恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。
存储型XSS:恶意代码会被存储在服务器端。
常见的XSS payload(恶意脚本),通过读取浏览器Cookie对象,从而发起“cookie挟持”攻击。
XSS攻击利用的技巧:利用字符编码,绕过长度限制(location.hash本身没有长度限制,但是浏览器的地址栏是有长度限制的,要是地址栏的长度也不够用,还可以再使用加载远程JS的方法,来写更多的代码),使用<base>标签,window.name(很多时候window对象不受同源策略限制)等。
XSS防御:
Cookie的“HttpOnly”标识可以防止“Cookie劫持”。
验证码、修改密码前输入旧密码这样的功能都能有效的防止XSS payload。但这并不能限制住XSS攻击。
输入(输出)检查(客户端和服务端都检查)。
csrf(跨站点请求伪造):
浏览器所持有的cookie分两种,session cookie和Third-party cookie(本地cookie,保存在本地)。在浏览器进程的生命周期内,tab页内session cookie都有效。利用这点,可以跨站点伪造一些请求,带上这个session cookie,以实现某种目的。
csrf能成功伪造一个请求,主要是能预测url的所有参数和参数值。
预防csrf:参数加密(某些url无法被用户收藏了,给数据分析工作带来困扰),新增参数token等。
ClickJacking(点击挟持):
一种视觉上的欺骗手段。通过透明不可见的iframe,诱使用户恰好点击在iframe页面的一些功能性按钮上。
有关安全的http响应头:
X-Frame-Options:deny(拒绝当前页面加载iframe),SAMEORIGIN(frame页面的地址只能为同域名下的页面),ALLOW-FROM(定义可以允许frame加载的页面地址)。
Content-Security-Policy:可以在响应头设置,也可以在meta设置。具体设置查阅MDN。
X-XSS-Protection:当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。
除非显式修改,否则浏览器默认为1:启用XSS过滤。如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全部分)
CORS:跨域资源共享。
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。但如果响应报文包含正确的cors响应头,可以访问跨域资源。
对于“非简单请求”,浏览器先使用options方法发起预检请求,从而获取服务端是否允许该跨域请求。服务端确认后才发起实际的http请求。
参考: