XSS和CSRF防范

XSS和CSRF防范

十一月 02, 2020

一. XSS

概念

XSS,即 Cross Site Script,也叫跨站脚本攻击;其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。XSS攻击通过js代码劫持客户端跟服务器之间的会话。

方式
  • 持久型

    恶意代码会随着用户输入通过提交方式保存到服务器数据库,其他用户浏览保存的内容后进行恶意攻击。

    • 存储型

      1. 攻击者通过网页输入(input或者textarea等)将恶意代码(比如js)通过提交的方式保存到服务器数据库中;
      2. 用户浏览内容时将服务端保存的内容下载到浏览器;
      3. 浏览器在解析代码时,恶意代码被执行。

      常见应用场景:论坛发帖、商品评论、用户私信等。

  • 非持久型

    不会保存到数据库。

    • 反射型

      1. 攻击者构造出含有恶意参数的url,诱导用户进行点击;
      2. 服务端没有做特殊检测,返回时将恶意代码带回;
      3. 客户端解析并执行恶意代码。

      常见应用场景:通过 URL 传递参数的场景,如网站搜索、跳转。

    • DOM型

      通过修改DOM结构达到的攻击,是纯粹发生在客户端的攻击。

防范

总结以上3种攻击方式,基本上都是开发者对用户输入内容未做安全性校验,直接造成了注入漏洞。

  • 对于输入型组件进行输入校验,过滤特殊字符,关键字等,并进行转义
  • 对于a链接进行白名单校验,禁止以javascript:开头

二. CSRF

概念

CSRF,即 Cross Site Request Forgery,中译是跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。

流程
  1. 受害者登录a.com(正常网站),在本地保留了cookie信息;
  2. 攻击者引诱用户访问b.com
  3. b.coma.com发送请求(比如a.com?act=xxx),浏览器会默认携带a.com的cookie信息;
  4. 服务端接收到请求后进行cookie校验,合理通过;
  5. a.com以受害者的名字执行了恶意操作。
防范
  • 同源验证

    既然CSRF大多来自第三方网站,那么我们就直接禁止外域(或者不受信任的域名)对我们发起请求。浏览器发起请求是Request Header中会带有OriginReferer这两个字段,标记来源域名(IE11中不存在Orgin,302重定向也没有,Referer可以被前端屏蔽)。

  • 请求头添加其他属性校验

    可以在登录后让后端返回一个例如token之类的字段,保存到session或者localStorage中(不能保存在cookie中),然后在提交的时候手动添加到cookie中(利用的是此类攻击不能获取本地信息)

  • Samesite Cookie

    这是Google发起的一份草案,用来标记是不是同域名cookie,有两个属性值:

    • Strict(Cookie无论什么情况下都不能作为第三方的Cookie)
    • Lax(如果这个请求改变了当前页面或者打开新页面,且携带GET请求,则这个Cookie可作为第三方Cookie)

    缺点是不支持子域名,同时兼容性不好。