在PHP中,我怎么能检测到输入瓦尔被截断由于max_input_vars被超过?(In PHP, h

2019-09-21 20:11发布

我知道一个E_WARNING是由PHP产生

PHP的警告:未知:输入变量超过1000

但是,如何才能在我的脚本检测呢?

Answer 1:

A “足够接近”的方法是检查if( count($_POST, COUNT_RECURSIVE) == ini_get("max_input_vars"))

这将导致假阳性,如果POST数量瓦尔恰好是准确的限制,但考虑到默认限制为1000,它不可能永远是一个问题。



Answer 2:

count($_POST, COUNT_RECURSIVE)是不准确的,因为它计算在数组树的所有节点,而input_vars仅是终端节点。 例如, $_POST['a']['b'] = 'c'具有1个input_var但使用COUNT_RECURSIVE将返回3。

php://input不能与使用enctype="multipart/form-data" 。 http://php.net/manual/en/wrappers.php.php

因为这个问题只能用PHP> = 5.3.9出现的时候,我们可以使用匿名函数。 以下递归计数端子阵列。

function count_terminals($a) {
  return is_array($a)
           ? array_reduce($a, function($carry, $item) {return $carry + count_terminals($item);}, 0)
           : 1;
}


Answer 3:

什么工作对我来说是这样的。 首先,我把这个在我的脚本/处理器/前端控制器的顶部。 这是错误将被保存(或$ E0将是无效的,这是OK)。

$e0 = error_get_last();

然后我跑了一堆其他的处理,自举我的申请,注册插件,建立会话,检查数据库状态 - 很多事情 - 我可以不考虑超出该条件的完成。然后我检查了这$ E0状态。 如果它不为空,我们有一个错误,所以我保释出来(假设程序是有很多的你的魔法中有一个大的类)

if (null != $e0) {
    ob_end_clean(); // Purge the outputted Warning
    App::bail($e0); // Spew the warning in a friendly way
}

调整和对自己的状态调整的错误处理。

注册错误处理程序,因为您的错误处理程序注册之前,它的存在不会赶上这个条件。

检查输入变种数等于最大的是不可靠的。

上述$ E0将是一个数组,类型=> 8,并且线=> 0; 该消息将明确提到input_vars所以你可以正则表达式匹配创建一个非常狭窄的状况,并确保具体案件的积极识别。

还要注意,根据PHP的规格,这是一个警告不是错误。



Answer 4:

function checkMaxInputVars()
{
    $max_input_vars = ini_get('max_input_vars');
    # Value of the configuration option as a string, or an empty string for null values, or FALSE if the configuration option doesn't exist
    if($max_input_vars == FALSE)
        return FALSE;

    $php_input = substr_count(file_get_contents('php://input'), '&');
    $post = count($_POST, COUNT_RECURSIVE);

    echo $php_input, $post, $max_input_vars;

    return $php_input > $post;
}

echo checkMaxInputVars() ? 'POST has been truncated.': 'POST is not truncated.';


Answer 5:

呼叫error_get_last()在你的脚本尽快(你有机会导致错误之前,他们会掩饰这一点。)在我的测试中,max_input_vars警告将如适用在那里。

这里是我的设置为100 max_input_vars测试脚本:

<?php
if (($error = error_get_last()) !== null) {
    echo 'got error:';
    var_dump($error);
    return;
}
unset($error);

if (isset($_POST['0'])) {
    echo 'Got ',count($_POST),' vars';
    return;
}
?>
<form method="post">
<?php
for ($i = 0; $i < 200; $i++) {
    echo '<input name="',$i,'" value="foo" type="hidden">';
}
?>
<input type="submit">
</form>

当VAR限制被击中的输出:

got error:
array
  'type' => int 2
  'message' => string 'Unknown: Input variables exceeded 100. To increase the limit change max_input_vars in php.ini.' (length=94)
  'file' => string 'Unknown' (length=7)
  'line' => int 0

经测试在Ubuntu用PHP 5.3.10和Apache 2.2.22。

我会犹豫明确地检查这个错误的字符串,稳定性(他们可以改变它)和通用PHP很好的做法。 我喜欢把所有的PHP错误到异常,像这种 (单独的子类可能是矫枉过正,但我喜欢这个例子,因为它允许@错误抑制)。这将是从哪里来有点不同error_get_last()但应该是很容易适应。

我不知道是否有可能通过这种方法被逮住其他预执行错误。



Answer 6:

什么类似的东西:

$num_vars = count( explode( '###', http_build_query($array, '', '###') ) );

你可以重复它都为$_POST$_GET$_COOKIE等等

仍然不能保证100%准确,但我想它变得非常接近它。



文章来源: In PHP, how can I detect that input vars were truncated due to max_input_vars being exceeded?