是的,我在捣鼓ZBlog
插件喽,发现一个问题,就是用ZBlog
自带方法,会把前端传输过来的一些字符,进行转义了,但是与我在前端展示的时候就要在反转义回来,不够这是正确的做法,也是因为怕发现XSS
漏洞。
网上的关于怎么还原HTML字符实体(转义字符)的方法挺多的,这里我就不一一都列举出来了,我就写自己比较喜欢的方法,就是利用浏览器内部转换器实现HTML字符实体(转义字符)的转义/反转义,具体的代码如下:
/** * HTML字符实体(转义字符)编码 * @param {*} str 字符串 * @returns 编码的字符串 */ function htmlCharacterEntitiesEncode(str) { const div = document.createElement("div"); div.textContent = str; return div.innerHTML; } /** * HTML字符实体(转义字符)解码 * @param {*} str 字符串 * @returns 解码的字符串 */ function htmlCharacterEntitiesDecode(str) { const div = document.createElement("div"); div.innerHTML = str; return div.innerText; } //测试 console.log(htmlCharacterEntitiesEncode("<p>test</p>")); console.log(htmlCharacterEntitiesDecode("<p>test</p>"));
2021.12.28日更新
发现上面的方法,不能非常完美的解决所有的HTML字符实体(转义字符)的还原,比如我今天遇到的是&
就无法正确的还原出&
,经过验证,还有很多特殊的HTML字符实体(转义字符)也是不能还原的。
所以,对于要兼容大部分的HTML字符实体(转义字符)还原/编码的话,这里还是推荐大家用相对比较成熟的js库把:https://github.com/mdevils/html-entities
我猜测插件的原理,其实也是把字符串中含有HTML字符实体(转义字符),逐一替换掉,不过可能人家有对应的算法,可能速度很快把,所以,如果是项目中的话,还是推荐大家用现成的库比较好,毕竟省心,省时,我当时的需要只要还原的大部分的HTML字符实体(转义字符)就好了,无奈最后还是老老实实用库了。