punycode。)但请注意,Hostname组件(当AhostName而不是IP地址时)没有要求是完全限定的域名(FQDN);也可能是一个部分合格的域名,因为决议遵循通常的本地存根resolver'斜语和可能涉及/etc/nsswitch.conf,/ etc / hosts和/etc/resolv.conf。
这实际上非常有用,几种群体使用这是一个整洁的小技巧,以提供acompany-internall-shortener / bookmarkingredirector,如golinks,没有为浏览器插件或类似于这样的东西:
现在,这里唯一有点令人困惑的部分是无论你运行自己的CA,你可以' t获得&#34的actericate; Go&#34 ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,但是,无论哪种方式,你都会看到" hostname" URL需要的组件是完全合格的。
"权威"组分可以进一步容纳"端口"子组件。当服务器使用非默认端口时,我肯定有效地' ve seenthat在行动中,所以'它真的很多。令人惊讶的是。砍掉港口只是意味着你&# 39; LL使用与该方案相关联的Thedefault端口。
这里的一个边缘条件是您可以将波斯特空白留下,但仍然包括" :&#34 ;:
另一个边缘条件是RFC3986DOES未在端口号上指定最大值(每个RFC1340 / RFC6335IS在0 - 65535的范围内)或者如何处理零填充,因为当然取决于客户端处理URL的客户端。这使得这是一个可怕的URL:
现在为" Pathname"这个' s fun.it看起来像......好吧,一个路径名。就像在你的系统上。将服务器删除,PrerogativeTo以其喜欢的方式解释它,这意味着,文件系统路径的所有边缘条件也在此处使用。
A" Pathname"有一个来自&#34的不同乌卢其字符; hostname"组件,因为它不受主机名ordns限制的绑定。这也意味着在URL中,我们'现在切换某些字符的含义,例如" 。&#34 ;.几乎是一个&#34中唯一不允许的角色; pathname"组件是nul和/;允许所有其他类别明确地单纯属于百分比的数据,然后在解析本地路径之前,服务器可以在该数据中进行解码。
这包括空格,以及以下两个URLSLEAD到位于目录中的同一文件; SNAMED" &#34 ;:
$ pwd / htdocs / www.netmeister.org $ ls -la"博客/ urls /"总计12drwxr-xr-x 2 jschauma滚轮512 19月19日14:58 .drwxr-xr-x 6 jschauma滚轮1024 6月20日16:26 ..- rw-r - r-- 1 jschauma轮子85 Jun 19 14:59 f $ curl -i" https://www.netmeister.org/blog/urls/ / f" http / 2 200日期:星期一,21日2021 15:45:31 gmtserver:apache / 2.4。 43(UNIX)openssl / 1.1.1klast-modified:SAT,19六月2021 18:59:53 GMTContent-Length:85这个文件位于名为&#34的目录中; " .see https://www.netmeister.org/blog/urls.html$$
是的,当然,您可以给出路径名组件任何有效名称,例如"💩&#34 ;:
路径名可能是空的,或者完全由emptemy子组件组成,使所有这些都转到同一个地方:
但是" Pathname" URL发送HTTP请求的组件一旦您已将AC连接到服务器,也可能是完整的URLittitelf,而不仅仅是" Pathname"成分。 RFC7230IN事实在与代理交谈时授权此项:
$ openssl s_client -connect www.netmeister.org:443 -quiet -crlf 2> / dev / null head https://www.netmeister.org/blog/urls.html http / 1.0http / 1.1 200 Okdate:Mon,21 2021年6月2021年6月18日GMTserver:Apache / 2.4.43(UNIX)openssl / 1.1.1klast-Modified:Mon,21 Jun 2021 18:24:38 GMTContent-Length:29963Content型:Text / HTML; charset = UTF-8
如果你'重新与代理商交谈,你可以刚刚出现任何方案://进入&#34的权限; Request-Uri",这是现在现在已成为此上下文的情况,Andat最少Apache忽略了路径名中的所有内容:
$ openssl s_client -connect www.netmeister.org:443 -quiet -crlf 2> / dev / null get gopher://facebook.com/blog/urls.html http / 1.0http / 1.1 200 okdate:mon,21 2021 18:43:28 GMTserver:Apache / 2.4.43(UNIX)openssl / 1.1.1kContent型:Text / HTML; Charset = UTF-8Content语言:en [...]
点很有趣。如果您的Web服务器在类似AUNIX的系统上运行,则为路径名,单个DOTMeans"此目录"和两个点意味着"我的parentdirectory"这就是为什么你看到请求的原因例如," /../../../../../../../../../../../../../1.. / ...... inyour web服务器和#39; s日志,试图突破您的我们的服务器文档根目录。
现在,一个体面的Web服务器不允许请求在其文档根目录外的请求,但是这里'这里更有意思的是,此分辨率发生在每个RFC3986的LocalFileSystem路径分辨率之前(嗯,应该发生)意味着你可以假装 - " ../"周末存在的目录:
$ pwd / htdocs / www.netmeister.org $ ls -ld tdne ls:d:没有这样的文件或directoryls:e:没有这样的文件或directoryls:n:没有这样的文件或directoryls:t:没有这样的文件或目录$ ls -ld t / h / e / s / e / d d / I / R / E / C / T / O / R / I / E / S /。 。/../../../../../../../../../../不要/.. /../../e/x/i/s/t/../../../../../.. / blog / urls.htmlls:t / h / e / s / e / / ...../../../../d/i / r/e/c/t/o/r/i/e/s/d/../../../ ... ../../../../../../d/../../n/o/t/../../../t/../../'o/x/i/s. /t/../../../../../../.. /bog/urls.html:没有这样的文件或目录$ curl -i https://www.netmeister.org/t/h/e/s /e/../../../../../../../../1../i/r/e/c/t/or/r/i/e/s/../../ ... ./../../../../../../d/o/../../n/t/t/../../../t/ X / I / S / T / d / ...博客/ urls.htmlhttp / 2 200日期:Mon,21 Jun 2021 16:07:35 GmTserver:Apache / 2.4.43 (UNIX)openssl / 1.1.1klast-modified:mon,21日2021年6月21日16:03:41 GMTContent-Length:24107Content型:Text / HTML; Charset = UTF-8 Content语言:EN $
但当然你可以拥有文件或目录名和#34; ..."或" ...."等等,所以关注会给你一个实际文件:
嗯,但这个莫尔斯代码Pathname组件很长。我们可以制作多久? IFIT' s路径名称,那么它应该受到特工系统的限制,并熟悉,我可以' tCreate一个名录' s长于ffs_maxnamlen = 255个字符。但我可以创建嵌套的子模型,最终构建击中操作系统的完整路径' s path_max = 1024:
$ PWD / htdocs中/ www.netmeister.org $ CD博客/ URL $ LS -ld ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddrwx-XR-X 19年6月3日17:40 ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd jschau到车轮512 / $ CD CD DD DD * $ * $ * $ CD CD DD DD * KSH:CD:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd:坏目录$ PWD / htdocs中/ www.netmeister.org /博客/ URL / ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd / ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd / $ ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
" 〜#34;是特殊的,除了它' s note。 INTHIS,IT'很多像你谢尔的TINDE扩张一样 - 它只是如果它'&#34之后的第一特征才会发生; /"这是" Pathname"。如果这个第一个段开始" /〜用户名/,然后是许多Web ServersDefault(或可以配置)以解决和#34的Theremaine; Pathname"从本发明' s" web空间"常常〜用户名/ public_html。
但它值得注意的是,对Auser的扩张'只有常规的个人网空间是公约:rfcsdon' tipps讨论了这一点,尽管支持A" Userdir"似乎是头灯回来作为cernhttpd和ncsa_httpd.但是,关于&#34的速度没有什么特别的特别之处; 〜#34;字符根本。当然,您可以使用名为&#34的目录或文件; 〜":
到目前为止,一切都很好。但是如果捐赠者有一个名为&#34的用户会发生什么;用户名"或者你这样做,并且有一个文件名和#34; 〜用户名"在你的我们的根目录中'让' s试一试:
$ pwd / htdocs / www.netmeister.org $ id nobody uid = 32767(nobody)go = 39(nobody)组= 39(nobody)$ ls -ld〜nobody / public_html \〜nobodyls:/ nonexistent // public_html:否这样的文件或目录-RW-R - R-- 1 Jschauma滚轮4月20日15:22〜Nobody $ Cat \〜nobodythis是一个名为"〜nobody"符合"〜notauser"指向它.see https://www.netmeister.org/blog/urls.html$$卷曲-i https://www.netmeister.org/~nobodyhttp/2 404日期:星期一,21日2021 20:12: 21 GmTserver:Apache / 2.4.43(UNIX)openssl / 1.1.1kcontent yext:text / html; Charset = ISO-8859-1 $ ID NotaUserID:NOTAUSER:没有这样的用户$ ls -ld〜notaUser / public_html \〜notauser ls:〜notauser / public_html:注意一个directorylwx ------ 1 jschauma滚轮7月20日:23〜NOTAUSER - > 〜没有人$ cat \〜notauserthis是一个名为"〜没有人和#34;符合"〜notauser"指向它.see https://www.netmeister.org/blog/urls.html$$卷曲-i https://www.netmeister.org/2notauserhttp/2 200日期:周一,21日2021 20:17: 09 GmTserver:Apache / 2.4.43(UNIX)openssl / 1.1.1kcontent-length:124content-language:en $
也就是说,如果您的Web服务器支持(和哈希为)用户目录,并且您提交请求" 〜用户名":
如果"用户名"是一个有效的用户,&#34的serverlooks; 〜用户名/ public_html" open open该目录不存在,但文件〜用户名确实存在
如果"用户名"不是一个有效的人,然后发生正常的路径名决议,意味着文件" 〜用户名"存在于WEB服务器和#39; S文档根目录中,它是服务的
A"查询" URL中的组件遵循A" ?"字符和......基本上没有完全融合。你可以把任何东西放入查询中,包括否则无法实现的人物,如" /"和#34; ?&#34 ;:
现在按照惯例,查询往往使用A" key1 = value1& key2 = value2"语法,虽然当然没有什么需要你这样做,但是oreven要使用" &"作为分隔符; SomeSystems也(用于)使用" ;"
但是,它真的都有查询。它' HTTP请求的SPART和服务器可以将ITINTO放置为" query_string"
URL的最后一个组成部分是"碎片identifier"这个'很奇怪,虽然'显然是一个URL,它旨在完全向客户端Bescoped,而不是服务器。实际上,常见的HTTP客户端确认将片段归功于服务器,该事实是由eg,https://privatebin.info/,decryption键放入URL的Fragment Component中的系统,然后确保服务器不知道键。
您的常见Web浏览器甚至例如,Curl(1)将在提前调整HTTP请求之前绑住片段,但当然您从发送Get RequestWith包含一个片段的请求时,您当然可以创建包含A的文件名,并且可以创建一个包含A的文件名。 #34; #"
现在Apache httpd处理A" #"在那里,您可以在其中作为400个不良请求,但RFC2616DOES不授权这一点。例如,Bozohttpd不治疗" #"在那里,uriest-uri,所以您可以例如makethis请求:
$ echo -ne" get /blog/urls/urls.html#fragment http / 1.0 \ r \ n \ r \ n" | \ nc www.netmeister.org 8080http / 1.0 200 okdate:tue,22 jun 2021 00:12:22 GmTserver:Bozohttpd / 20170201Accept-ranges:Byteslast-Modified:Byteslast-Modified:Byteslast-Modified:Sat,19 Jun 2021 12:58:28 GMTContent型:文本/ plaincontent-length:113刚刚恰好包含一个&#39的普通文件;#'在它的姓名.see https://www.netmeister.org/blog/urls.html
现在与所有这一长的讨论,让' s从上面回到那个愚蠢的网址:
现在这看起来像是水豚鼠等同于URL。 Let' s Untangle豪了扬声器成为一个有效的链接。
第一个" https://#34;没有违约,只是你平常的计划和奉承
现在我们开始发挥愚蠢的技巧:" / www wetmeister.org"使用小部分册字符作为密码的一部分。编码,这看起来如此:%E2%81%84%E2%81%84www%2enetmeister%2eorg
下一个" https"现在是权限的主机名组件:依赖于/ etc / hosts的部分限定主机名,其中包含一个指向https到正确的IP地址的条目。
下一个" :"现在是主机名和端口组件的分隔符。在这里,它后跟一个空端口,使Wedefault到特定于方案的端口,443在该配置。
下一个" //#34;然后仅仅是权威的结束,后跟一个空的路径组成。
下一个" www.netmeister.org"现在通过该名称提供目录,其次是标准的分隔符," /
在此之后,我们找到文件名和#34; https://www.netmeister.org//"再次使用分数斜杠字符。
查询允许任何字符,所以在这里我们得到一个名为" https://www.netmeister.org"与一个" ="分配值" https://www.netmeister.org"
最后,我们有一个碎片,可能会包含任何角色,所以我们填充了另一个角色和#34; https://www.netmeister.org"在那里。
好的,所以什么'这是什么大问题?为什么我在上面的情况下打扰了上面的情况,当我甚至是屁股?
我称之为"脑袋模糊"或" logicalfuzzing&#34 ;:我试图了解每一天使用的东西,它是什么' scapting todo,它如何定义,然后有时我去"呵呵,我会发生什么我把x放在旁边。"
我也发现它有趣的是网址如何超越正常浏览器上下文,以及我们如何依赖于客户端和服务器,即使这不清楚。