0

私はこの問題を 12 時間以上調査してきましたが、成功していません。

政府系クライアント向けに構築した大規模なカスタム CMS があります。ソフトウェアは PHP 5.3.3 で開発されました。最初のデプロイは PHP 5.2.2 で行われたため、いくつかの問題が発生しましたが、最終的にサーバーを PHP 5.3.8 にアップグレードしました。サーバーにデプロイされるバージョンを正確に制御することはほとんどできません。

ショーストッパーの問題が発生しました。最大 5 レベルの深さのネストされた配列を持つ大きなフォームを POST 経由で送信する AJAX リクエストがあります。これは数か月間うまく機能していましたが、突然、新しい PHP インストールを使用すると、$_POST 変数内のデータの部分的なデコードしか得られなくなりました。php://input を調べて、PHPがすべてのデータを受信して​​いることを確認しました(データがブラウザからFirebug経由で送信されていることも確認しました)。

これは、デコードされた出力として受け取っているものです (var_dump を介して、簡潔にするために短くしました。これで良いアイデアが得られるはずです)。

Array
(
    [db_required_fields] => Array
        (
            [awr_title] => Array
                (
                    [en] => phil test eng
                )

        )

    [subtitle_intro] => Array
        (
            [awr_subtitle] => Array
                (
                    [en] =>
                )

        )
[products] => Array
    (
        [cp_recall] => Array
            (
                [1] => Array
                    (
                        [product_common_name] => Array
                            (
                                [en] =>
                            )

                    )

            )

        )
)

不足しているもの: [en] のそれぞれには、ピア [fr] 配列インデックス エントリが必要です。たとえば、[fr] phil test fr エントリが必要です。2 番目のアレイ レベルの他のいくつかのインデックス エントリが欠落しています。リクエスト データ自体はそれほど大きくなく、およそ 6 ~​​ 7Kb です。

私が行ったこと: - suhosin は、同様の問題の原因としてよく言及されていたため、無効にしました。- phpinfo(); を調べました。動作中のサーバーと現在動作中のサーバーの両方から、関連する違いを特定しようとしています。- 物事に影響を与える可能性のあるすべてのモジュールとオプションを調査しました (mbstring など)。

現在、php://input データ用の独自のパーサーを作成することを検討していますが、これには (潜在的に隠された) 危険が伴うようです。

提案やヒントはありますか?

4

3 に答える 3

2

投稿データを送信する前にシリアル化することをお勧めします。そして、1 つの「フィールド」に JSON の 1 つの文字列として送信します。このようなもの:

$.ajax({
    type: 'POST',
    url: 'YOUR URL',
    data: {
        json: JSON.stringify(form_data) // Where form_data is the JSON object.
    },
    success: function(response)
    {
        // Do stuff.
    }
});

次に、サーバー側で、次のように json_decode を実行します。

<?php

$_POST = json_decode($_POST['json'], true);

?>

編集:

アンシリアライズする代わりに json_decode が必要です。おっと。

于 2012-05-18T00:02:17.820 に答える
1

新しい PHP 構成変数max_input_nesting_levelまたはmax_input_vars (特に後者) の影響を受けている可能性があります。PHP が一部の入力を無視し始めないように、より高い値に設定してみてください。

于 2012-05-18T15:47:22.500 に答える