XSS

本文深入解析XSS(跨站脚本攻击)的概念、类型及其防范措施,涵盖反射型、存储型及基于DOM的XSS攻击,并介绍如何通过HttpOnly、输入检查与输出检查等方式有效抵御XSS威胁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XSS,即 Cross Site Script,中译是跨站脚本攻击;其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。

XSS攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种方式。攻击者注入恶意的脚本一般包括JavaScript,有时包含HTML,Flash。有很多种进行XSS攻击的方式。但其中共同点是:将一些隐私数据如cookie,session发送给攻击者,将受害者重定向为攻击者所控制的网站,在受害者的机器进行恶意操作。

XSS攻击分为三类:反射型(非持久型),存储型(持久型),基于DOM

1.反射型:反射型攻击只是简单地把用户输入的数据反射给浏览器,这种攻击方式往往需要诱导用户点击一个链接,或者提交一个表单,进入一个恶意的网站

2.存储型:存储型攻击会把用户输入的数据存储在服务端,当用户浏览网站时,浏览器请求数据时,脚本会通过服务器传回并执行,这种攻击具有很强的稳定性。

比较常见的一个场景是攻击者在社区或论坛上写下一篇包含恶意 JavaScript 代码的文章或评论,文章或评论发表后,所有访问该文章或评论的用户,都会在他们的浏览器中执行这段恶意的 JavaScript 代码。

3.基于DOM:这种XSS攻击是通过恶意脚本修改页面的DOM结构,是纯粹发生在客户端的攻击。数据流向URL->浏览器

XSS 攻击的防范

现在主流的浏览器内置了防范 XSS 的措施,例如 CSP(https://www.cnblogs.com/leaf930814/p/7368429.html)。但对于开发者来说,也应该寻找可靠的解决方案来防止 XSS 攻击。

HttpOnly 防止劫取 Cookie

HttpOnly 最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript 访问带有 HttpOnly 属性的Cookie。

上文有说到,攻击者可以通过注入恶意脚本获取用户的 Cookie 信息。通常 Cookie 中都包含了用户的登录凭证信息,攻击者在获取到 Cookie 之后,则可以发起 Cookie 劫持攻击。所以,严格来说,HttpOnly 并非阻止 XSS 攻击,而是能阻止 XSS 攻击后的 Cookie 劫持攻击。

cookie使用过程:

浏览器先像服务器发起请求,此时浏览器没有cookie

服务器返回set-cookie头并在客户端设置cookie(这一阶段可设置httponly)

浏览器每次发起请求后携带cookie(在cookie过期前)

输入检查

输入检查必须放在服务端,在客户端会有绕过。但是在客户端过滤也是有必要的,可以避免用户的错误操作,减轻服务器压力。

输入的数据有可能在多个地方展示,如果在一个地方对输入进行了统一的过滤,会造成输出结果与预期不符的情况。

 

不要相信用户的任何输入。 对于用户的任何输入要进行检查、过滤和转义。建立可信任的字符和 HTML 标签白名单,对于不在白名单之列的字符或者标签进行过滤或编码。

在 XSS 防御中,输入检查一般是检查用户输入的数据中是否包含 <,> 等特殊字符,如果存在,则对特殊字符进行过滤或编码,这种方式也称为 XSS Filter。

而在一些前端框架中,都会有一份 decodingMap, 用于对用户输入所包含的特殊字符或标签进行编码或过滤,如 <,>,script,防止 XSS 攻击:

输出检查

用户的输入会存在问题,服务端的输出也会存在问题。一般来说,除富文本的输出外,在变量输出到 HTML 页面时,可以使用编码或转义的方式来防御 XSS 攻击。例如利用 sanitize-html 对输出内容进行有规则的过滤之后再输出到页面中。

// vuejs 中的 decodingMap

// 在 vuejs 中,如果输入带 script 标签的内容,会直接过滤掉

const decodingMap = {

  '&lt;': '<',

  '&gt;': '>',

  '&quot;': '"',

  '&amp;': '&',

  '

': '\n'

}

 

输出有可能输出在不同位置上,因此进行分类:

A.在HTML里面输出,类似script,a标签,进行HTMLEncode编码即可。

B.在HTML属性里面输出,<div a=‘’></div>可以构造‘><script>aleert(/xss/)</script> 类似代码进行攻击,

使用HTMLEncode标签即可进行防御

C.在script标签里:在script标签里面可以直接执行JavaScript代码,进行JavaScriptEncode编码即可

D.在事件里面:类似<img src=@ onerror=‘val’>输出事件里面的 val=‘function(){};alert(/xss/)’进行攻击。进行JavaScript编码即可

E.在css样式里面输出:有几种方法可以进行攻击,在style标签里面,@import引入资源、background-url等引入图片资源。HTML标签的style属性,最好应禁止在这几类地方输出,如果必要可以引用owasp esapi的encodeForCSS()函数。

F.在地址中输出:进行URLEncode

### XSS(跨站脚本攻击)的原理 XSS是一种常见的Web安全漏洞,其核心原理是攻击者通过在目标网站注入恶意脚本(通常是JavaScript),当其他用户访问该被注入恶意代码的页面时,这些恶意脚本会在用户的浏览器中执行。这种攻击方式利用了用户对目标网站的信任,使得恶意脚本在用户的浏览器环境中运行,从而达到窃取用户敏感信息、进行页面篡改、执行恶意操作等目的[^1]。 XSS属于客户端攻击,受害者最终是用户,但特别需要注意的是,网站管理人员也属于用户之一。这就意味着XSS可以用于“服务端”攻击,因为管理员通常拥有比普通用户更高的权限,攻击者可以通过管理员的身份作为跳板实施更深层次的攻击XSS攻击的发生主要是由于程序员对参数输入和输出的控制不够严格,导致攻击者能够通过“精心构造”的脚本输入后,在输出到前端时被浏览器当作有效代码解析执行,从而产生危害[^2]。 ### XSS的类型 XSS攻击主要分为三种类型:存储型XSS反射XSS和DOM型XSS。 - **存储型XSS**:攻击者的恶意脚本被永久地存储在目标服务器上,如数据库、消息论坛、访客留言等。当其他用户请求包含这些数据的页面时,恶意脚本会被执行。这种方式的危害最大,因为它影响的是所有访问受影响页面的用户。 - **反射XSS**:攻击者的恶意脚本被嵌入到URL中,通常通过电子邮件或其他方式诱导用户点击。当用户点击这个链接时,恶意脚本作为请求的一部分发送给服务器,然后被返回给用户的浏览器并执行。这种方式依赖于用户点击特定链接。 - **DOM型XSS**:这种类型的XSS不涉及服务器端的响应,而是由于客户端脚本修改了页面的DOM(文档对象模型)而导致的安全漏洞。攻击者的恶意脚本直接在用户的浏览器中执行,而不会与服务器交互[^3]。 ### XSS的防范方法 针对XSS攻击,有多种防范措施可以采取: - **输入验证**:对于所有来自外部的数据,都应该进行严格的验证,确保它们符合预期的格式和类型。例如,如果一个字段只应该包含数字,则应拒绝任何非数字字符的输入。 - **输出编码**:在将数据输出到HTML、JavaScript、CSS或URL上下文之前,应该对其进行适当的编码。这样可以防止数据中的特殊字符被解释为可执行的代码。 - **使用内容安全策略(CSP)**:通过设置HTTP头`Content-Security-Policy`,可以指示浏览器只加载和执行来自指定源的脚本,从而减少XSS攻击的风险。 - **避免内联脚本**:尽量避免在HTML中使用内联脚本,转而使用外部脚本文件。这有助于提高安全性,同时也便于维护。 - **使用安全的开发框架**:许多现代Web开发框架都内置了XSS防护机制,如自动的输出编码功能。合理利用这些工具可以帮助开发者更容易地构建安全的应用程序。 ```python # 示例:Python Flask框架中的转义函数 from flask import escape def safe_output(user_input): # 使用Flask的escape函数对用户输入进行HTML转义 return f"<p>您输入的内容是: {escape(user_input)}</p>" ``` 上述代码展示了如何在Python的Flask框架中使用`escape`函数来对用户输入进行HTML转义,以防止XSS攻击。 ### 相关问题 1. 如何检测Web应用是否存在XSS漏洞? 2. 有哪些工具可以帮助测试和防御XSS攻击? 3. 在实际开发中,如何平衡用户体验与XSS防护? 4. CSP(内容安全策略)是如何具体工作的?它有哪些局限性? 5. 对于已经遭受XSS攻击的网站,应该如何应对和恢复?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值