-2

これは質問というより警告ですが、誰かがより良い解決策を提供できるかもしれません。

Android アプリケーションからカスタム リクエスト ヘッダーを送信しています。リクエストが PHP サーバーに届くと、このヘッダーとその値の存在を確認します。これを行うには、 でヘッダー配列を取得し、 でヘッダーapache_request_headers()のチェックを行いarray_key_exists()ます。

ただし、falsearray_key_exists('custom-header', $Hdr)を返します! したがって、配列をprint_rでダンプすると、見よ、配列キーが配列に存在します。出力は次のとおりです。

Array
(
    [Accept-Encoding] => gzip
    [Connection] => Keep-Alive
    [Content-Type] => application/x-www-form-urlencoded
    [Content-Length] => 103
    [Host] => www.somedomain.com
    [custom-header] => my-custom-header-value
)

どうやってこれを回避しましたか?

次のように配列を複製します。

// recuperate the request headers
$Hdr = apache_request_headers();

// clone the array as it will not correctly search with array_key_exists
$Keys = array_keys($Hdr);
$Values = array_values($Hdr);
$Headers = array();
for($i = 0; $i < count($Keys); $i++)
{
    $Headers[$Keys[$i]] = $Values[$i];
}

で新しい配列をクエリするとarray_key_exists('custom-header', $Headers)、 true が返されます!

これは既知の問題ですか?

より良い解決策はありますか?

コードを保護するために実際の値の名前を変更しました。これは例としてここに示されています-これらの値の修正を投稿しないでください:-)

編集:これは、Apache バージョン 2.2.22 で PHP バージョン 5.3.10 を実行している共有サーバーで発生します。

4

2 に答える 2

1

サンプルデータが与えられた場合

Array
(
    [Accept-Encoding] => gzip
    [Connection] => Keep-Alive
    [Content-Type] => application/x-www-form-urlencoded
    [Content-Length] => 104
    [Host] => androidgmap.letrajet.com
    [User-Agent] => LeTrajet Edition Cèdre
    [letrajet-sig] => 32dbc2........
)

これには、小文字のヘッダー名と「è」文字の 2 つの問題が含まれており、リクエストや比較コードで適切にエンコードされる場合とされない場合があります。確認するには詳細が必要ですが、これは次のとおりです。

key is missing : false
MyUserAgent == 'LeTrajet Edition Cèdre' : false

「è」文字に文字セットの問題がある疑いがあります。比較を行うPHPコードでそれを修正する必要があります。ただし、この問題はデータに関するものであり、ヘッダー キーに関するものではありません。

コードにもこれがあります:

else if($MyUserAgent == "LeTrajet Edition Cedre"

あなたのデータにCèdreが含まれている場合、どのように一致しますか?

編集:OPからのコメントに従って署名を切り捨てました。

于 2012-08-29T14:50:31.113 に答える
1

コード例に従ってください:

$Hdr = apache_request_headers();

$Keys = array_keys($Hdr);
$Values = array_values($Hdr);
$Headers = array();
for($i = 0; $i < count($Keys); $i++)
{
    $Headers[$Keys[$i]] = $Values[$i];
}

var_dump($Hdr === $Headers); # true

$Hdrと等しいと結論付けることができ$Headersます。(なぜそうではないだろう)

array_key_existsは大文字と小文字が区別されるためCustom-Header、 とcustom-headerは同じキーではないことに注意してください。

試してみてください:

array_key_exists('custom-header', array_change_key_case($Hdr));

または、コードを少し変更します。

$Hdr = apache_request_headers();
$Headers = array();
foreach($Hdr as $Key => $Value)
{
    $Headers[strtolower($Key)] = $Value;
}
于 2012-08-29T14:13:31.777 に答える