XSS攻击
XSS:跨站脚本攻击,即CSS(Cross Site Scripting)。
利用网页开发时留下的漏洞(web应用程序对用户的输入过滤不足),巧妙的将恶意的代码注入到网页中,使用户浏览器加载并执行恶意制造的代码,以达到攻击的效果。
恶意的代码通常是JS代码,但实际上也可以是JAVA、VBS、ActiveX、Flash或者是普通的HTML。(浏览器不会判断,只要是符合解析,那么就会执行恶意的代码)。
可能存在XSS的地方:微博、留言板、聊天室等收集用户输入的地方都可能遭受XSS攻击的风险。只要你对用户的输入没有严格过滤。
XSS分类
1.反射性XSS :非持久型的XSS
最容易出现的一种XSS漏洞。
当用户在请求某一个URL的时候,会携带某一部分数据。当客户端访问某一链接时,攻击者就可以将恶意的代码植入到URL中,如果服务器端没有对URL的参数做判断或过滤,直接就返回相应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而触发反射型XSS。
也就是:用户访问服务器-跨站链接-返回跨站代码
对应的数据流向是:浏览器---后端---浏览器
2.存储型XSS :持久型XSS
危害最大的XSS。
跨站代码存储在服务器(数据库)。
这种类型的XSS可以将恶意的攻击代码持久化的保存在服务器上,然后被显示到HTML页面中。
此类型的XSS漏洞经常出现在用户评论的页面,将攻击者精心构造的恶意代码保存在数据库中。
如果其他的用户访问到该页面时就会触发恶意的XSS代码执行,从而窃取用户的信息。
数据流向:浏览器---后端---数据库---后端---浏览器
3.DOM型XSS
DOM型XSS漏洞和反射型XSS、存储型XSS的原理有本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠的是浏览器端的DOM解析。
客户端的JS脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获得数据并执行。
在整个攻击过程中,服务器响应的页面并没有发生变化,引起客户端脚本执行结果差异的原因是对本地DOM的恶意篡改利用。
在客户端直接输出DOM内容的时候非常容易触发DOM型XSS漏洞,如doccment.getElementByld("x").innerHTML、doccument.write等。
XSS防御
1.基于特征的防御
传统的XSS防御在进行攻击鉴别时多采用特征匹配方式,主要是针对“javascript”这个关键字进行检索,
缺点:这种鉴别不够灵活,凡是提交的信息中各有“javascript”时,就被硬性的被判定为XSS攻击。
2.基于代码修改的防御
Web页面开发者在编写程序时往往会出现一些失误和漏洞,XSS攻击正是利用了失误和漏洞,因此一种比较理想的方法就是通过优化Web应用开发来减少漏洞,避免被攻击:
1)用户向服务器上提交的信息要对URL和附带的的HTTP头、POST数据等进行查询,对不是规定格式、长度的内容进行过滤。
2)实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
3)确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。
缺点:以上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点
3.客户端分层防御策略
客户端跨站脚本攻击的分层防御策略是基于独立分配线程和分层防御策略的安全模型。
它建立在客户端(浏览器),这是它与其他模型最大的区别,之所以客户端安全性如此重要,客户端在接受服务器信息,选择性的执行相关内容。这样就可以使防御XSS攻击变得容易,该模型主要由三大部分组成:
1)对每一个网页分配独立线程且分析资源消耗的“网页线程分析模块”;
2)包含分层防御策略四个规则的用户输入分析模块;
3)保存互联网上有关XSS恶意网站信息的XSS信息数据库
针对不同类型XSS攻击的防御
对于存储型和反射型:
- 修改为纯前端渲染,把代码和数据分开。浏览器先加载静态的HTML,此HTML中不包含任何跟业务相关的数据。然后浏览器执行HTML中的JavaScript。JavaScript通过Ajax加载业务数据,调用DOM API更新到页面上。
但是纯前端的渲染还要避免DOM型XSS漏洞,如:onload和Javascript:xxx事件。 - 对HTML做充分的转义操作。非必要不使用HTML拼接,如果拼接HTML是必要的,就要采用市面上安全合适的转义库,对HTML模板进行充分的转义。常用的模板引擎有:doT.js、ejs、FreeMarker等。
对于DOM型XSS攻击
在使用innerHTML、outerHTML、document.write()时不要把不可信的数据插入到HTML页面中,应尽量使用.textContent .setAttribute()等。
如果使用到Vue技术栈,不使用v-html功能,就可以在前端render阶段(渲染阶段)避免innerHTML、outerHTML的XSS隐患。
尽量避免使用DOM中的内联事件监听器,如:location、onclick、onerror、onload、onmouseover以及a标签的href属性,javascript的eval()、setTimeout()、setInterval()等,都能将恶意的字符串作为代码运行。如果项目中有用到这些的话,一定要避免在字符中拼接不可信的数据。
其他方法:
输入内容长度控制,虽然无法完全避免xss,但是可以增加攻击难度。
HTTP-only Cookie: 禁止javascript读取某些敏感的cookie,就算攻击者完成攻击也无法读取cookie。
加入验证码机制:防止脚本冒充用户提交危险操作。
执行严格的CSP(Content Security Policy)策略。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix