外观
XSS攻击与 CSRF攻击
作者:guo-zi-xin
更新于:9 个月前
字数统计:1.3k 字
阅读时长:4 分钟
XSS攻击
Cross-site Scripting(跨站脚本攻击
)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使其在用户的浏览器上运行,利用这些恶意脚本,攻击者可获取用户的敏感信息 如 Cookie
、SessionID
等,进而危害数据安全
常见注入方法
- 在 HTML 中内嵌的文本中,恶意内容以 Script 标签形成注入
- 在内联的 JavaScript 中, 拼接的数据突破了原本的限制(字符串、变量、方法名等)
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其它属性或者标签
- 在标签的 href、src 等属性中,包含 JavaScript(伪协议)等可执行代码
- 在 style 属性和标签中, 包含类似
background-image:url("javascript...")
的代码 (新版浏览器已经可以防范) - 在 style 属性和标签中,包含类似 expression(...)的CSS表达式代码(新版浏览器已经可以防范)
XSS 攻击分类
根据攻击的来源, XSS攻击可以分为存储行,反射型和DOM型三种
- 存储型: 即攻击被存储到服务到,常见的是在评论区插入攻击脚本,如果脚本被储存到服务端, 那么所有看见对应评论的用户都会受到攻击
- 反射型: 攻击者将脚本混在URL里, 服务端接收到URL将恶意代码当作参数取出并拼接在HTML里返回,浏览器解析此HTML后执行恶意代码
- DOM型: 将攻击脚本写在URL中, 诱导用户点击该URL,如果URL被解析,那么攻击脚本就会被运行
反射型XSS根存储型XSS的区别: 存储型XSS的恶意代码存放在数据库里,反射型XSS的恶意代码存在URL里
DOM型XSS跟前两种XSS攻击的区别: DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,其它两种XSS都属于服务端的安全漏洞
防范方法
- HttpOnly: 在cookie中设置httponly属性之后,js脚本将无法获取到cookie信息
- 输入过滤: 一般是用于对于输入格式的检查, 例如: 邮箱、电话号码、用户名、密码等等,按照规定的格式输入,后端也需要做相同的过滤检查,因为攻击者完全可以绕过正常输入流程,直接利用借口向服务器发送设置
- 转义HTML: 如果拼接 HTML 是必要的,就需要对引号、尖括号,斜杠进行转移,但这还不是很完善。想对HTML模版各处插入点进行充分的转移,就需要采用合适的转义库
javascript
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
- 白名单过滤: 对于现实富文本来说,不能通过上面的办法来转义所有字符,因为这样也会把需要的格式也转义掉。这种情况推荐使用白名单过滤的方法
CSRF攻击
Cross-site request forgery (跨站请求伪造
),也被称为one-click attack 或者 session riding, 通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已经登陆的web应用程序上执行非本意 的操作的攻击方法。例如: 攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击者发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击网站执行 某种操作的目的。
防御方法
- 验证码: 强制用户必须与应用进行交互,才能最终完成请求。此种方式能很好的遏制CSRF,但用户体验较差
- Refer Check: 请求来源限制,此方法成本最低,但是并不能保证100%有效。因为服务器并不是什么时候都能取到 Referer,而且低版本浏览器存在伪造 Referer的风险
- Token: Token验证CSRF防御机制是公认的最适合的方案,若网站同时存在XSS漏洞时候, Token也是空谈
XSS 和 CSRF 的区别
- 通常来讲CSRF是由XSS实现的,CSRF时常也被成为XSRF(CSRF实现的方式还可以是直接通过命令行发起请求等)
- 本质上讲,XSS是代码注入问题,CSRF是HTTP问题,XSS是内容没有过滤导致浏览器将攻击者的输入当代码执行
- CSRF则是因为浏览器在发送HTTP请求时候自动带上 cookie,而一般网站的 session 都保存在 cookie里 (token验证可以避免)
来源
https://juejin.cn/post/6945716641464320008