New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(remix): Correctly parse X-Forwarded-For
Http header
#7329
Conversation
[ | ||
'2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5,2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5, 141.101.69.35', | ||
'2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test failed before the fix, returning 141.101.69.35
instead of 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5
, due to a missing space after the first comma.
@@ -52,7 +52,7 @@ export function getClientIPAddress(headers: Headers): string | null { | |||
return parseForwardedHeader(value); | |||
} | |||
|
|||
return value?.split(', '); | |||
return value?.split(',').map((v: string) => v.trim()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Super-l: This may be slightly more efficient as:
return value ? value.replace(/\s*/gm, '').split(',') : null;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally good idea (and I definitely didn't think of this initially) but my only concern here is that we're potentially rewriting individual IP addresses in the header value, very potentially making an invalid IP address appear valid:
'2b01:cb19:8350:ed00:d0 dd:fa5b:de31:8be5, 141.101.69.35'
would first be rewritten to
'2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5,141.101.69.35'
before it's split, resulting in the function returning 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5
when it would otherwise have returned 141.101.69.35
.
Of course, that's a super unlikely edge case but I'd rather avoid it. Wdyt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wouldn't both code snippets (so the regex and the trim variants) return the same thing in this scenario? 😅 But maybe I am missing something here :) really it probably doesn't matter at all, so let's just go with what you wrote 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since trim
only looks at trailing/leading white spaces it'd not touch the whitespace in the middle of the originally invalid IP address. (I double checked this with a test, just to be sure because I was also confused 😅 ).
But yeah, I'll go with the original version.
Seems like we had a bug in the Remix Server SDK when parsing the
X-Forwarded-For
Http header to obtain the user IP address. This PR attempts to fix this and adds a few unit tests tests.Fixes #7323 (hopefully)