JavaScript中如何防止XSS攻击?

来源:编程学习作者:长沙网站建设头衔:草根站长
导读:本期聚焦于小伙伴创作的《JavaScript中如何防止XSS攻击?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript中如何防止XSS攻击?》有用,将其分享出去将是对创作者最好的鼓励。

XSS攻击全称跨站脚本攻击,指攻击者在网页中注入恶意脚本,当用户访问页面时脚本执行,从而窃取用户cookie、篡改页面内容或执行其他恶意操作。在JavaScript开发中,我们可以通过多种手段有效防范这类攻击。

JavaScript中如何防止XSS攻击?

XSS攻击的常见类型

了解攻击类型是做好防护的前提,常见的XSS攻击分为三类:

  • 反射型XSS:恶意脚本作为请求参数发送到服务器,服务器未处理直接返回到页面执行,通常出现在搜索、跳转等场景。
  • 存储型XSS:恶意脚本被存储到服务器数据库,所有访问对应页面的用户都会触发脚本执行,常见于评论、留言功能。
  • DOM型XSS:完全在客户端发生,攻击者通过修改页面DOM结构注入脚本,不需要和服务器交互。

JavaScript中防范XSS的核心方法

1. 输入过滤

对用户输入的内容进行校验,过滤掉可能包含恶意脚本的字符或标签,避免危险内容进入系统。注意输入过滤不能完全依赖,需要配合输出转义使用。

// 简单的输入过滤函数,过滤掉script标签和危险属性
function filterInput(inputStr) {
  if (typeof inputStr !== 'string') return '';
  // 替换script标签
  let result = inputStr.replace(/<script[^>]*>.*?<\/script>/gi, '');
  // 过滤on开头的事件属性,如onclick、onload等
  result = result.replace(/\s+on\w+\s*=\s*["'][^"']*["']/gi, '');
  return result;
}

// 使用示例
const userInput = '<script>alert("xss")</script><div onclick="steal()">内容</div>';
const safeInput = filterInput(userInput);
console.log(safeInput); // 输出:<div >内容</div>

2. 输出转义

当把数据输出到页面不同位置时,根据上下文进行对应的转义处理,避免被浏览器解析为可执行脚本。

如果是输出到HTML文本内容中,需要转义以下特殊字符:

原字符转义后字符
<&lt;
>&gt;
&&amp;
"&quot;
'&#x27;
// HTML文本转义函数
function escapeHtml(str) {
  if (typeof str !== 'string') return '';
  const map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;'
  };
  return str.replace(/[&<>"']/g, function(match) {
    return map[match];
  });
}

// 使用示例,将转义后的内容插入到DOM中
const unsafeContent = '<img src="x" onerror="alert(1)">';
const safeContent = escapeHtml(unsafeContent);
document.getElementById('content').innerHTML = safeContent; // 页面会显示文本而不是执行脚本

如果是输出到JavaScript上下文中,需要对特殊字符进行转义,避免闭合引号或注入代码:

// JS上下文转义函数
function escapeJs(str) {
  if (typeof str !== 'string') return '';
  return str.replace(/\\/g, '\\\\')
    .replace(/"/g, '\\"')
    .replace(/'/g, "\\'")
    .replace(/\n/g, '\\n')
    .replace(/\r/g, '\\r');
}

// 错误示例:直接拼接用户输入到JS代码中
// const userData = '" + alert(1) + "';
// eval('var name = "' + userData + '";'); // 会执行恶意脚本

// 正确示例:使用转义后的内容
const userData = '<script>alert(1)</script>';
const safeData = escapeJs(userData);
eval('var name = "' + safeData + '";'); // 不会执行恶意脚本

3. 使用内容安全策略CSP

CSP是通过HTTP响应头或meta标签设置的安全策略,限制页面可以加载的资源来源和可执行的脚本规则,从根源上减少XSS攻击的影响。

可以在HTML的<head>中添加meta标签设置基础CSP规则:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:">

这段规则表示:默认资源只能从当前域名加载,脚本只能从当前域名加载,样式可以从当前域名和内联样式加载,图片可以从当前域名和数据URI加载,禁止执行内联脚本和eval等危险操作。

4. 避免使用危险API

尽量减少使用innerHTMLevalsetTimeout接收字符串参数等危险API,这些API很容易导致未转义的内容被执行。如果必须使用,一定要先对内容做转义处理。

优先使用textContent代替innerHTML插入文本内容,textContent会自动将内容作为纯文本处理,不会解析HTML标签:

// 不安全的方式
document.getElementById('box').innerHTML = userInput; // 如果userInput包含恶意脚本会执行

// 安全的方式
document.getElementById('box').textContent = userInput; // 只会显示文本,不会执行脚本

防护注意事项

没有单一的防护手段可以完全杜绝XSS攻击,实际开发中需要结合多种方法:输入时做基础过滤,输出时根据上下文做对应转义,同时配置合理的CSP策略,避免使用危险API。另外需要定期做安全测试,及时修复发现的安全漏洞,才能最大程度保障应用安全。

XSS攻击JavaScript安全输入过滤输出转义CSP策略修改时间:2026-06-05 02:18:05

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。