Commit 2f233c4
committed
fix(assistant): 回应 PR #295 CR — IP 防伪造 / 真实 hasImage / 上游错误匹配收紧
Copilot 提了 6 条 + CodeQL 2 条正则告警,全部修复:
**lib/rate-limit.ts**
- 文档头 usage 示例 API 改对(CR #1)
- getClientIp 防伪造(CR #2,**安全修复**):
优先 x-real-ip(Vercel 等 CDN 写的是可信值);降级用 XFF 时取**最后一个**
而非首个,避免客户端伪造 `x-forwarded-for: fakeip` 绕过 rate-limit
- Upstash 缺失 warn 改用 module-scoped flag,整个实例生命周期只打一次,
不再按 NODE_ENV 区分 —— dev 也得看到提示(CR #3)
**app/api/chat/route.ts**
- POST 入口预读 body 判定 hasImage,true 时触发 5 req/60s 严限流;
预读失败不阻塞,保持原有容错(CR #4)
- 新增 messagesHaveImage helper:识别 type=image / image_url / file+image 媒体
- mapUpstreamError 不再把 err.stack 拼进匹配文本:stack 里的 `:429:` 行号
会误触发 rate-limited 分类(CR #5,**真实 bug**)
- JSON.stringify 加 try/catch 兜底 String(err),避免循环引用再抛错(CR #6)
- 所有业务码正则里的 `.*` 改成 `[^\s]{0,10}?`,限死回溯深度防 ReDoS
(CodeQL polynomial regex 告警)1 parent 161086a commit 2f233c4
2 files changed
Lines changed: 90 additions & 20 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
37 | 47 | | |
38 | 48 | | |
39 | 49 | | |
| |||
261 | 271 | | |
262 | 272 | | |
263 | 273 | | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
264 | 298 | | |
265 | 299 | | |
266 | 300 | | |
| |||
269 | 303 | | |
270 | 304 | | |
271 | 305 | | |
272 | | - | |
273 | | - | |
274 | | - | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
279 | | - | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
280 | 325 | | |
281 | 326 | | |
282 | | - | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
283 | 331 | | |
284 | | - | |
| 332 | + | |
285 | 333 | | |
286 | 334 | | |
287 | 335 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | | - | |
| 11 | + | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
21 | 24 | | |
22 | 25 | | |
23 | 26 | | |
| |||
70 | 73 | | |
71 | 74 | | |
72 | 75 | | |
73 | | - | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
74 | 84 | | |
75 | 85 | | |
76 | | - | |
77 | | - | |
78 | 86 | | |
79 | | - | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
80 | 98 | | |
81 | 99 | | |
82 | 100 | | |
| |||
102 | 120 | | |
103 | 121 | | |
104 | 122 | | |
105 | | - | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
106 | 126 | | |
107 | | - | |
| 127 | + | |
| 128 | + | |
108 | 129 | | |
109 | 130 | | |
110 | | - | |
| 131 | + | |
| 132 | + | |
111 | 133 | | |
112 | 134 | | |
113 | 135 | | |
| |||
0 commit comments