比如要把:<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. Python模拟接口登录

    参考地址:https://blog.csdn.net/rifengxxc/article/details/77414090 下面讲下关于python模拟登录实验,之前怎么调试也不行,我也是摸索了好久, ...

  2. MAC使用超级终端

    其实很简单. 先用ls看看/dev/tty.*哪个是具体的串口,我这里使用的edison的板子,所以插到macos上后可以看到的设备节点为: 只需要使用screen 命令即可,具体的命令格式如下: s ...

  3. python3 安装 google-visualization-python(windows10)

    google-visualization-python 的 github 官网:https://github.com/google/google-visualization-python 安装: 打开 ...

  4. eclipse配置逆向工程

    eclipse单行注释:ctrl + shfit + c   或者   Ctrl+/:    添加//注释 快速查找某个类:Ctrl+Shift +T   查找这个类的子类是ctrl+t eclips ...

  5. Java+Selenium自动化对非输入框的日历或日期控件的处理

    如图:          1.问题描述: 在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这 ...

  6. RPA答疑

    变量:部分主要对于工程中的变量进行管理和设置,支持手动拖拉至右侧画布 1全局变量:全局变量可以在整个工程中传递,被不同的子流程或函数进行调用,全局可见可调用 2 流程参数:只对子流程设置传入参数,供子 ...

  7. hbase常用操纵操作——增删改查

    查询某个资金账户的信息 get 'dmp:hbase_tags','资金账号' 创建表 create 'emp', 'personal data', 'professional data' 在HBas ...

  8. 使用@Autowird注入报空指针异常

    new的对象不能调用此对象里面注入的其他类,如果想要调用注入的其他类,则此new的对象要使用@componet将此类注入. 原因:

  9. C# 获取外网IP地址

    很多情况下我们需要获取外网的IP地址,一般用自带的方法获取到的都是不准确,往往获取到的是内网的IP地址,所以需要采用外部网站接口来获取. 代码 通过访问第三方接口来获取真实的ip地址 public s ...

  10. 将preg_replace()改写为preg_replace_callback()

    preg_replace()函数使用/e修饰符可能带来安全隐患,PHP5.5之后,该用法被抛弃使用,升级为preg_replace_callback().在新版本下运行老版本的代码,会出现错误,如: ...