前言
互联网时代,数据安全与个人隐私信息等受到极大的威胁和挑战,本文将以几种常见的攻击以及防御方法展开分析。
1. XSS (跨站脚本攻击)
定义:通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击 可造成的主要影响:
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
原理:恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的
如上图所示,网页URL输入一段包含js脚本的代码,在页面HTML中会获取url传参 keyword,并直接塞入到网页中直接执行,且参数可能会直接传到后台服务器中保存,后面再取到该参数时候又会执行脚本。整个过程中我们可以发现该漏洞产生的原因:1.输入的参数未经过安全过滤;2.恶意脚本被输出到网页;3.用户浏览器执行了恶意脚本。
1.1 反射性XSS攻击
特征:
- 不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成攻击,直接拿到用户隐私数据。
- 攻击者需要诱骗用户点击,用户点击相关链接才能发起
- 用来盗取用户敏感保密信息
1.2 存储型XSS攻击
一般在前端 Form 表单提交等交互功能,如文章留言,评论信息等。黑客利用的 XSS 漏洞,将输入内容提交进入数据库持久保存,当前端页面获得后端从数据库中注入脚本代码时,恰好将其渲染执行。如下图我们在掘金评论区输入恶意脚本(掘金社区做了校验处理,该评论是无法提交的)。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zUn3BKk-1675330815540)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9258adade1294735b614b6c6289bb16e~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?)]
攻击成功需要同时满足以下几个条件:
- POST 请求提交表单后端没做转义直接入库。
- 后端从数据库中取出数据没做转义直接输出给前端。
- 前端拿到后端数据没转义直接渲染成 DOM。
1.3 XSS攻击的防御策略
- 请求头部 Content-Security-Policy 策略:CSP 本质上就是通过建立白名单告诉浏览器哪些外部资源可以加载和执行。例如:只允许加载本站资源(Content-Security-Policy: default-src ‘self’)、只允许加载 HTTPS 协议图片(Content-Security-Policy: img-src https://* )、允许加载任何来源框架(Content-Security-Policy: child-src ‘none’)等等,只要配置了正确的规则,那么即使网站存在漏洞,攻击者也不能执行它的攻击代码,并且 CSP 的兼容性也不错 了解CSP可参考文档。
- 转义字符:用户的输入永远不可信,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠等符号进行转义,如下方法:
function escapeHtml(html) {
html = html.replace(/&/g, '&');
html = html.replace(/</g, '<');
html = html.replace(/>/g, '>');
html = html.replace(/"/g, '&quto;');
html = html.replace(/'/g, ''');
html = html.replace(/`/g, '`');
html = html.replace(/\//g, '/');
return html;
}
但是对于类似富文本,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。所以通常采用白名单过滤的办法,如下所示,示例使用了 js-xss 来实现,可以看到在输出中保留了 h1 标签且过滤了 script 标签
const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
console.log(html) // <h1>XSS Demo</h1><script>alert("xss");</script>
- HttpOnly Cookie:Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。
2. CSRF(跨站请求伪造)
定义:利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。
2.1 CSRF攻击的原理
根据上面的原理图,可以知道完成 CSRF 攻击必须要有三个条件:
- 用户已经登录了站点 A,并在本地记录了 cookie
- 在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。
- 站点 A 没有