Skip to content

Commit a3d2740

Browse files
fix: Sanitize PE redirect locations for ByteString safety (#602)
Fixes EPICSHOP-F2: sanitize PE redirects Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent 88e2283 commit a3d2740

1 file changed

Lines changed: 15 additions & 2 deletions

File tree

  • packages/workshop-app/app/utils

packages/workshop-app/app/utils/pe.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ export function ensureProgressiveEnhancement(
3030
) {
3131
const redirectTo = formData.get(PE_REDIRECT_INPUT_NAME)
3232
if (typeof redirectTo === 'string') {
33-
throw redirect(safeRedirect(redirectTo), responseInit?.())
33+
throw redirect(toRedirectLocation(redirectTo), responseInit?.())
3434
}
3535

3636
// if request does not accept application/json, it means JS hasn't hydrated yet
3737
if (!acceptsJson(request)) {
3838
const redirectToReferrer = request.headers.get('Referer') ?? '/'
39-
throw redirect(safeRedirect(redirectToReferrer), responseInit?.())
39+
throw redirect(toRedirectLocation(redirectToReferrer), responseInit?.())
4040
}
4141
}
4242

@@ -50,6 +50,19 @@ function acceptsJson(request: Request) {
5050
)
5151
}
5252

53+
function toRedirectLocation(redirectTo: string, fallback = '/') {
54+
const safe = safeRedirect(redirectTo, fallback)
55+
try {
56+
return encodeURI(decodeURI(safe))
57+
} catch {
58+
try {
59+
return encodeURI(safe)
60+
} catch {
61+
return fallback
62+
}
63+
}
64+
}
65+
5366
export function dataWithPE<Data>(
5467
request: Request,
5568
formData: FormData,

0 commit comments

Comments
 (0)