使用jQuery转义HTML字符串

JavaScript

逆天西里

2020-03-11

有谁知道一种简单的方法来从jQuery的字符串中转义HTML 我需要能够传递任意字符串并正确地对其进行转义以显示在HTML页面中(防止JavaScript / HTML注入攻击)。我敢肯定可以扩展jQuery来做到这一点,但是目前我对框架还不了解。

第857篇《使用jQuery转义HTML字符串》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

6个回答
StafanItachi 2020.03.11

您可以使用vanilla js轻松实现。

只需在文档中添加文本节点即可。浏览器会将其转义。

var escaped = document.createTextNode("<HTML TO/ESCAPE/>")
document.getElementById("[PARENT_NODE]").appendChild(escaped)
樱十三 2020.03.11

这是一个很好的例子。

function escapeHtml(str) {
    if (typeof(str) == "string"){
        try{
            var newStr = "";
            var nextCode = 0;
            for (var i = 0;i < str.length;i++){
                nextCode = str.charCodeAt(i);
                if (nextCode > 0 && nextCode < 128){
                    newStr += "&#"+nextCode+";";
                }
                else{
                    newStr += "?";
                }
             }
             return newStr;
        }
        catch(err){
        }
    }
    else{
        return str;
    }
}
飞云西里神乐 2020.03.11

经过最后的测试后,我可以推荐最快和完全跨浏览器兼容的本机JavaScript(DOM)解决方案:

function HTMLescape(html){
    return document.createElement('div')
        .appendChild(document.createTextNode(html))
        .parentNode
        .innerHTML
}

如果您重复多次,则可以使用一次准备好的变量进行操作:

//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);

//main work for each case
function HTMLescape(html){
  DOMtext.nodeValue = html;
  return DOMnative.innerHTML
}

查看我的最终性能比较堆栈问题)。

阳光神奇 2020.03.11

我意识到我参加这个聚会有多晚,但是我有一个非常简单的解决方案,不需要jQuery。

escaped = new Option(unescaped).innerHTML;

编辑:这不会转义引号。唯一需要转义引号的情况是将内容内联粘贴到HTML字符串中的属性上。对于我来说,很难想象这样做会是一个好的设计。

编辑2:如果性能至关重要,则性能最高的解决方案(大约50%)仍然是一系列正则表达式的替代品。现代浏览器会检测到正则表达式不包含任何运算符,仅包含一个字符串,并将它们全部折叠为一个操作。

阿飞泡芙 2020.03.11

如果您转义使用HTML,那么我认为只有三点是真正必要的:

html.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");

根据你的使用情况,您可能还需要做这样的事情"&quot;如果列表足够大,我将使用一个数组:

var escaped = html;
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g, "&gt;"], [/"/g, "&quot;"]]
for(var item in findReplace)
    escaped = escaped.replace(findReplace[item][0], findReplace[item][1]);

encodeURIComponent() 只会针对网址而不是HTML进行转义。

小哥前端 2020.03.11

易于使用的下划线:

_.escape(string) 

Underscore是一个实用程序库,提供了许多本机js不提供的功能。还有lodash,它是与下划线相同的API,但被重写以提高性能。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android