SoftBank 920Pの罠
久々の更新。
とあるシステムを作っていたとき偶然発覚したので、メモ。
SoftBankの920Pで、ある条件が成立される時に
リダイレクトがPOSTで行われるという問題。
詳しくは以下参照
うちも同じくこのような問題が発生したので、920Pを購入してもらい色々テストを行ってみました。
検証1:httpな1.phpからhttpな2.phpへクエリ付でリダイレクト
2.phpは以下検証全て同一コード
【2.php】
<html> <head> <title>test</title> </head> <body> <pre> <?php echo 'REQUEST_METHOD::'.$_SERVER['REQUEST_METHOD'].PHP_EOL.PHP_EOL; echo "\$_GET".PHP_EOL; echo "-----------------------------".PHP_EOL; var_dump($_GET); echo PHP_EOL.PHP_EOL; echo "\$_POST".PHP_EOL; echo "-----------------------------".PHP_EOL; var_dump($_POST); ?> </pre> </body> </html>
検証コード1
【1.php】
<?php header('Location: http://www.example.com/2.php?foo=bar'); ?>
以下出力結果
REQUEST_METHOD::GET
$_GET
-----------------------------
array(1) {
["foo"]=>
string(3) "bar"
}
$_POST
-----------------------------
array(0) {
}
これはまぁ問題ない、正常動作を確認。
では、次へ。
検証2:httpな1.phpからhttpsな2.phpへクエリ付でリダイレクト
検証コード2
【1.php】
<?php header('Location: https://www.example.com/2.php?foo=bar'); ?>
以下出力結果
REQUEST_METHOD::GET
$_GET
-----------------------------
array(1) {
["foo"]=>
string(3) "bar"
}
$_POST
-----------------------------
array(0) {
}
これも問題なかった、次へ。
検証3:httpな1.phpにPOSTメソッドでアクセスした際、httpsな2.phpへクエリ付でリダイレクト
検証コード3
【1.php】
<?php if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') === 0) { header('Location: https://www.example.com/2.php?foo=bar'); } ?> <html> <head> <title>test</title> </head> <body> <form method="post" action="a.php"> <input type="submit" value="test" /> </form> </body> </html>
以下出力結果
REQUEST_METHOD::POST
$_GET
-----------------------------
array(1) {
["foo"]=>
string(3) "bar"
}
$_POST
-----------------------------
array(0) {
}
ここで問題発生、REQUEST_METHODはPOSTなのに値は$_GETに入っている。
これは厄介…。
ちなみに検証4としてhttpsな1.phpにPOSTメソッドでアクセスした際、httpsな2.phpへクエリ付でリダイレクトでは正常にGETに値が入っていました。
ほんとにSoftBankは端末依存が激しくて困る。。