美文网首页
URL 的浏览器解析

URL 的浏览器解析

作者: 喵了个咪0 | 来源:发表于2019-04-10 15:46 被阅读0次

                                                      

    最近再看大师傅们关于url的博客,感觉收益匪浅,想总结一下心得,写的不好,请各位师傅多多指点。

                                                            0x01    URL 的构成

    scheme://username:password@host:port/path/?query-string=xxx#anchor

    scheme:代表访问的协议,一般为http或者https以及ftp

    username:password: 登陆信息

    host:主机名,域名,比如:www.baidu.com。

    port:端口号。浏览器默认使用80端口。

    path:查找路径。比如www.jianshu.com/trending/now,后面的trending/now就是path

    query-string:查询字符串。比如:www.baidu.com/s?wd=python,后面的wd=python就是查询字符串。

    anchor:锚点,后台一般不用管,前端用来做页面的定位的。

    注意:URL中所有的字符都是ASCII字符集,如果出现非ASCII字符集,比如中文,浏览器会先进行编码再进行传输 

                                                              0x02   浏览器对url的解析

    一:浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤

                       如果资源未缓存,发起新请求

                       如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。

                       检验新鲜通常有两个HTTP头进行控制Expires和Cache-Control:

                                        HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期

                                        HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间

    二:浏览器解析URL获取协议,主机,端口,path等信息

    以【scheme://username:password@host:port/path/?query-string=xxx#anchor】作为一个栗子

    1.浏览器会先提取协议名:

    当浏览器提取协议名时,他会第一个查找【:】

    号左边的便是协议名,如果获得的协议名中出现了不该有的字符,那么认为这可能就是个相对的url 获得的并不是协议名!


    在chrome、firefox等主流浏览器中,如果url以//domain开头,浏览器将会默认认为这个url是当前数据包的协议。比如,我们访问http://目标IP.com/?redir=//baidu.com/,则浏览器会默认认为跳转到http://baidu.com,而不是跳转到.//baidu.com/目录。


    2.去除层级url标记符:

    字符串【//】应该算跟在协议名后面的 如果发现有该字符 则会跳过该字符 如果没有找到便不管了!所以 http:baidu.com 也是可以访问的

    浏览器中还可以用反斜杠来代替正斜杆【\\】代替【//】

    但是firefox除外!

    3.获取授权信息

    依次扫描url,如果这三个符号中 哪个先出现便以哪个为准来截取

    /(正斜杠)

    ?(问号)

    #(井号)

    从url里提取出来的信息,就算授权部分信息!

    除了IE跟safari其他浏览器还接受 ;(分号)也算授权信息部分中可接受的分隔符!

    (1)定位登陆信息,如果有的话:

    授权部分信息提取出来后,在截取出来的信息里再来查找 @ 如果找到了 那么他前面的部分便是登陆信息!登陆信息再查找 : (冒号) 冒号前面的便是账号 后面便是密码!

    (2)提取目标地址

    授权信息部分剩下的便是目标地址了 第一个冒号分开的就算主机名跟端口!用方括号括起来的就是ipv6地址,这也是个特例!

    结合以上信息 我们分析下以下链接:

    ftp://admin:admin@192.168.1.100:21

    这样的链接我经常用来登陆ftp!这样便会以admin的身份 密码为:admin

    ftp协议去登陆主机192.168.1.100,端口号是21端口

    4.确定路径(如果的确存在)

    如果授权部分的结尾跟着一个正斜杆,某些场景里,跟着一个反斜杠或者分号,就像之前提到的,依次扫描下一个? # 或字符串结尾符,那个先出现便以哪个为准!截取出来的部分就是路径信息!最后根据unix路径语义进行规范化整理!

    5.提取查询字符串(如果的确存在)

    如果在上一条解析里,后面跟着的是一个问号,便继续扫描下一个 # 或到字符串结尾,哪个先出现便以哪个为准!中间的部分便是查询字符串。

    6.提取片段ID

    如果成功解析完上一条信息,它最后还跟着#号 那么从这个符号到字符串的结尾便算片段ID了,片段ID是不会发送到服务器的!一般用来跳到A标签的锚链接 或者用来js的 location.hash 取值 等等!

    栗子一:

    http://www.jianshu.com&action=test@www.baidu.com

    这样一个链接在普通用户看来 是会认为访问www.jianshu.com的!

    但是实际上是去往www.baidu.com 的

    首 先 协议名提取出来了 然后获得授权部分信息,? / # 都未出现 浏览器便无法获得一个字符串来获得主机地址!我们再往后看@符 @符前面的便认为是登陆信息 并不会当做主机名来解析!所以现在www.jianshu.com&action=test 已经被当做登陆信息了 现在唯一的主机名便只有www.baidu.com了.而www.jianshu.com&action=test在我们访问网站的时候 被当做了登陆了信息去访问www.baidu.com了!

    我们用firefox访问来看(虽说被风险提示了,但是我们还是能够看到浏览器解析出来真正要访问的链接时www.baidu.com)(貌似只有firefox提示了风险,IE和google均为提示)

                                                                  0x03 url的书写格式

    [//]后面我们还能输入tab,换行,/ @ \

    栗子:

    //www.baidu.com

    \\/www.baidu.com

    \\@www.baidu.com

    \\/@www.baidu.com

    \\\\\\\www.baidu.com

    ///////www.baidu.com

    这些在firefox里都可以解析到baidu

    但是在ie,google里有的就不行了

    针对域名的编码:Punycode

    经过Punycode编码后的域名是会被DNS服务器所识别的!

    就 拿中文域名来说,因为操作系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,所以DNS服务器上并不支持直接的中文域名解析。 所有中文域名的解析都需要转成punycode码,然后由DNS解析punycode码。最后我们成功的访问到了我们要去网站!只不过今天我们这里 punycode编码的解析过程并不是由dns服务器来解析的 而是在浏览器访问时就给解码回来

    7.url编码解析

    十进制 —> 十六进制 —> 八进制 然后在访问时 指定协议然后加个0

    url—> 十六进制 —> 十进制

    栗子

    http://xss1.com&action=test@www.baidu.com

    后面还带着www.baidu.com 太打眼了,现在把我们上面转换后的地址加在后面 记得带上0前缀!

    http://xss1.com&action=test@016373751032

     8.畸形绕过                                                                             

    当redir的参数为:http://localhost?.dianping.com时,正常跳转到localhost,当参数为:http://localhost.?.dianping.com时依然正常跳转,但是在localhost的.后面加上任意数字或字母,马上就跳转到m.dianping.com了,因此使用数字地址进行任意URL跳转。

    参考博客:URL Hacking – 前端猥琐流

                        从浏览器地址栏输入url到显示页面的步骤(以HTTP为例)

    相关文章

      网友评论

          本文标题:URL 的浏览器解析

          本文链接:https://www.haomeiwen.com/subject/xeyniqtx.html