PIYO - Tech & Life -

apache + passengerの環境でアンダースコア区切りのHTTPヘッダーが届かない

HTTP Rails Apache

iOSアプリからリクエストヘッダーに情報を追加して送る、みたいなことをやろうとして少しはまりました。

受け取る人はRailsアプリです。ローカルで開発しているときには問題なかったのにAWS上のapache + passengerの環境にデプロイしたら当該ヘッダー情報が抜けてました。

環境依存っぽいのでapacheかpassengerを疑って色々調べていると、最終的には

Starting with version 2.4, Apache is more strict about how HTTP headers are converted to environment variables in mod_cgi and other modules: Previously any invalid characters in header names were simply translated to underscores. This allowed for some potential cross-site-scripting attacks via header injection (see Unusual Web Bugs, slide 19/20).

という、Apacheのドキュメントに到達。

https://httpd.apache.org/docs/trunk/en/env.html#fixheader

該当箇所をGoogle翻訳するとこんな感じ。

2.4より、Apacheはmod_cgiや他のモジュールでHTTPヘッダーを環境変数に変換する方が厳密です。以前はヘッダ名の無効な文字はすべて下線に変換されていました。 これにより、ヘッダインジェクションによるいくつかのクロスサイトスクリプティング攻撃が可能になりました(Unusual Web Bugs、slide 19/20を参照)。

まあつまりアンダースコアが入ってるのはおかしいと判定するみたいですね。まさにアンダースコアをうっかり使っちゃってたのでRailsまで届いてないのは当然っちゃ当然だったわけです。

ちなみに、Rails側でちゃんとヘッダーが来ているかどうかを見るために↓のURLを参考にしてログに出力して確認しました。

https://xyk.hatenablog.com/entry/2015/02/01/181648
request.headers.sort.map { |k, v| Rails.logger.info "#{k}:#{v}" }