做 Web 安全久了会有一种直觉:很多漏洞不是“代码写错了”,而是输入的一串 URL 被不同组件用不同方式理解了——浏览器、反向代理、网关、应用框架、WAF、日志系统,各自解析一次,边界一旦不一致,就容易出事。
URL(Uniform Resource Locator,统一资源定位符)本质上是网络世界的“门牌号”。但它又不仅仅是地址:它还携带协议、认证信息、端口、路径规则、参数、页面内定位……你在地址栏输入的每一个符号,都可能影响最终请求长什么样、落到后端哪段逻辑上。
常见 URL 可以抽象成这样一条模板:
scheme://userinfo@host:port/path?query#fragment

实战提示:很多安全问题的根源,是“你以为这是路径,后端却当成参数”,或者“你以为 # 后面会发给服务器,结果它根本没出浏览器”。
端口上有个常识:
:8080、:8443)一般必须显式写出来。ftp://:文件传输场景常见;历史遗留系统里仍可能出现弱口令、匿名访问。file:///:访问本地文件。很多同学第一次遇到“PHP 文件怎么显示源代码不执行”,往往就是用 file:// 打开了本地文件——它只负责展示内容,不会让服务端解析执行。mailto::点击会唤起邮件客户端;钓鱼邮件里经常用来引导用户发送敏感信息。安全建议:在业务系统里,如果出现“用户可控的跳转 URL”(例如回跳地址、第三方登录 redirect_uri),务必限制 scheme,只允许
https(必要时http仅限内网),否则很容易演变成开放重定向甚至更糟的利用链。
典型格式:
ftp://user:pass@ftp.example.com/dir/file.zip
这段 user:pass@ 在现代 Web 里已经很少用了,但你仍可能在:
风险主要在于:敏感信息会进入浏览器历史、代理日志、服务器日志、截图/录屏、分享链接。很多企业安全事件里,凭据泄露就是这么来的。
host 可以是域名,也可以直接是 IP:
https://www.example.com/https://47.106.8.175/域名背后要经过 DNS 解析变成 IP。安全测试时,host 相关的关注点很多:
http://127.0.0.1/、http://169.254.169.254/(云环境元数据)、http://localhost/ 等。Host 头(HTTP/1.1 必需字段)里;部分应用拿 Host 拼接回链、生成重置密码链接时,若校验不严会翻车。端口是“同一台服务器上不同服务的入口”。写错端口,经常表现为:
安全上常见的现实是:业务对外宣称只开放 443,但实际在 :8080、:7001、:9000 上跑着测试接口、管理控制台、旧版服务。
很多人会把下面这种 URL 理解成“访问服务器上的某个文件”:
https://example.com/app/index.php
在静态站点里这通常成立;但在现代 Web 框架里,路径很可能只是路由映射:
/user/list 对应某个控制器方法/article/12345.html 可能是“伪静态”,后端提取 12345 当参数查数据库,再渲染模板所以别被 .do、.action、.html 之类的后缀迷惑——很多时候它只是“看起来像文件”的接口标识。
同时,Web 服务器通常还有“默认首页”规则:当你只写目录不写文件名时(例如访问 /dvwa/),服务端会按配置优先寻找 index.html、index.php 等默认文件返回。
安全关联:路径解析与规范化(
/../、双斜杠、URL 编码的点和斜杠)是目录穿越、鉴权绕过、WAF 绕过的高发地带。测试时务必结合目标技术栈验证其规范化行为。
参数格式大家都熟:
?key1=value1&key2=value2
关键点有三个:
%20)。很多绕过都发生在“编码/解码次数不一致”上。a=1&a=2 这种叫参数污染(Parameter Pollution),不同组件取值策略不同,容易被利用。常见安全问题举例:
?id=1' or '1'='1?userId=1001 换成 1002 是否能看别人数据?redirect=https://evil.com?q=<script>...(取决于反射位置与输出编码)# 后面的片段(fragment)用于页面内定位或前端路由:
https://example.com/doc.html#chapter5https://example.com/#/settings重点:fragment 不会出现在 HTTP 请求里。也就是说服务端日志、WAF、后端框架通常看不到 # 后面的内容。
图 2:fragment 的“边界”
安全补充:有些 OAuth 老方案会把 token 放在
#后面(避免被服务端日志记录)。但这并不等于绝对安全——前端脚本若被 XSS 控制,仍然可以读到 fragment 内容。
把整个过程串起来,大概是:
安全人员在这里常做的检查包括:
Secure、HttpOnly、SameSite两种最常用的方法:
Host、Cookie、Location、Set-Cookie。拿到一个可控 URL(或可控跳转/回调地址)时,我一般按这个顺序过一遍:
file:、javascript:(如业务允许)或非预期协议如果你希望我再写一篇更偏“攻防实操”的延伸,可以把一个真实案例的 URL(脱敏即可)发我,我可以按上述清单带你从 DevTools/Burp 一步步拆解它的风险点与验证方法。
· 今 日 鉴 图 ·
