XSS(跨站脚本攻击 cross-site scripting)
XSS的攻击方式就是想办法“教唆”用户的浏览器去执行一些这个网页中原本不存在的前端代码。
攻:获取当前域名下Cookie信息
防:Cookie增加Http-Only属性,只能用在网络请求中
CSRF(跨站请求伪造 cross-site request forgery)
浏览器目前都有同源策略
所谓浏览器同源策略,即:不允许浏览器访问跨域的Cookie,ajax请求跨域接口等。
也就是说,凡是访问与自己不在相同域的数据或接口时,浏览器都是不允许的。
另外,除了DOM,Cookie,XMLHttpRequest(AJAX本质上就是XMLHttpRequest)会受到同源策略的限制外,存储在浏览器中的数据,如LocalStorage和IndexedDB,以源进行分割。每个源都拥有自己单独的存储空间,一个源中的Javascript脚本不能对属于其它源的数据进行读写操作。
最常见的例子:对于前后端完全分离的Web项目,前端页面通过rest接口访问数据时,会出现如下问题:
- 不允许发送POST请求:在发送POST请求之前会发送OPTIONS请求,HTTP响应状态码为403(Forbidden)。
- 允许发送GET请求:HTTP响应状态码为200,但是不能读取服务器返回的数据。
那么如何做到CSRF呢?
<script>,<img>,<iframe>,<link>
等标签都可以跨域加载资源,而不受同源策略的限制。
这些带src
属性的标签每次加载时,实际上是由浏览器发起了一次GET请求。CORS(Cross-Origin Resource Sharing),
Response Header
中加入Access-Control-Allow-Origin
如何防护
- 阻止不明外域的访问,进行同源检测,检测
Request Header
中的Referer
或者Origin
- 利用CSRF攻击只能使用Cookie而不能得到Cookie中内容的特点,在请求的参数中添加token。例如把Token中的一部分放到请求中,后端只需要进行对比,减少性能消耗。缺点是每一个请求包括能绕开跨域限制的请求需要都携带这个Token,增加前端服务工作量。