前端渲染用户输入时如何防止 XSS 攻击?

东方雨橙 阅读 4

我在做一个评论功能,用户提交的内容直接用 innerHTML 插到页面上,结果发现如果用户输入带 script 标签的内容,会被执行!这明显有 XSS 风险。我试过用 DOMPurify,但项目不允许引入第三方库,只能自己处理。

现在想手动做输出转义,但不确定哪些字符必须转。比如下面这段代码:

const userInput = '<img src=x onerror=alert(1)>';
commentDiv.innerHTML = userInput; // 危险!

有没有简单又安全的原生 JS 方法,能把用户输入里的特殊字符转成 HTML 实体再插入?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
UX-熙研
UX-熙研 Lv1
这个问题很常见,innerHTML 直接插用户输入就是典型的 XSS 漏洞。

最直接的解决办法是写一个转义函数,把那些会破坏 HTML 的字符替换成实体:

function escapeHtml(text) {
const map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return text.replace(/[&<>"']/g, m => map[m]);
}

// 使用
commentDiv.innerHTML = escapeHtml(userInput);


不过说实话,如果你只是想把用户输入显示出来,更省心的办法是用 textContent

commentDiv.textContent = userInput;


这样浏览器根本不会把内容当作 HTML 解析,