浏览器的解码顺序(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
进行顺序解码的?
徐侠客97
10 years, 1 month ago
Answers
服务端收到请求,进入代码逻辑处理时
input
的值,被
URLDecode
,变为
<\u4e00>
浏览器从服务端获取的页面数据就已经变成了
<\u4e00>
此时通过查看
页面源码
(注意不是页面右键点
检查元素
)可以看到
<a href="javascript:alert('<\u4e00>');">test</a>
浏览器在渲染的时候
作为URL的href字符串
javascript:alert('<\u4e00>');
被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 10 years, 1 month ago