当前位置:首页 > 娱乐

一个WEB站点由端口编号和参数组成

你打开浏览器,站点组成敲下一串字符,由端按下回车。口编屏幕上蹦出个页面。号和这背后发生的参数第一件事,其实是站点组成你的电脑在问:我要找的那台机器,它的由端哪个门牌号开着?这个门牌号,就是口编端口。

端口编号是号和个16位的数字,范围从0到65535。参数听起来挺宽裕,站点组成但常用的由端就那么几个。80端口留给HTTP,口编443给HTTPS,号和22给SSH,参数3306给MySQL。我见过有人把Web服务塞到8080上跑,图个不跟系统抢地盘。也有狠人直接上8888,说是吉利。其实端口本身不决定服务类型,只是个数字标识——但约定俗成这事儿,比协议本身还顽固。

光有端口还不够。你访问 http://example.com:8080,端口后面还能跟一长串东西。问号开始,&符号分隔,等号连接键值。这就是参数。比如 ?id=123&name=zhangsan。服务器拿到这串玩意儿,拆开,看看你要什么。

参数分两种。一种在URL里明摆着,叫查询字符串(query string)。另一种藏在请求体里,比如POST表单或者JSON。前者谁都能看见,浏览器历史记录、服务器日志、代理缓存,一路留痕。后者稍微隐蔽点,但抓个包也一目了然。所以别往参数里塞密码,这是常识。可总有人这么干。

我印象最深的一次调试,是帮朋友看他的小站。页面加载奇慢。查了半天,发现他在每个请求里都带了个 ?timestamp=... 参数,说是为了防止缓存。结果呢,CDN彻底失效,所有请求都打到源站。一个参数,把整个缓存层干废了。端口没错,参数写岔了。

参数还能玩出花来。比如 ?debug=true,有些框架直接给你吐内部状态。?callback=alert(1) 这种,早些年JSONP接口没过滤好,就是XSS漏洞。端口是门,参数是钥匙——但钥匙也可能被复制、被篡改、被拿来撬锁。

再说回端口。同一台服务器,80端口跑官网,8080跑测试环境,3000跑Node服务。你访问哪个端口,流量就进哪个进程。端口像公寓楼里的房间号,参数像你进门后跟住户说的暗号。暗号对不上,住户不理你;房间号错了,你连门都敲不开。

有时候端口和参数还会打架。比如你写了个Nginx规则,把 /api 转发到后端5000端口,但参数里的 ?path=/admin 没做过滤,后端直接拿这个path去读文件。路径穿越就这么来的。端口转发本身没错,参数信任了不该信任的输入。

所以你看,一个Web站点,说到底就是端口编号加参数。端口决定你敲哪扇门,参数决定你进门后说什么。门可以有很多扇,话可以有很多种说法。但每扇门后面,每个参数背后,都藏着一段代码在等着你。它可能友善,可能冷漠,也可能直接给你个500错误。

下次你输URL的时候,不妨多看两眼。那个冒号后面的数字,那个问号后面的字符串。它们不是装饰。它们是这个站点跟你对话的全部语法。

分享到: