Skip to content

Commit 8f8a172

Browse files
committed
fix: cap query string length, JSON values, and screenshot delay
Add input validation caps to OG image context resolution: - Reject query strings over 2048 characters (400 error) - Silently drop JSON query param values over 4096 characters - Clamp screenshot.delay to 0-10000ms range
1 parent a8a65b6 commit 8f8a172

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/runtime/server/og-image/context.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,25 @@ export async function resolveContext(e: H3Event): Promise<H3Error | OgImageRende
9494

9595
// Also support query params for backwards compat and dynamic overrides
9696
const query = getQuery(e)
97+
98+
// Cap total query string size to prevent oversized payloads
99+
const MAX_QUERY_LENGTH = 2048
100+
const rawQuery = e.path.split('?')[1] || ''
101+
if (rawQuery.length > MAX_QUERY_LENGTH) {
102+
return createError({
103+
statusCode: 400,
104+
statusMessage: `[Nuxt OG Image] Query string exceeds maximum length of ${MAX_QUERY_LENGTH} characters.`,
105+
})
106+
}
107+
97108
let queryParams: Record<string, any> = {}
98109
for (const k in query) {
99110
const v = String(query[k])
100111
if (!v)
101112
continue
102113
if (v.startsWith('{')) {
114+
if (v.length > 4096)
115+
continue // silently drop oversized JSON values
103116
try {
104117
queryParams[k] = JSON.parse(v)
105118
}
@@ -141,6 +154,10 @@ export async function resolveContext(e: H3Event): Promise<H3Error | OgImageRende
141154
// Normalise options and get renderer from component metadata
142155
const normalised = normaliseOptions(options)
143156

157+
// Cap screenshot.delay to prevent indefinite waits (max 10s)
158+
if (normalised.options.screenshot?.delay != null)
159+
normalised.options.screenshot.delay = Math.min(Math.max(0, Number(normalised.options.screenshot.delay) || 0), 10_000)
160+
144161
// Auto-eject community templates in dev mode (skip devtools requests)
145162
if (normalised.component?.category === 'community')
146163
autoEjectCommunityTemplate(normalised.component, runtimeConfig, { requestPath: e.path })

0 commit comments

Comments
 (0)