警告:输入变量超过1000

时间:2013-05-09 20:28:58

标签: php json

我正在PHP中构建一个类似RESTS的服务,它应该接受一个大的JSON帖子作为主要数据(我发送和读取的数据很像这里讨论的那样:http://forums.laravel.io/viewtopic.php?id=900

问题是PHP给了我以下警告:

<b>Warning</b>:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in <b>Unknown</b> on line <b>0</b><br />

有没有办法让PHP不计算输入变量(或者我应该只是压制启动警告)?

9 个答案:

答案 0 :(得分:14)

出了点问题,你不需要1000个变量。重新编程您的程序以接受1个具有1000个键的变量数组。这是错误是警告你,你没有按照推荐的方式做事。不要以任何方式禁用,扩展或隐藏它。

答案 1 :(得分:10)

我发现直接在PHP中处理json数据的正确方法(通过file_get_contents('php://input'))是为了确保请求在HTTP请求标头中设置正确的内容类型,即Content-type: application/json。 / p>

在我的情况下,我使用curl从这个代码请求php的页面:

function curl_post($url, array $post = NULL, array $options = array()) {
  $defaults = array(
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_URL => $url,
    CURLOPT_FRESH_CONNECT => 1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FORBID_REUSE => 1,
    CURLOPT_TIMEOUT => 600
  );
  if(!is_null($post))
    $defaults['CURLOPT_POSTFIELDS'] = http_build_query($post);
  $ch = curl_init();
  curl_setopt_array($ch, ($options + $defaults));
  if(($result = curl_exec($ch)) === false) {
    throw new Exception(curl_error($ch) . "\n $url");
  }
  if(curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) {
    throw new Exception("Curl error: ". 
      curl_getinfo($ch, CURLINFO_HTTP_CODE) ."\n".$result . "\n");
  }
  curl_close($ch);
  return $result;
}

$curl_result = curl_post(URL, NULL,
    array(CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
      CURLOPT_POSTFIELDS => json_encode($out))
    );

请注意CURLOPT_HTTPHEADER => array('Content-Type: application/json')部分。

在接收方,我使用以下代码:

$rawData = file_get_contents('php://input');
$postedJson = json_decode($rawData,true);
if(json_last_error() != JSON_ERROR_NONE) {
  error_log('Last JSON error: '. json_last_error(). 
    json_last_error_msg() . PHP_EOL. PHP_EOL,0);
}

请勿更改max_input_vars变量。由于更改请求以设置正确的标题,因此max_input_vars的问题消失了。显然没有PHP评估设置了某些Content-type的帖子变量。

答案 2 :(得分:5)

根据max_input_vars php.ini中的$_GET角色:

  

可以接受多少输入变量(限制适用于$_POST,   $_COOKIEE_WARNING超全球分开)。使用此指令   减少使用哈希的拒绝服务攻击的可能性   碰撞。如果输入变量多于此指定的输入变量   指令,发出max_input_vars,进一步输入变量   从请求中截断。此限制仅适用于每个嵌套   多维输入数组的级别。

您必须在php.ini中将更大的数字归因于{{1}}。

答案 3 :(得分:3)

实际上,使用max_input_vars文件更改.htaccess正在运行,但您需要重新启动Apache服务。

遵循完整的流程:

  1. 转到C:\xampp\apache\conf\httpd.conf
  2. 打开文件httpd.conf
  3. 在文件中查找xampp/htdocs
  4. 稍微低一点,您可能会看到如下所示的行:AllowOverride
  5. 如果此行在#之前显示AllowOverride,请删除#
  6. AllowOverride php_value max_input_vars 10000
  7. 之后的下一行
  8. 保存文件并关闭
  9. 最后停止Apache并重新启动(它将在重启apache之后正常工作)

答案 4 :(得分:2)

更改此

; max_input_vars = 1000

到此

max_input_vars = 3000

php.ini 文件中的注释行是

;

答案 5 :(得分:1)

在php.ini中更改max_input_vars并不适合我

使用.htaccess文件更改max_input_vars正在运行。

如果要使用.htaccess文件更改“max_input_vars”,请转到C:\ xampp \ apache \ conf \ httpd.conf文件(在xampp中),在.htaccess文件中添加以下代码。

php_value max_input_vars 10000

答案 6 :(得分:1)

我认为大多数时候不必增加max_input_vars的大小

但要优化代码

从一个ajax请求获取所有结果并将结果发送到另一个ajax请求时,我遇到了这个问题。

所以我要做的是从数据库结果中将数组字符串化

JSON.stringify(totalResults);

在JavaScript JSON.stringify将数组转换为字符串,因此在转换后,我已将该字符串发送到另一个请求,并再次使用json_decode将该字符串解码为数组在PHP中,strong>,

<?php $totalResults = json_decode($_POST['totalResults']); ?>

所以我又得到了那个原始数组,

我希望这可以对某人有所帮助,所以我分享了它,谢谢。

答案 7 :(得分:0)

我遇到了同样的问题。我发现我在 POST 数据中发送了一个 2Mb 的文件,有时它被奇怪地解释为 JSON,它会找到所有这些变量。

我最终使用文件参数发送了信息,但文件内容仍在 POST 数据中。

curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_INFILE, ($fp = fopen("filename.txt", "r")));
fclose($fp);

答案 8 :(得分:-1)

我可以接受PHP具有这样的限制;这确实有道理。我无法接受(这是使我很难认真对待PHP作为一种编程语言的众多原因之一)是处理然后继续使用截断的数据,可能用不完整的数据覆盖良好的数据。是的,在持久保存数据之前,应该另外验证数据。但这只是乞求麻烦。

也就是说,我实施了以下操作来防止这种情况再次发生:

$limit = (int)ini_get('max_input_vars');
if (count($_GET) >= $limit) {
    throw new Exception('$_GET is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
if (count($_POST) >= $limit) {
    throw new Exception('$_POST is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}
if (count($_COOKIE) >= $limit) {
    throw new Exception('$_COOKIE is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
}

请注意,截断不一定在限制处发生。我的限制设置为默认值1000,但是$_POST仍然有1001个元素。