Skip to content

Commit e99a6fe

Browse files
Digidaiclaude
andcommitted
fix: block expensive params on /api/stream for anonymous requests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9358989 commit e99a6fe

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

src/__tests__/index-conversion-stream-og.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ describe("index conversion/stream/og routes", () => {
408408
const req = new Request(
409409
"https://md.example.com/api/stream?url=https%3A%2F%2Fexample.com%2Fstream&selector=.main&force_browser=true&no_cache=true&engine=jina&token=public-token",
410410
);
411-
const res = await worker.fetch(req, createMockEnv().env);
411+
const res = await worker.fetch(req, createMockEnv({ PUBLIC_API_TOKEN: "public-token" }).env);
412412
const body = await res.text();
413413

414414
expect(res.status).toBe(200);

src/index.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,18 +273,27 @@ export default {
273273
if (request.method !== "GET") {
274274
return new Response("Method Not Allowed", { status: 405, headers: CORS_HEADERS });
275275
}
276+
const streamToken = url.searchParams.get("token");
277+
const streamNoCache = url.searchParams.get("no_cache") === "true";
278+
const streamEngine = url.searchParams.get("engine");
279+
const streamForceBrowser = url.searchParams.get("force_browser") === "true";
276280
if (env.PUBLIC_API_TOKEN) {
277281
const authorized = await isAuthorizedByToken(
278282
request,
279283
env.PUBLIC_API_TOKEN,
280-
url.searchParams.get("token"),
284+
streamToken,
281285
);
282286
if (!authorized) {
283287
return Response.json(
284288
{ error: "Unauthorized", message: "Valid token required for /api/stream" },
285289
{ status: 401, headers: CORS_HEADERS },
286290
);
287291
}
292+
} else if (streamNoCache || streamEngine || streamForceBrowser) {
293+
return Response.json(
294+
{ error: "Unauthorized", message: "Parameters no_cache, engine, and force_browser require a valid token." },
295+
{ status: 401, headers: CORS_HEADERS },
296+
);
288297
}
289298
const decision = await consumeRateLimit(request, env, "stream");
290299
if (decision?.exceeded) {

0 commit comments

Comments
 (0)