Skip to content

fix(security): reject underscore HTTP headers (closes #578) - #605

Merged
s2x merged 1 commit into
masterfrom
fix/issue-578-reject-underscore-headers
Aug 3, 2026
Merged

fix(security): reject underscore HTTP headers (closes #578)#605
s2x merged 1 commit into
masterfrom
fix/issue-578-reject-underscore-headers

Conversation

@s2x

@s2x s2x commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

Description

Closes #578.

RequestConverter previously converted both dash and underscore header names to the same HTTP_* server key. An attacker could use X-Forwarded_For to override a trusted proxy's X-Forwarded-For value or bypass proxy header stripping.

Changes

  • Discard header names containing _ before constructing Symfony's server bag.
  • Log each dropped header name once per worker at warning level.
  • Preserve dash-spelled headers and CGI CONTENT_TYPE, CONTENT_LENGTH, and CONTENT_MD5 handling.
  • Add trusted-proxy, header-stripping, logging, documentation, changelog, and benchmark coverage.

Verification

  • composer lint passed.
  • composer test passed: 1583 tests, 13378 assertions, 18 skipped.
  • vendor/bin/phpbench run benchmarks/RequestConverterBench.php --report=aggregate passed.
  • composer test:coverage could not run the coverage gate because this environment has no PCOV/Xdebug driver.

Code Review

  • Reviewed the final diff for security, edge cases, style, and test coverage.
  • Addressed local lint/static-analysis findings.

@s2x s2x self-assigned this Aug 3, 2026
@s2x
s2x merged commit 2ba2b1f into master Aug 3, 2026
12 checks passed
@s2x
s2x deleted the fix/issue-578-reject-underscore-headers branch August 3, 2026 17:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Security] X-Forwarded_For collides with X-Forwarded-For in the $_SERVER bag — client-IP spoofing and proxy header-strip bypass

1 participant