浏览器的解码顺序(html解码、url解码以及js解码)



 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<a href="javascript:alert('<?php echo $_GET['input'];?>');">test</a>
</body>
</html>

代码如上,当参数 input 的值为: %26lt%5cu4e00%26gt 的时候,点击 test 文本,弹窗内容为: <一>
想知道,从输入参数到弹窗的整个过程中浏览器是如何对 %26lt%5cu4e00%26gt 进行顺序解码的?

编码 浏览器 解码 php JavaScript

徐侠客97 9 years, 7 months ago

服务端收到请求,进入代码逻辑处理时

input 的值,被 URLDecode ,变为 &lt\u4e00&gt
浏览器从服务端获取的页面数据就已经变成了 &lt\u4e00&gt
此时通过查看 页面源码 (注意不是页面右键点 检查元素 )可以看到


 <a href="javascript:alert('&lt\u4e00&gt');">test</a>

浏览器在渲染的时候

作为URL的href字符串 javascript:alert('&lt\u4e00&gt'); 被HTMLEntity解码,变为


 <a href="javascript:alert('<\u4e00>');">test</a>

这一步可以通过在页面上右键点击 test链接 ,选择 检查元素 ,可以看出实际渲染出的dom元素

点击test链接时

执行的其实是一句javascript代码,其中有一个字符串, '<\u4e00>' ,里面有一个转义字符 \u4e00 ,对其进行 逆转义 ,由前导符 \u 可知这是一个unicode编码的转义,将这6个字节的字符串 '\u4e00' 转化为一个实际上占3个字节空间的unicode字符 '一' ,此时整个字符串占用的内存空间为

< >
3c e4 b8 80 3e

如果你直接在代码里写成 alert('<一>'); ,这个字符串的内部存储方式也是这样的

最终渲染alert框时

由系统将上字节码,翻译为可显示的对应编码的字符,渲染在屏幕上

sstd1h answered 9 years, 7 months ago

Your Answer