URL之 #、?、&

知己知彼,将心比心。

0x00

① # 的含义

#代表网页中的一个位置,其右边的字符就是该位置的标识符。如下 URL,就是代表网页 index.htmlprint 位置,浏览器读取这个URL后,会自动将print位置滚动至可视区域。网页位置指定标识符,有两个方法。一是使用锚点,<a name="print"></a>,二是使用 id 属性,比如 <div id="print">

http://www.example.com/index.html#print

例子:
在这里插入图片描述
在这里插入图片描述

② HTTP 请求不包括

#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP 请求中不包括 #。
比如,访问下面的网址,

http://www.example.com/index.html#print

浏览器实际发出的请求是这样的:

GET /index.html HTTP/1.1
Host: www.example.com

可以看到,只是请求index.html,根本没有#print的部分。

③ # 后的字符

在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。
比如,下面URL的原意是指定一个颜色值:

http://www.example.com/?color=#fff

但是,浏览器实际发出的请求是:

GET /?color= HTTP/1.1
Host: www.example.com

可以看到,#fff被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:

http://example.com/?color=%23fff

例子:
xsschallenge 的 level-9 中提交的 payload 如下,如果使用 Hackbar 进行提交,默认提交的参数是不会经过 URL 编码的,而 payload 中 & 会被认为是连接符,#会被认为是位置标识符,所以连同后面的内容都一起不被服务器读取,导致正真上传的参数只有 payload 前面的 java
在这里插入图片描述
可以使用编码之后再上传参数
在这里插入图片描述

④ 改变 # 不触发网页重载

单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。
比如,从

http://www.example.com/index.html#location1

改成

http://www.example.com/index.html#location2

浏览器不会重新向服务器请求 index.html

⑤ 改变 # 会改变浏览器的访问历史

每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用后退按钮,就可以回到上一个位置。
这对于ajax应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。
值得注意的是,上述规则对IE 6IE 7不成立,它们不会因为#的改变而增加历史记录。

⑥ window.location.hash 读取 # 值

window.location.hash这个属性可读可写(document.location.hash 只可读)。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。

⑦ onhashchange 事件

这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+Firefox 3.6+Chrome 5+Safari 4.0+支持该事件。
它的使用方法有三种:

window.onhashchange = func;
<body onhashchange="func();">
window.addEventListener("hashchange", func, false);

对于不支持onhashchange的浏览器,可以用setInterval监控location.hash的变化。

0x01 ?

① 连接作用

通过?连接域名和参数

http://www.xxx.com/Show.asp?id=77&nameid=2905210001&page=1

② 清除缓存

http://www.xxxxx.com/index.html
 
http://www.xxxxx.com/index.html?test123123

两个 URL 打开的页面一样,但是第二个 URL 有问号,说明不调用缓存的内容,而认为是一个新地址,重新读取。
因为在做 http 请求的时候,如果浏览器检测到你的地址完全没变,会从缓存里读取先前请求过的数据,不再发送请求。有些时候是页面资源的加载,有些时候是 API 的 get 请求,都有可能。加上这个,会让浏览器认为这是一个新的地址,从而保证重新获取资源。

0x02 &

不同参数之间的间隔符

http://www.xxx.com/Show.asp?id=77&nameid=2905210001&page=1
发布了51 篇原创文章 · 获赞 4 · 访问量 2739

猜你喜欢

转载自blog.csdn.net/LZHPIG/article/details/105502095