很多网站的接口带一个算不出来就 403 的参数——sign、_signature、X-Bogus、a_bogus,名字各异,原理类似。逆它的通用流程:
1. 确认参数确实是算出来的
同样的请求发两次,看这个参数变不变。变 → 含时间戳或随机数;不变 → 纯粹由其他参数派生。
2. 定位生成位置
- XHR/fetch 断点最有效:DevTools → Sources → XHR breakpoints,填接口 URL 片段。请求发出前会断在调用栈上,往上翻就能找到拼参数的地方
- 搜参数名。混淆过的话直接搜不到,但可以搜赋值的目标——比如
headers[或者Object.assign - Hook
XMLHttpRequest.prototype.setRequestHeader和fetch,打印调用栈
3. 抠出算法
找到之后有两条路:
- 还原成本地实现:把逻辑翻译成 Python/Go。最干净,但混淆重的时候工作量大
- 直接跑原 JS:把那段代码连同依赖抠出来,用 Node 或
PyExecJS执行。快,但要处理浏览器环境依赖(window、document、navigator),通常要补环境
4. 补环境
纯 JS 跑不起来往往是因为代码里检测了浏览器特征。常见做法是 mock 一个最小的 window/navigator。有现成的 jsdom,但很多时候手动补几个属性更轻。
5. 验证
拿还原的算法算一遍,和浏览器里真实发出的对比。一致才算完——中间步骤看着对不代表结果对。
说明边界:这里讨论方法和原理。具体针对某个站点的绕过工具、可直接使用的破解成品不要发。