HTML实体编码

2025-12-13 0 208

HTML实体编码

  • 首先通过一个例子来说明一下HTML实体编码的重要性
// 前端
<!DOCTYPE html>
<html lang=\"en\">
<meta charset=\"utf8\" />
<head>
  <title>测试</title>
  <style></style>
</head>
<body>
<div id=\"test\"></div>
<textarea name=\"\" id=\"textarea\" cols=\"30\" rows=\"10\"></textarea>
<input type=\"button\" onclick=\"submit()\" value=\"提交\">
<script>
  function submit(){
    let test = document.getElementById(\"test\");
    fetch(\"http://localhost:3000\").then((res)=>{
      res.text().then((response)=>{
        test.innerHTML=response;
      });
    });
  }
</script>
</body>
</html>

	

// node.js后端
const http = require(\'http\')
const fs = require(\'fs\')
const path = require(\'path\')
const port = 3000;

const server =http.createServer((req,res)=>{
res.statusCode = 200
let arr=[\'http://localhost:63342\',\'http://localhost:3001\']
if(arr.includes(req.headers.origin)){
res.setHeader(\'Cache-Control\',\'no-cache\')
res.setHeader(\'Connection\',\'keep-alive\')
res.setHeader(\'Access-Control-Allow-Origin\',req.headers.origin) // req.headers.origin
res.setHeader(\'Access-Control-Allow-Credentials\', \'true\')
}
res.end(\"<img src=@ οnerrοr=alert(123) />\")
})

server.listen(port,()=>{
console.log(\'start\')
})

  • 然后可以发现,把后端响应的值赋值给textarea,只会在textarea显示对应的文本,并不会执行

  • 然后把对应的响应内容赋值给div,就可以执行代码,弹出弹窗,不安全!

  • 但是我们把后端返回的内容修改一下,改为使用HTML实体编码

res.end(\"&lt;imgsrc=@οnerrοr=alert(123)/&gt;\")

  • 可以发现div不会执行代码,textarea也不会,都只是显示一样的文本
<img src=@ οnerrοr=alert(123) />
  • 所以结论就是前端输入和输出的内容,如果需要复制给HTML标签且不经过HTML实体编码,那么会不安全

HTML实体编码介绍

  • 通过上面的例子,我们可以知道,某些保留字符出现在文本节点和标签值里是不安全的

  • 在XHTML中,这些保留字符出现在标签里会立刻报错,但是HTML解析器太懒了,容错性大,并不会出现语法报错

  • 要想安全的使用<,&,>,\”等字符,就需要使用一套实体编码(entity encoding)的简单编码策略

  • 这套HTML实体编码策略是以&符号开头,以;分号结尾的

  • 在XML中只有少数几个这种编码,而在HTML中,存在数百个这种实体编码,并且常用的浏览器都支持这种用法

HTML编码有以下几种方式

  1. HTML实体编码,格式以&符号开头,以;分号结尾的
  • HTML实体编码参考手册
<textareaname=\"\"id=\"textarea\"cols=\"30\"rows=\"10\"> &lt;imgsrc=&quot;localhost&quot;&gt; </textarea> 
  • 结果是:
<img src=\"localhost\">
  1. 十进制的ASCLL编码,格式:以符号&#开头,分号;结尾
  • ascll编码对照表
<textareaname=\"\"id=\"textarea\"cols=\"30\"rows=\"10\"> &#60;&#105;mgsrc&#61;\"localhost\"&#62; </textarea> 
  • 结果是:
<img src=\"localhost\">
  1. Unicode字符编码,格式:以符号&#开头,分号;结尾
  • 另外,下面的unicode编码参考表的数字对应的是十六进制的,但是我们需要先转换为十进制再显示!
  • unicode编码参考
  • 首先把0022转换为十进制是0034;003D转换为十进制是0061
<textareaname=\"\"id=\"textarea\"cols=\"30\"rows=\"10\"> <imgsrc&#0061;&#0034;localhost&#0034;> </textarea> 
  • 结果是:
<img src=\"localhost\">

  1. 十六进制的ascll码,格式:以&#x开头,分号;结尾
  • 参考上面的ascll表,但是注意需要先转换为十六进制。
<textareaname=\"\"id=\"textarea\"cols=\"30\"rows=\"10\"> <imgsrc&#x3D;&#x0022;localhost&#x0022;> </textarea> 
  • 结果是:
<img src=\"localhost\">

  • 最后综合几种写法看看
<textareaname=\"\"id=\"textarea\"cols=\"30\"rows=\"10\"> &lt;&#64;&#0033;&#x3c;&gt; </textarea> 
  • 最后在textarea中显示
<@!<>
  • 也就是<被解析为\”<\”;&#64被解析为\”@\”;&#0033被解析为\”!\”;&#x3c被解析为\”<\”;>被解析为\”>\”

HTML实体编码使用

  1. 使用在标签的双引号内部
<imgsrc=\"https://wangbase.com/blogimg/asset/202107/bg2021072117.png\"> 
<imgsrc=\"&#104;ttps://wangbase.com/blogimg/asset/202107/bg2021072117.png\"> 
  • 我们可以发现,两种写法都可以加载到图片!
  1. 写在标签的属性中
<imgsr&#99;=\"https://wangbase.com/blogimg/asset/202107/bg2021072117.png\"> 

  • 写在标签属性中,相当于破坏了标签的属性值,所以不会加载图片!
  1. 作为双引号,等于号
<imgsrc&#x3D;\"https://wangbase.com/blogimg/asset/202107/bg2021072117.png\"> 
<imgsrc=&#x22;https://wangbase.com/blogimg/asset/202107/bg2021072117.png\"> 

  • 作为等于号,导致浏览器识别为属性名称未结束,错误。不会加载图片
  • 作为等双引号,结果被识别为:(左边两个双引号)\”\”https://wangbase.com/blogimg/asset/202107/bg2021072117.png\”

HTML实体编码不可用于javascript

  • HTML实体编码的范围是HTML文档,不包括javscript执行环境,因为javascript执行环境的解析器不是HTML解析器!
  • 接下来看个代码
document.write(\'&lt;imgsrc=@οnerrοr=alert(123)/&gt;\')
//<imgsrc=@οnerrοr=alert(123)/> 
console.log(\'&lt;imgsrc=@οnerrοr=alert(123)/&gt;\')
//&lt;imgsrc=@οnerrοr=alert(123)/&gt; 
console.log(\'\\<imgsrc=@οnerrοr=alert(123)\\/\\>\')
//<imgsrc=@οnerrοr=alert(123)/>_ 
  • 1. document.write由于最后的字符串被输出到html页面,所以还是会被html实体解码为对应标签
  • 2. 由于只是在js环境中打印,所以最后没有进行html实体编码,字符串不变
  • 3. 由于js的自解码机制会对纯转义字符添加反斜号,所以最后被解析为没有反斜号的形式

微信公众号:web前端进阶之路

其他参考:https://www.qqxiuzi.cn/bianma/zifushiti.php

字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。

这么做的目的主要有两个:
1、解决HTML代码编写中的一些问题。例如需要在网页上显示小于号(<)和大于号(>),由于它们是HTML的预留标签,可能会被误解析。这时就需要将小于号和大于号写成字符实体:
小于号这样写:&lt; 或 &#60;
大于号这样写:&gt; 或 &#62;
前面的写法称为实体名称,后面的写法则是实体编号。ISO-8859-1字符集(西欧语言)中两百多个字符设定了实体名称,而对于其它所有字符都可以用实体编号来代替。
2、网页编码采用了特定语言的编码,却需要显示来自其它语言的字符。例如,网页编码采用了西欧语言ISO-8859-1,却要在网页中显示中文,这时必须将中文字符以实体形式写入HTML代码中。

本页面字符实体编号采用Unicode标准。

参考:https://cloud.tencent.com/developer/article/1728791

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 HTML实体编码 https://www.zuozi.net/36260.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务