Charles 断点调试与 Rewrite 重写实战:随心修改请求与响应
抓包只是"看",真正的调试力在于"改"。Charles 提供两套改包能力:Breakpoints(断点)用于手动、逐个、实时地拦下请求慢慢改;Rewrite(重写)用于自动、批量、按规则地改。两者配合,你几乎可以模拟出任何客户端与服务端之间的异常场景。
- 一、Breakpoints:实时拦截并手动改包
- 二、请求断点 vs 响应断点
- 三、Rewrite:按规则自动改包
- 四、Rewrite 规则类型速查表
- 五、四个高频实战场景
- 六、Breakpoint 还是 Rewrite?
一、Breakpoints:实时拦截并手动改包
断点的效果是:当命中的请求经过 Charles 时,会被暂停,弹出一个可编辑界面,让你在"发出前"改请求、在"返回前"改响应,改完点 Execute 才继续。
启用方式(任选其一):
1. 在会话列表里右键某个请求或某个 Host,选择 Breakpoints,即可对该 URL 打断点;
2. 打开 Proxy > Breakpoint Settings,手动 Add 一条规则并勾选 Request / Response,可精确控制在请求阶段断、还是响应阶段断。
断点是"阻塞式"的:命中后请求会一直挂起等你操作。调试完记得关掉断点,否则页面会像卡死一样一直转圈——这是新手最常见的困惑。
二、请求断点 vs 响应断点
| 请求断点(Request) | 响应断点(Response) | |
|---|---|---|
| 拦截时机 | 请求发往服务器之前 | 响应返回客户端之前 |
| 能改什么 | URL、请求头、Query、请求体、Cookie | 状态码、响应头、响应体 |
| 典型用途 | 改参数绕过前端校验、伪造 UA/Token 测后端 | 把成功响应改成错误码、篡改数据测前端容错 |
在断点编辑界面,切到 Edit / Raw 标签即可直接改文本;改完点 Execute 放行,或点 Cancel/Abort 中断该请求。
三、Rewrite:按规则自动改包
如果你要改的是"每一个请求都加同一个 header"这种重复劳动,断点就太笨了。Tools > Rewrite 让你写一条规则,之后所有命中的请求/响应都被自动改写,无需人工干预。
操作:Tools > Rewrite > Enable Rewrite > Add(新建一组规则集)。每组规则先在 Location 里设定作用的 Host/Path,再在下方 Add 具体的重写动作。
四、Rewrite 规则类型速查表
| Type(类型) | 作用 | 常见用法 |
|---|---|---|
| Add Header | 新增请求/响应头 | 补 CORS 头、注入自定义调试头 |
| Modify Header | 修改已有头的值 | 改 User-Agent、改 Content-Type |
| Remove Header | 删除某个头 | 去掉 If-None-Match 强制不走缓存 |
| Modify Query Param | 改 URL 查询参数 | 强制 env=test |
| Modify Path | 改请求路径 | 把 /v1/ 重写成 /v2/ |
| Body | 正则替换请求/响应体 | 把响应里的 "vip":false 改成 true |
| Response Status | 改响应状态码 | 把 200 改成 500 测容错 |
| Host / URL | 整体重定向 | 类似 Map Remote 的效果 |
Body 类型支持正则和捕获组,勾选 Regex 后即可用 $1 引用匹配内容,能做相当精细的替换。
五、四个高频实战场景
场景 1:伪装成另一个客户端。用 Modify Header 把 User-Agent 改成手机端 UA,或加 X-Client-Version: 9.9.9,测试服务端的机型/版本分发逻辑。
场景 2:把正常返回改成错误码,测前端容错。用 Response Status 把 200 改成 500 或 401,看看页面有没有兜底提示、Token 失效后会不会正确跳登录。
场景 3:篡改响应体解锁隐藏逻辑。用 Body 正则把响应里的开关字段替换掉,例如:
匹配(Regex): "featureFlag"\s*:\s*false
替换为: "featureFlag": true
这样无需后端配合即可打开灰度功能做联调。
场景 4:绕过前端校验测后端健壮性。前端限制了金额只能填正数?用请求断点把 amount=100 改成 amount=-1 直接发给后端,看后端是否做了服务端校验——这是安全与健壮性测试的常规手法。
以上操作仅应在你有权测试的自有系统或获得授权的环境中进行。篡改他人服务的数据属于违规甚至违法行为。
六、Breakpoint 还是 Rewrite?
| 需求 | 推荐 |
|---|---|
| 只改这一次、要逐个看着改 | Breakpoint |
| 每次请求都要做同样的改动 | Rewrite |
| 改动依赖具体内容、要临场判断 | Breakpoint |
| 规则固定、想解放双手 | Rewrite |
经验法则:探索阶段用断点摸清楚要改什么,稳定之后把它固化成 Rewrite 规则,调试效率会有质的提升。