【问题标题】:POST without line feed fails, but with line feed works?POST 没有换行失败,但换行有效?
【发布时间】:2015-07-24 02:04:47
【问题描述】:

我正在调试一个 PHP 应用程序,我必须将一些数据发布到我的服务器,然后解析它并返回一些值——超级简单的东西。

数据格式为:

action=display_all_pols&donate_form=1&user_state=&state=AK&pols[LA][0][post_id]=2714&pols[LA][0][first_name]=Ralph&pols[LA][0][last_name]=Abraham &pols[LA][0][profile_image]=2762

我的数据大小不一,例如187 字节,更大的,例如46KB。

我注意到我的应用程序未能正确解析 POST。代码是这样的:

function Foo() {
    $state = somehow_get_state();
    $bar = $_POST['pols'][$state];
    // cool logic and stuff

我立即在Foo() 中添加了die(var_dump($_POST));,并注意到实际上只有一部分数据被发布了。

当我在命令行上对此进行测试时,我注意到以下两者之间的区别:

POST http://10.1.10.22/wesupportthat/wp-admin/admin-ajax.php
action=display_all_pols&donate_form=1&user_state=&state=AK&pols[LA][0][post_id]=2714&pols[LA][0][first_name]=Ralph&pols[LA][0][last_name]=Abraham &pols[LA][0][profile_image]=2762

还有这个(注意换行);

POST http://10.1.10.22/wesupportthat/wp-admin/admin-ajax.php
action=display_all_pols&donate_form=1&user_state=&state=AK&
pols[LA][0][post_id]=2714&
pols[LA][0][first_name]=Ralph&
pols[LA][0][last_name]=Abraham&
pols[LA][0][profile_image]=2762

前者只会 POST 大约 3.1KB 的数据,而后者会 POST 整个数据。

有什么原因吗?我发布了有效的 JSON,为了我的爱,我无法弄清楚为什么一个有效而另一个无效。

为了创建 JSON,我创建了一个嵌套数组,如下所示:

array( // root-level array
    array(
        '1' => 'somestring',
        '2' => '...',
        '3' => '...',
        '4' => '...'
    ),
    array( // same as previous),
    // more arrays, potentially up to 50 total
)

然后调用 json_encode($my_array, JSON_HEX_APOS); 创建 JSON。

我希望这只是一个橡皮鸭时刻。 :-)

编辑:我正在离开我的计算机,但 TCP 捕获显示同样的事情。我回来时还会添加我的 Apache/php 信息。

【问题讨论】:

  • 我对 json 不是很熟悉,所以这可能没有帮助,但我想到了两件事:1:字符串中有一个编码错误的字符,这会破坏它,或者2 字符串中的空格会导致它失败吗? [last_name]=Abraham &pols 注意亚伯拉罕后面的空格...
  • 您可以在将数组编码为 JSON 之前尝试utf8_encode()
  • 了解正在解析的数据部分以及与查询字符串无关的部分将很有帮助。
  • @EternalHour 前 3.1KB。

标签: php json post


【解决方案1】:

如果您使用 suhosin 扩展程序,并且在 /var/log/user.log 中的失败试验后看到这样的行:

suhosin[...]: ALERT - configured POST variable limit exceeded - dropped variable 'x' (attacker 'x.y.z.207', file 'some_script.php')

那么可能是这个扩展程序弄乱了您的请求。在这种情况下,您需要禁用或更新 suhosin 的配置,例如 /etc/php5/conf.d/suhosin.ini

更新或添加这些行:

suhosin.post.max_vars = 3000
suhosin.request.max_vars = 3000

此配置最多允许一个请求中传入 3000 个变量。

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多