AJAX请求是否真的不安全?谈一谈Web安全与AJAX的关系

2019-09-14 06:44:32王旭

So,AJAX不安全的说法自然扩散到了各个角落。

常见的几种Web前端安全问题

要知道AJAX请求是否安全,那么就得先知道Web前端中到底有那几种安全问题

1.XSS(跨站脚本攻击)(cross-site scripting)

 -> 伪造会话(基于XSS实现CSRF)
 
 -> 劫持cookie
 
 -> 恶意代码执行

2.CSRF(跨站请求伪造)(cross-site request forgery)

 -> 伪造用户身份操作
 
3. SQL注入

...(其它暂且不提)

如上,Web前端中的安全问题主要就是这几大类(仅列举部分做分析),所以我们首先要分析AJAX与这几大类之间的关系。(XSS和CSRF,在下文也会做简单介绍。)

CSRF简介

CSRF,特征很简单:冒用用户身份,进行恶意操作

时至今日,这项安全漏洞已经被人们剖析的很透彻了,随便Google,百度之,都会找到很多的解释。这里也用一张图来先做简单描述:

(注,下面介绍参考了来源文章中的描述,譬如图就是参考了来源中的博文后重绘的)

所以,我们看到关键条件是:

      1. 采用cookie来进行用户校验

      2. 登录受信任网站A,并在本地生成Cookie

      3. 在不登出A的情况下,访问危险网站B

一般在(4)处恶意网站(B)的攻击手段如下(必须是指向A的地址,否则无法带上cookie):

// 1.譬如在网站内的图片资源中潜入恶意的转账操作
<img src=http://www.bank.example/transfer?toBankId=hello&amount=1000000 width='0' height='0'>
// 2.构建恶意的隐藏表单,并通过脚本提交恶意请求
<iframe style="display: none;" name="csrf-frame"></iframe>
<form method='POST' action='http://www.bank.example/transfer' target="csrf-frame" id="csrf-form">
 <input type='hidden' name='toBankId' value='hello'>
 <input type='hidden' name='amount' value='1000000'>
 <input type='submit' value='submit'>
</form>
<script>document.getElementById("csrf-form").submit()</script>

而且,从头到尾,攻击网站都没有获取到过 cookie,都是通过浏览器间接实现(利用Web的cookie隐式身份验证机制),所以HttpOnly并不会影响这个攻击

最后说下,几种常见的CSRF防御手段:

1. 验证HTTP Referer字段(非常简单,但是鉴于客户端并不可信任,所以并不是很安全)

(防止CSRF,检查Referer字段简单直接,但是其完全依赖浏览器发送正确的Referer字段。

虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。)