概要
PHPの
$_SERVER["REQUEST_URI"]
には
/path/file?one= ~ そこそこ長い ~ &two=hogehoge
、
["QUERY_STRING"]
にもone= ~ そこそこ長い ~ &two=hogehoge
と格納されているのに、
$_GET
には["two"]
しかない!という現象が起きた。
そう言えばGETにはリクエストの長さ制限があったなあーと初心に返ったのだが…
問題はブラウザやApacheではなかった。
結論
; suhosin.get.max_value_length
; ----------------------------
; * Type: Integer
; * Default: 512
;
; Defines the maximum length of a variable that is registered through the URL.
;
;suhosin.get.max_value_length = 512
;
おそらく守護神が主犯。
セキュリティの宿命ですが、Composer止められたり、いい思い出が無いぞ。
受け手のライブラリ、Apache、ブラウザ、HTTP、エンコード、圧縮、PHP、特殊文字などいろいろ思い浮かんで難しいぞ。
調査方法
- 「GET パラメーター 長さ」などでググる。
ブラウザ、Apacheなどのよく遭遇しそうなのが出る。 - Apacheの長さ制限(LimitRequestLine)はデフォルトでも手動で設定しても問題無い長さなのに解消しない。
- パラメーターの文字列を短くし、問題の解消を確認。
- 一文字ずつ追加し、消える直前のlengthを測る→512。
- 「get param 512」などでググる。
- suhosinっぽいよ。
- suhosinオフにしたら解消したよ。(apacheのrestartを忘れずに)