Skip to content
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

Merged
merged 3 commits into from Mar 6, 2023

Conversation

Lms24
Copy link
Member

@Lms24 Lms24 commented Mar 3, 2023

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)

@Lms24 Lms24 self-assigned this Mar 3, 2023
Comment on lines +17 to +19
[
'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',
Copy link
Member Author

@Lms24 Lms24 Mar 3, 2023

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());
Copy link
Member

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;

Copy link
Member Author

@Lms24 Lms24 Mar 6, 2023

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?

Copy link
Member

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 👍

Copy link
Member Author

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.

@Lms24 Lms24 merged commit 697f95b into develop Mar 6, 2023
@Lms24 Lms24 deleted the lms/remix-ip-http-header branch March 6, 2023 10:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

sentry/remix appears to be incorrectly identifying users based on IP address headers
3 participants