本文主要介绍了 XSS 和 CSRF 的攻击原理和防御措施及两者区别。接下来我们来了解下。
XSS
一、XSS原理
Xss(cross-site scripting)攻击:通过向某网站写入js脚本或插入恶意 html标签来实现攻击。
比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取cookie中的用户私密信息;
或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。
二、XSS攻击的类型
分为存储性(持久型)、反射型(非持久型)、基于DOM
1、存储性(持久型)
用户输入的带有恶意脚本的数据存储在服务器端。当浏览器请求数据时,服务器返回脚本并执行。
常见的场景:
攻击者在社区或论坛上写下一篇包含恶意 Js代码的文章或评论,文章或评论发表后,所有访问该文章或评论的用户,都会在他们的浏览器中执行这段恶意的 JavaScript 代码。
2、反射型(非持久型)
把用户输入的数据"反射"给浏览器。通常是,用户点击链接或提交表单时,攻击者向用户访问的网站注入恶意脚本。
常见的场景:
在正常页面上添加一个恶意链接。恶意链接的地址指向localhost:8080。然后攻击者有一个node服务来处理对localhost:8080的请求:
当用户点击恶意链接时,页面跳转到攻击者预先准备的localhost:8080页面,执行了 恶意的js 脚本,产生攻击。
3、基于DOM
基于DOM的XSS是指通过恶意脚本修改页面的DOM结构。是纯粹发生在 客户端的攻击。
三、XSS防范方法
1) 内容安全策略 (CSP) -(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP)
它是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。
其实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。
两种方法可以启用 CSP:
- 设置 HTTP 的
Content-Security-Policy
头部字段 - 设置网页的<meta>标签。
服务器端Set-Cookie字段设置HttpOnly参数,这样可以避免。(想了解Set-Cookie, 可参考https://www.cnblogs.com/renzm0318/p/11643841.html)
这时候,客户端的Document.cookie API无法访问带有 HttpOnly 标记的Cookie, 但可以设置cookie。
注:发起XSS的攻击者既然可以通过注入恶意脚本获取用户的 Cookie 信息。
所以,严格来说,HttpOnly 并非阻止 XSS 攻击,而是能阻止 XSS 攻击后的 Cookie 劫持攻击。
CSRF
一、CSRF原理
CSRF(Cross Site Request Forgery),跨站请求伪造。
CSRF 攻击是攻击者借助用户的 Cookie 骗取服务器的信任,以用户名义伪造请求发送给服务器。如:在请求的url后加入一些恶意的参数
换句话说,CSRF就是利用用户的登录态发起恶意请求。
场景:
假设某银行网站A以GET请求来发起转账操作,转账的地址为www.xxx.com/transfer.do?accountNum=l000l&money=10000
,参数accountNum表示转账的账户,参数money表示转账金额。
而某大型论坛B上,一个恶意用户上传了一张图片,而图片的地址栏中填的并不是图片的地址,而是前而所说的砖账地址:<img src="http://www.xxx.com/transfer.do?accountNum=l000l&money=10000">
当你登录网站A后,没有及时登出,这时你访问了论坛B,不幸的事情发生了,你会发现你的账号里面少了10000块...
上述只是举例呦,转账怎么可能是get请求,为了保险,肯定是post请求,更何况银行的交易付款会有登录密码和支付密码等一系列屏障,流程复杂得多,安全系数也高得多
二、CSRF防范
1、添加 token 验证
在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,若请求无 token 或者 token 不正确,则认为可能是 CSRF 攻击而拒绝该请求。
2、Referer Check
在HTTP头中有一个字段叫做Referer,它记录了该HTTP请求的来源地址。通过Referer Check,可以检查是否来自合法的"源".
例如:
从www.user.com发起的删帖请求,那么Referer值是http://www.user.com, 删帖请求应该被允许;
而如果是从CSRF攻击者构造的页面www.attack.com发起删帖请求, 那么Referer值是http://www.attack.com, 删帖请求应该被阻止。
3、验证码
验证码会强制用户必须与应用进行交互,才能完成最终请求,但是也不能给网站所有的操作都加上验证码,所以只能作为防御 CSRF 的一种辅助手段,而不能作为最终的解决方案
XSS和CSRF区别:
- XSS是利用用户对指定网站的信任
- CSRF是利用网站对用户的信任