File tree Expand file tree Collapse file tree 3 files changed +38
-3
lines changed Expand file tree Collapse file tree 3 files changed +38
-3
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ " @remix-run/express " : patch
3
+ ---
4
+
5
+ Better validation of ` x-forwarded-host ` header to preent potential security issues.
Original file line number Diff line number Diff line change @@ -219,4 +219,28 @@ describe("express createRemixRequest", () => {
219
219
) ;
220
220
expect ( remixRequest . headers . get ( "host" ) ) . toBe ( "localhost:3000" ) ;
221
221
} ) ;
222
+
223
+ it ( "validates parsed port" , async ( ) => {
224
+ let expressRequest = createRequest ( {
225
+ url : "/foo/bar" ,
226
+ method : "GET" ,
227
+ protocol : "http" ,
228
+ hostname : "localhost" ,
229
+ headers : {
230
+ "Cache-Control" : "max-age=300, s-maxage=3600" ,
231
+ Host : "localhost:3000" ,
232
+ "x-forwarded-host" : ":/spoofed" ,
233
+ } ,
234
+ } ) ;
235
+ let expressResponse = createResponse ( ) ;
236
+
237
+ let remixRequest = createRemixRequest ( expressRequest , expressResponse ) ;
238
+
239
+ expect ( remixRequest . method ) . toBe ( "GET" ) ;
240
+ expect ( remixRequest . headers . get ( "cache-control" ) ) . toBe (
241
+ "max-age=300, s-maxage=3600"
242
+ ) ;
243
+ expect ( remixRequest . headers . get ( "host" ) ) . toBe ( "localhost:3000" ) ;
244
+ expect ( remixRequest . url ) . toBe ( "http://localhost:3000/foo/bar" ) ;
245
+ } ) ;
222
246
} ) ;
Original file line number Diff line number Diff line change @@ -89,9 +89,15 @@ export function createRemixRequest(
89
89
) : Request {
90
90
// req.hostname doesn't include port information so grab that from
91
91
// `X-Forwarded-Host` or `Host`
92
- let [ , hostnamePort ] = req . get ( "X-Forwarded-Host" ) ?. split ( ":" ) ?? [ ] ;
93
- let [ , hostPort ] = req . get ( "host" ) ?. split ( ":" ) ?? [ ] ;
94
- let port = hostnamePort || hostPort ;
92
+ let [ , hostnamePortStr ] = req . get ( "X-Forwarded-Host" ) ?. split ( ":" ) ?? [ ] ;
93
+ let [ , hostPortStr ] = req . get ( "host" ) ?. split ( ":" ) ?? [ ] ;
94
+ let hostnamePort = Number . parseInt ( hostnamePortStr , 10 ) ;
95
+ let hostPort = Number . parseInt ( hostPortStr , 10 ) ;
96
+ let port = Number . isSafeInteger ( hostnamePort )
97
+ ? hostnamePort
98
+ : Number . isSafeInteger ( hostPort )
99
+ ? hostPort
100
+ : "" ;
95
101
// Use req.hostname here as it respects the "trust proxy" setting
96
102
let resolvedHost = `${ req . hostname } ${ port ? `:${ port } ` : "" } ` ;
97
103
// Use `req.originalUrl` so Remix is aware of the full path
You can’t perform that action at this time.
0 commit comments