html实体编码遇上js代码

简介: 在js中单、双引号引起来的是字符串,如果我们要在字符串中使用单、双引号,需要反斜杠进行转义。而如果字符串出现在html标签中,我们需要做转义处理。

单双引号

在js代码中

在js中单、双引号引起来的是字符串,如果我们要在字符串中使用单、双引号,需要反斜杠进行转义

let str='user\'s name';
// or
let str=" user's name";
// or
let str="she said:\"...\".";

如果在字符串中输出反斜杠,仍然是用反斜杠转义,即2个反斜杠输出1个反斜杠

在html代码中

html标签中,属性值通常用双引号引起来,也可以使用单引号或不用引号。

<input name=user />
<input name="user" />
<input name='user' />

这3种写法都正确,不过通常我们是选择用双引号引起来。
如果我们要在属性值中使用单、双绰号,我们不能直接写成下面这样

<input name=user'name />
<input name="user"name" />
<input name='user'name' />

这些全部是错误的。我们要像在js中对单、双引号转义一样,对属性中的单、双引号转义

在html中输出预留符号,可以使用字符实体转义的形式,这里有简单介绍:http://www.w3school.com.cn/html/html_entities.asp。即想输出一个双引号可以使用&quot;的形式,

<input name="user&quot;name" />

除此之外,html还支持十进制与十六进制编码的形式输出字符,如我们知道字符aascii码的十进制是97 十六进制是61
所以我们在页面body中输出一个字符a,有以下3种形式

<body>
  a<!--直接输出-->
  &#97;<!--十进制输出-->
  &#x61;<!--十六进制输出-->
</body>

同样,单双引号也有十进制(单:39,双:34)与十六进制(单:27,双:22),所以我们在属性中输出一个单引号有2种选择,十进制与十六进制

<input name='user&#39;name' /><!--十进制-->
<input name='user&#x27;name' /><!--十六进制-->

而输出一个双引号则有3种选择

<input name="user&quot;name" /><!--实体-->
<input name="user&#34;name" /><!--十进制-->
<input name="user&#x22;name" /><!--十六进制-->

当js代码遇上实体编码

我们可以通过dom节点提供的事件写上调用js的代码,如点击body弹出hello这个字符串,我们可以写成

<body onclick="alert('hello')">
click here
</body>

如果我们的需求是就弹出一个双引号呢?
根据前述规则,我们要写成:

<body onclick="alert('&quot;')"><!--这里用十进制或十六进制都可以-->
click here
</body>

当然,alert里的单引号也可以使用十进制或十六进制编码

<body onclick="alert(&#34;&#39;&#34;)"><!--&#34;单引号  &#39;双引号-->
click here
</body>

这样也是可以的。
是不是有点xss的感觉?

如果我们把弹双引号的需求改成单引号呢?

<body onclick="alert(''')"><!--这样html中是合法的,但js中并不合法,因为在js中,中间的单引号并没有转义-->
click here
</body>

如果我们用十进制或十六进制编码呢?

<body onclick="alert('&#34;')"><!--这样可以吗-->
click here
</body>

这样仍然是不可以的

我们要对js字符串中的单引号进行转义,如

<body onclick="alert('\'')"><!--转义后可正确弹出-->
click here
</body>

<body onclick="alert('\&#34;')"><!--转义后可正确弹出-->
click here
</body>

前面的onclick="alert('\'')"看起来还正常,后面的这个onclick="alert('\&#34;')"就有点不直观了。因为后面这个看上去反斜杠像在转义&这1个字符,而&在js的字符串中并不需要转义的。

动态输出

如前述的alert弹出的消息,如果是一个变量控制,动态输出呢?

<body onclick="alert('${msg}')">
click here
</body>

那我们这个msg字符串就得注意了,从这个示例来看,这个动态的msg即出现在属性onclick中,也出现在alert的单引号开始的字符串中。

我们要对msg中的双引号转成&quot;&#34;&#x22;,并对msg中单引号的前面加上一个反斜杠\ ?

题外话:对msg中的反斜杠需要做double处理,因为反斜杠在html属性中并不是特殊的,但在js的字符串中是特殊的。因此正确的做法是对反斜杠及单引号前面各加上一个反斜杠

然而,你并不能保证属性是用双引号,alert中的字符串用的是单引号,因为可以写成下面这样

<body onclick='alert("${msg}")'>
click here
</body>

?

这种情况我们要对msg中的单引号转成&#39&#x27,并对msg中双引号前面加上一个反斜杠\

题外话:同上

看上去要根据不同的情况做不同的处理,其实也不需要
我们只需要对单、双引号前面加上一个反斜杠\然后再对单、双引号实体编码即可。

在js中如果反斜杠后面跟的不需要反斜杠转义的字符,那么这个反斜杠是被丢弃的,因此像

var str="user\'s name";

单引号前面多加一个反斜杠也不要紧的。

自动化处理与识别提醒

在magix项目中,由于magix-combine的支持,可识别出属性中js代码的部分,并自动化处理,如

<button mx-click="showName({name:'<%=name%>'})">click here</button>

name这个变量可包含任意的单、双引号及反斜杠。工具自动识别并处理,开发者不需要做任何事情。

而对于这样的写法:

<button mx-click="showName({name:'&#34;'})">click here</button>
<!-- or-->
<button mx-click="showName({name:'\&#34;'})">click here</button>

第一种写法其实并不正确,但第二种情况看上去又怪怪的。magix-combine工具能识别出来是否需要添加反斜杠,并自动添加处理。
第一种需要添加反斜杠,工具会自动加上,并提醒开发者这里的写法是不正确的。
第二种说明开发者意识到了问题所在,自己处理了,工具就不再处理也不再提醒开发者。

相关链接:

https://github.com/thx/magix
https://github.com/thx/magix-combine

目录
相关文章
|
1月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
45 3
原生js炫酷随机抽奖中奖效果代码
|
23天前
|
前端开发 JavaScript
用HTML CSS JS打造企业级官网 —— 源码直接可用
必看!用HTML+CSS+JS打造企业级官网-源码直接可用,文章代码仅用于学习,禁止用于商业
102 1
|
28天前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
41 3
|
29天前
HTML 字符实体1
HTML 字符实体用于替代预留字符和键盘上无法输入的字符。例如,小于号 (&lt;) 和大于号 (&gt;) 必须用 `&lt;` 和 `&gt;` 替换,以避免被浏览器误认为标签。常用的字符实体还包括不间断空格 (`&nbsp;`),用于在页面中增加空格数量。
|
29天前
HTML 字符实体2
发音符号是加在字母上的字形,用于表示不同的发音。常见的变音符号有尖音符( ̀)、抑音符( ́)等,它们可以出现在字母的上方、下方或内部,甚至两个字母之间。这些符号可以与字母或数字字符组合使用,以改变其发音。例如:a&#768; 表示 à,O&#769; 表示 Ó。
|
1月前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
41 4
|
1月前
|
移动开发 HTML5
html5+three.js公路开车小游戏源码
html5公路开车小游戏是一款html5基于three.js制作的汽车开车小游戏源代码,在公路上开车网页小游戏源代码。
55 0
html5+three.js公路开车小游戏源码
|
12天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
380 4