比如要把:<span>test</span> 这段代码当做文本原样输出在页面上,如果按照正常的方式,肯定会被转义,在页面上只能看到 text。那么要想达到预想的效果,应该怎么办呢?

在学习 html 标签时,知道如果要把 代码 原样输出,可以用标签 pre + code 处理。但这种方式不能处理:html 标签。

1. 借助 vue 框架,可以这么做实现:

<template>
<p v-html="html" />
</template> <script>
export default {
data () {
return {
html: '<span>test</span>'
}
}
}
</script>

2. 借助 react 框架,可以这么实现:

import React, { PureComponent } from 'react'

class Test extends PureComponent {
constructor (props) {
super(props) this.state = {
html: '<span>test</span>'
}
} render () {
const { content } = this.state return (
<div>
<p dangerouslySetInnerHTML={{__html: content}} />
</div>
)
}
}

3. 如果想只用一个 html 标签就实现,可能吗?答案是可能的,可以用 xmp 标签。这个标签的作用:会将内容当做字符串输出。

<xmp><span>test</span></xmp>

不过,这个标签被W3C废弃了,但各大浏览器依然支持该标签。为什么被废弃呢?被废弃,肯定有被废弃的缘由的。如果一定要用这个标签,需注意:

  • 若模板中包含标签会造成标签结束符混乱的问题,因此通过该方式存放模板时,不能包含结束标签;
  • xmp元素必须作为body的子孙元素。

4. 那么不借助xmp标签或框架的能力,如何自己实现呢?

// html 转义处理
function htmlEncode (text) {
var isHtml = /[\x00`><\"'&]/;
var htmlEncode = /[\x00`><"'&]/g;
return text != null ? isHtml.test(text) && ("" + text).replace(htmlEncode, getCharEntity) || text : ""; function getCharEntity (ch) {
var charEntities = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
"\x00": "",
"'": "'",
'"': """,
"`": "`"
};
return charEntities[ch] || (charEntities[ch] = "&#" + ch.charCodeAt(0) + ";");
}
}; let htmlCon = '<span>test</span>';
document.querySelector('#html_con').innerHTML = htmlEncode(htmlCon);

5. 特地去看了 vuereact 源码,想看看它们都是怎么实现的。但只找到 react 中是怎么实现的,vue 目录太多也比较绕,没找到。

node-modeles/react-dom/cjs/react-dom-server.browser.development.js 中 631 行。

// code copied and modified from escape-html
/**
* Module variables.
* @private
*/ var matchHtmlRegExp = /["'&<>]/; /**
* Escapes special characters and HTML entities in a given html string.
*
* @param {string} string HTML string to escape for later insertion
* @return {string}
* @public
*/ function escapeHtml(string) {
var str = '' + string;
var match = matchHtmlRegExp.exec(str); if (!match) {
return str;
} var escape = void 0;
var html = '';
var index = 0;
var lastIndex = 0; for (index = match.index; index < str.length; index++) {
switch (str.charCodeAt(index)) {
case 34:
// "
escape = '&quot;';
break;
case 38:
// &
escape = '&amp;';
break;
case 39:
// '
escape = '''; // modified from escape-html; used to be '&#39'
break;
case 60:
// <
escape = '&lt;';
break;
case 62:
// >
escape = '&gt;';
break;
default:
continue;
} if (lastIndex !== index) {
html += str.substring(lastIndex, index);
} lastIndex = index + 1;
html += escape;
} return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
}
// end code copied and modified from escape-html /**
* Escapes text to prevent scripting attacks.
*
* @param {*} text Text value to escape.
* @return {string} An escaped string.
*/
function escapeTextForBrowser(text) {
if (typeof text === 'boolean' || typeof text === 'number') {
// this shortcircuit helps perf for types that we know will never have
// special characters, especially given that this function is used often
// for numeric dom ids.
return '' + text;
}
return escapeHtml(text);
} /**
* Escapes attribute value to prevent scripting attacks.
*
* @param {*} value Value to escape.
* @return {string} An escaped string.
*/
function quoteAttributeValueForBrowser(value) {
return '"' + escapeTextForBrowser(value) + '"';
}

这部分源码,还是比如容易看懂呢。

总结:html 转义,主要就是将 "'&<> 这几个特殊字符转换为 html 实体。

延伸:预防 xss 攻击:

  • 对用户输入进行转义
  • 获取内容后,反转义并domParse,过滤不安全标签及属性,进行xss拦截
    • 不安全标签:style、link、script、iframe、frame、img
    • 不安全属性:onerror、onclick等

html 转义处理的更多相关文章

  1. .NET 基础 一步步 一幕幕[运算符、占位符、转义符]

      运算符.占位符.转义符 好吧,在五局全胜之后,终于升到了三个钻,距离一个星星还有一大段距离,忽然想起来今天的博客还没写,果断坑队友,来写博客了....感觉以后还是每天更新一篇比较好.要不晚上就该熬 ...

  2. Unicode转义(\uXXXX)的编码和解码

    在涉及Web前端开发时, 有时会遇到\uXXXX格式表示的字符, 其中XXXX是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和\n \r同属于转义字符. 在其他语言中也有类 ...

  3. java转换 HTML字符实体,java特殊字符转义字符串

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  4. SharePoint文档库文件夹特殊字符转义

    当我们在SharePoint网站文档库中新建文件夹时包含了~ " # % & * : < > ? / \ { | }字符时(一共15个), 或者以.开头或者结束,或者包含 ...

  5. 利用StringEscapeUtils对字符串进行各种转义与反转义(Java)

    apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml ...

  6. 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生

    类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...

  7. Mysql字符转义

    在字符串中,某些序列具有特殊含义.这些序列均用反斜线('\')开始,即所谓的转义字符.MySQL识别下面的转义序列: \0 ASCII 0(NUL)字符. \' 单引号('''). \" 双 ...

  8. angularJS绑定数据时自动转义html标签

    angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签中的注入攻击,但有些时候还是需要的,特别是从数据库读取 ...

  9. java后台对前端输入的特殊字符进行转义

    转自:http://www.cnblogs.com/yangzhilong/p/5667165.html java后台对前端输入的特殊字符进行转义 HTML: 常见的帮助类有2个:一个是spring的 ...

  10. Linux Shell 通配符、元字符、转义符【转帖】

    作者:程默 说到shell通配符(wildcard),大家在使用时候会经常用到.下面是一个实例: 1   1 2 3 4 [chengmo@localhost ~/shell]$ ls a.txt  ...

随机推荐

  1. mysql修改用户密码命令

    C:\Users\20160216>mysql -h 10.180.6.183 -u root -pEnter password: ******Welcome to the MySQL moni ...

  2. insmod 签名问题

    问题现象: 通过 insmod 加载 XXX.ko 时候提示: hello: module verification failed: signature and/or required key mis ...

  3. Reveal Cards In Increasing Order LT950

    In a deck of cards, every card has a unique integer.  You can order the deck in any order you want. ...

  4. SHELL脚本学习-自动生成AWR报告

    自动生成AWR报告,每个小时生成一次. #编辑脚本:vim awr_auto.sh #oracle用户下执行 #!/bin/bash # 每个小时执行一次,自动生成AWR报告 source ~/.ba ...

  5. C语言学习书单

    1.C Primer Plus(第六版)(中文版)豆瓣详情 ​ C Primer Plus 最大的缺点可能就是内容太细,对于C语言讲解极为细致,但对于Sequence Point等内容并没有详细讲解. ...

  6. python实现简单动画——生命游戏

    生命游戏 生命游戏的宇宙是一个无限的,其中细胞的二维正交网格,每个细胞处于两种可能的状态之一,即*活着*或*死亡*(分别是*人口稠密*和*无人居住*).每个细胞与它的八个邻居相互作用,这八个邻居是水平 ...

  7. 利用Python生成GIF动图

    一.PIL库 1.PIL库的概括: PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库 ...

  8. JAVA的环境变量配置

    开发JAVA程序需要先准备开发环境,安装好操作系统后首先需要去下载JDK并安装. JDk(Java Development Kit )是Java开发工具包,如果您要开发基于Java的应用首先需要下载并 ...

  9. 学习Acegi应用到实际项目中(11)- 切换用户

    在某些应用场合中,可能需要用到切换用户的功能,从而以另一用户的身份进行相关操作.这一点类似于在Linux系统中,用su命令切换到另一用户进行相关操作. 既然实际应用中有这种场合,那么我们就有必要对其进 ...

  10. 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...