site infoHacknerd | Tech Blog
blog cover

🧨 Javascript 过滤特殊字符串

JavaScriptRegex

在 JavaScript 中,防止 XSS(跨站脚本攻击),需要过滤或转义某些特殊字符,以防止用户输入的恶意代码被解析并执行。通常需要处理的字符包括:


1. 需要过滤或转义的特殊字符


2. 防止 XSS 的方法

(1)转义 HTML 特殊字符

可以使用正则表达式替换 HTML 关键字符:

javascriptCopy
function escapeHTML(str) {
    return str.replace(/[<>"'&]/g, match => ({
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#39;',
        '&': '&amp;'
    }[match]));
}

// 示例
const userInput = `<script>alert('XSS')</script>`;
console.log(escapeHTML(userInput));
// 输出:&lt;script&gt;alert('XSS')&lt;/script&gt;


(2)使用 textContent 防止 HTML 解析

如果要在前端显示用户输入的内容,而不解析 HTML,可以使用 textContent:

javascriptCopy
const userInput = "<script>alert('XSS');</script>";
const div = document.createElement("div");
div.textContent = userInput;
document.body.appendChild(div);

这样,<script> 只会被当作普通文本显示,而不会执行。


(3)对 URL 进行过滤

如果用户可以输入 URL(如 href 或 src),需要避免 javascript: 伪协议:

javascriptCopy
function sanitizeURL(url) {
    if (!/^https?:\/\//i.test(url)) {
        return "about:blank"; // 不安全的 URL 直接替换为空白页
    }
    return url;
}

// 示例
const safeURL = sanitizeURL("javascript:alert('XSS')");
console.log(safeURL); // "about:blank"


(4)避免 innerHTML(高危 API)

永远 不要 使用 innerHTML 直接插入用户输入:

javascriptCopy
element.innerHTML = userInput; // ❌ 高风险,可能导致 XSS

改用 textContent 或 createElement。


(5)使用 CSP(内容安全策略)

服务器端可以使用 CSP(Content Security Policy) 让浏览器拒绝执行内联脚本:

plain textCopy
Content-Security-Policy: default-src 'self'; script-src 'self'

这样,即使 XSS 代码被插入,浏览器也不会执行。


3. 其他防御策略

  • 限制输入字符:只允许输入安全的字符,如 a-zA-Z0-9,阻止 <script> 等非法字符。
  • 后端过滤:前后端都要进行 XSS 过滤,不能只依赖前端。
  • 使用 HttpOnly Cookie:防止 JavaScript 读取用户 Cookie,避免被劫持。

  • 4. 总结

    ✅ 需要过滤或转义的字符:

    htmlCopy
    < > " ' & / ( ) { } ; \
    

    ✅ 防御 XSS 方法:

  • 1.转义 HTML 特殊字符 (escapeHTML)
  • 2.使用 textContent 避免 HTML 解析
  • 3.过滤 URL,避免 javascript: 注入
  • 4.避免 innerHTML,使用 textContent 或 createElement
  • 5.服务器端启用 CSP
  • 6.限制用户输入,防止插入 <script> 等
  • 7.后端也要过滤 XSS,不能只靠前端
  • 8.使用 HttpOnly Cookie 防止被 JavaScript 窃取
  • 如果你有具体的场景需要 XSS 防御,欢迎进一步讨论!🚀

    Contents

    • 1. 需要过滤或转义的特殊字符
    • 2. 防止 XSS 的方法
    • (1)转义 HTML 特殊字符
    • (2)使用 textContent 防止 HTML 解析
    • (3)对 URL 进行过滤
    • (4)避免 innerHTML(高危 API)
    • (5)使用 CSP(内容安全策略)
    • 3. 其他防御策略
    • 4. 总结

    2025/03/06 02:38
    字符说明
    <HTML 标签起始符,可能用于 <script> 注入
    >HTML 标签结束符
    "HTML 属性中的引号,可能导致属性值被篡改
    '单引号,可能导致 HTML 属性或 SQL 语句被破坏
    /可能被用于关闭已有的 HTML 标签
    &可能用于 HTML 实体编码,如 &lt;
    (、)可能被用于 JavaScript 执行代码,如 onerror=alert(1)
    {、}可能被用于 JavaScript 对象或模板语法
    ;可能被用于终止语句,导致代码注入
    \可能被用于逃逸字符
    eval、javascript:、onload=可能被用于恶意 JavaScript 执行