SoftBank 920Pの罠

久々の更新。
とあるシステムを作っていたとき偶然発覚したので、メモ。

SoftBank920Pで、ある条件が成立される時に
リダイレクトがPOSTで行われるという問題。

詳しくは以下参照

SoftBank 920Pの挙動に注意する

うちも同じくこのような問題が発生したので、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は端末依存が激しくて困る。。