知识

以s代替查询的url无法修改

时间:2010-12-5 17:23:32  作者:焦点   来源:焦点  查看:  评论:0
内容摘要:我盯着浏览器地址栏里那串以 s 开头的查询 URL,光标悬停在“编辑”按钮上,点了三次。没反应。又试了右键菜单里的“修改查询参数”,还是没反应。这破工具是我自己写的,我比谁都清楚那个 s 代表什么——

我盯着浏览器地址栏里那串以 s 开头的替查查询 URL,光标悬停在“编辑”按钮上,法修点了三次。替查没反应。法修又试了右键菜单里的替查“修改查询参数”,还是法修没反应。这破工具是替查我自己写的,我比谁都清楚那个 s 代表什么——用户输入的法修关键词,需要用 GET 方法传给后端做模糊搜索。替查可今天它突然锁死了,法修像个罢工的替查电梯,按钮按下去只有沉闷的法修“咔嗒”声。

排查过程很无聊,替查但结论有意思:s 这个参数被前端框架的法修某个中间件拦截了,它在路由跳转前强制把查询串里的替查 s 替换成了 %73——URL 编码后的“s”。浏览器地址栏里显示的还是 s,但实际发送给服务器的已经是 %73。后端解析器只认原生的 s,于是返回 404。我试着在开发者工具里手动改请求头,把 %73 改回 s,能通。但页面一刷新,中间件又自动编码回去。

这让我想起上周隔壁组同事的吐槽。他们有个老系统,查询参数叫 q,后来换了个网关,网关内部把 q 映射成 query,结果所有带 q 的分享链接全失效了。没人愿意去改网关配置,因为那套配置是外包公司十年前写的,注释全是乱码,改一行可能引发雪崩。最后他们只能在业务层加了个兼容函数,每次从 query 里再抽一次 q 的值。治标不治本,但能用。

我这边的情况更拧巴——s 不是被映射,而是被编码。编码本身是合法的,HTTP 协议允许任何字符转义。问题出在“无法修改”这四个字上。中间件把 URL 当作不可变对象来处理,它认为查询串在进入路由后就是“终态”,不允许任何后续代码再碰它。这种设计初衷是防篡改,防止有人恶意注入参数。但副作用是,连开发者自己也被锁在门外。

我翻了框架的文档,找到一条配置项叫 allowQueryOverride,默认是 false。改成 true 就能解锁。但我没改。为什么?因为改了这个配置,意味着所有依赖旧行为的代码都可能出问题——比如某个安全审计脚本,它专门检查 URL 里有没有未编码的特殊字符。一旦放开覆盖权限,审计脚本会报警,然后运维那边会收到一堆告警邮件,然后他们会上线一个补丁把我的配置又改回去。循环往复。

这种“锁死”不是技术问题,是组织问题。你面对的不是一段代码,而是一整套流程惯性。就像你家里的路由器密码,你知道怎么改,但改了之后,老婆的平板、小孩的智能手表、老人的电视盒子全要重新连,你懒得折腾。

所以最后我选择了一个土办法:在页面里加了个隐藏输入框,监听 keydown 事件,用户一旦按回车,就手动拼接完整的查询 URL 并跳转。绕开中间件。丑,但有效。同事看了代码问我为什么不直接改配置,我说“改配置要过三道审批”。他笑了笑,没再追问。

你问我写这篇文章想说明什么?没什么。就是记录一下这种日常——你以为是技术问题,其实是制度问题;你以为是制度问题,最后发现是人性问题——人总想保护自己那部分不出错,于是宁可让整体多绕弯。s 无法修改,不是因为它真的不能改,而是因为改它的人要承担的隐性成本,比绕过它的人多得多。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap