Skip to content

Commit dcda9d9

Browse files
authored
fix: Handle malformed pathnames in middleware (#1353)
Fixes #1351
1 parent b0f8024 commit dcda9d9

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

packages/next-intl/.size-limit.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const config: SizeLimitConfig = [
2727
},
2828
{
2929
path: 'dist/production/middleware.js',
30-
limit: '9.61 KB'
30+
limit: '9.625 KB'
3131
},
3232
{
3333
path: 'dist/production/routing.js',

packages/next-intl/src/middleware/middleware.test.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,13 @@ describe('prefix-based routing', () => {
10751075
);
10761076
});
10771077

1078+
it('handles malformed urls', () => {
1079+
middleware(createMockRequest('/a%'));
1080+
middleware(createMockRequest('/en/a%'));
1081+
middleware(createMockRequest('/en/about/a%'));
1082+
expect(MockedNextResponse.next).toHaveBeenCalledTimes(3);
1083+
});
1084+
10781085
describe('base path', () => {
10791086
it('redirects non-prefixed requests for the default locale', () => {
10801087
middleware(withBasePath(createMockRequest('/')));

packages/next-intl/src/middleware/middleware.tsx

+9-2
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,15 @@ export default function createMiddleware<
4141
};
4242

4343
return function middleware(request: NextRequest) {
44-
// Resolve potential foreign symbols (e.g. /ja/%E7%B4%84 → /ja/約))
45-
const unsafeExternalPathname = decodeURI(request.nextUrl.pathname);
44+
let unsafeExternalPathname: string;
45+
try {
46+
// Resolve potential foreign symbols (e.g. /ja/%E7%B4%84 → /ja/約))
47+
unsafeExternalPathname = decodeURI(request.nextUrl.pathname);
48+
} catch (e) {
49+
// In case an invalid pathname is encountered, forward
50+
// it to Next.js which in turn responds with a 400
51+
return NextResponse.next();
52+
}
4653

4754
// Sanitize malicious URIs to prevent open redirect attacks due to
4855
// decodeURI doesn't escape encoded backslashes ('%5C' & '%5c')

0 commit comments

Comments
 (0)