前端安全
- CSRF:跨站请求伪造(crooss-site request forgery)
- XSS:跨站脚本攻击(cross-site scripting)
XSS攻击
XSS即跨站脚本攻击,是一种脚本注入攻击,通过在被攻击者的浏览器中执行恶意JavaScript实现。
考虑一下在他人浏览器上可以执行Javscript的危害性:
- JS可以访问cookie
- JS可以通过XMLHttpRequest对象发起ajax请求
- JS可以操作DOM对页面进行窜改
通过以上描述信息,我们可以:
- 盗取cookie
- 为键盘添加监听事件,盗取密码信息
- 伪造表单到被攻击者的浏览器,诱导提交,钓鱼攻击
示例攻击情形
1 | <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日