diff --git a/packages/next/src/server/image-optimizer.ts b/packages/next/src/server/image-optimizer.ts index 8f28117e93..4dfd153e84 100644 --- a/packages/next/src/server/image-optimizer.ts +++ b/packages/next/src/server/image-optimizer.ts @@ -213,6 +213,12 @@ export class ImageOptimizerCache { } } + if (url.startsWith('/_next/image')) { + return { + errorMessage: '"url" parameter cannot be recursive', + } + } + let isAbsolute: boolean if (url.startsWith('/')) { diff --git a/test/integration/image-optimizer/test/util.ts b/test/integration/image-optimizer/test/util.ts index 13ced1f674..bf2a25e086 100644 --- a/test/integration/image-optimizer/test/util.ts +++ b/test/integration/image-optimizer/test/util.ts @@ -1021,6 +1021,13 @@ export function runTests(ctx: RunTestsCtx) { ) }) + it('should fail when url is recursive', async () => { + const query = { url: `/_next/image?url=test.pngw=1&q=1`, w: ctx.w, q: 1 } + const res = await fetchViaHTTP(ctx.appPort, '/_next/image', query, {}) + expect(res.status).toBe(400) + expect(await res.text()).toBe(`"url" parameter cannot be recursive`) + }) + it('should fail when internal url is not an image', async () => { const url = `/api/no-header` const query = { url, w: ctx.w, q: 39 }