0

我一直在研究这个问题超过 12 个小时,但没有成功。

我们有一个为政府客户构建的大型定制 CMS。该软件是在 PHP 5.3.3 上开发的。最初的部署是在 PHP 5.2.2 上完成的,这导致了一些问题,但他们最终将服务器升级到了 PHP 5.3.8。我们几乎无法准确控制将哪些版本部署到他们的服务器上。

我们遇到了一个显示停止器的问题。我们有一个 AJAX 请求,它通过 POST 提交一个大型表单,其中嵌套数组的深度最多为 5 级。这几个月来一直运行良好,但突然使用新的 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] 都应该有一个 peer [fr] 数组索引条目。例如,应该有一个 [fr] phil test fr 条目。缺少第二个数组级别的其他几个索引条目。请求数据本身并不是特别大,大概6-7Kb。

我所做的: - 我禁用了 suhosin,因为它经常被提及为类似问题的原因。- 仔细研究 phpinfo(); 来自工作和现在工作的服务器,试图找出相关的差异。- 调查可能影响事物的每个模块和选项(例如,mbstring)。

我现在正在考虑为 php://input 数据编写自己的解析器,但这似乎充满了(可能隐藏的)危险。

有什么建议或提示吗?

4

3 回答 3

2

我建议在发送之前序列化发布数据。我会将它作为单个 JSON 字符串发送到一个“字段”中。像这样的东西:

$.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_levelmax_input_vars(尤其是后者)的影响。尝试将其设置为更高的值,这样 PHP 就不会开始忽略某些输入。

于 2012-05-18T15:47:22.500 回答
0

请注意,当您想要更改max_input_varsmax_input_nesting_level等设置并且运行Suhosin时,您还需要更改 Suhosin 的这些参数。max_input_vars的示例:

您需要将其添加到 .htaccess 文件中:

php_value suhosin.post.max_vars 4000
php_value suhosin.request.max_vars 4000

您还需要将以下内容添加到您的 php.ini 文件中,以允许更改 .htaccess 中的 suhosin 参数:

suhosin.perdir = "pr"

“p”允许更改“post”设置,“r”用于请求设置。

于 2015-08-14T13:05:19.727 回答