我知道一个E_WARNING
是由PHP产生
PHP的警告:未知:输入变量超过1000
但是,如何才能在我的脚本检测呢?
我知道一个E_WARNING
是由PHP产生
PHP的警告:未知:输入变量超过1000
但是,如何才能在我的脚本检测呢?
A “足够接近”的方法是检查if( count($_POST, COUNT_RECURSIVE) == ini_get("max_input_vars"))
这将导致假阳性,如果POST数量瓦尔恰好是准确的限制,但考虑到默认限制为1000,它不可能永远是一个问题。
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;
}
什么工作对我来说是这样的。 首先,我把这个在我的脚本/处理器/前端控制器的顶部。 这是错误将被保存(或$ 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的规格,这是一个警告不是错误。
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.';
呼叫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()
但应该是很容易适应。
我不知道是否有可能通过这种方法被逮住其他预执行错误。
什么类似的东西:
$num_vars = count( explode( '###', http_build_query($array, '', '###') ) );
你可以重复它都为$_POST
, $_GET
, $_COOKIE
, 等等 。
仍然不能保证100%准确,但我想它变得非常接近它。