【问题标题】:How should I track down PHP Warning: Input variables exceeded 1000我应该如何追踪 PHP 警告:输入变量超过 1000
【发布时间】:2013-10-08 23:44:49
【问题描述】:

我有一个流量比较大的网站,每天大约会产生一次错误信息:

PHP 警告:未知:输入变量超过 1000。增加限制更改 php.ini 中的 max_input_vars。在第 0 行的未知中

我的猜测是,它是由一些爬虫找到了一个永无止境的 URL 链接结构引起的。但是,我在访问日志中找不到任何会出现问题的内容(例如,具有 1000 多个获取参数的 url)。

是否有一种简单的方法可以深入了解此警告?它发生在加载任何 php 脚本之前,所以我认为不可能用 php 进行内省。如果我有 URL 等简单的细节,就很容易解决。

【问题讨论】:

  • 也许有人正在向您的脚本/文件之一发送包含许多变量的 POST 数据。找出 PHP 警告的时间,然后查看您的访问日志。然后也许你会找到你的文件和人/爬虫的 IP 地址或其他任何东西。
  • 这可能是一次未遂的(愚蠢的)攻击。
  • 在那个警告之后没有引用行吗?比如:referer: http://example.com/dir/file.php

标签: php


【解决方案1】:

如果它只是偶尔发生并且可能还会影响最终用户,那么just raise the limit 实际上是相当安全的 - 这是出于实际原因而施加的限制,以规避可能的攻击。

实际上,为了调试它,我会深入研究边缘情况。在现实世界的场景中,我确实希望这个错误只会在某些东西无限嵌套时发生。我会在始终包含的代码中的某处插入一个小的检测脚本,例如:

function detectLargeInputs($name, $array)
{
  if(count($array) > 500)
    mail('mymail@domain.tld', 'Large input in '.$name, 
         print_r($array, true).print_r($_SERVER, true));
}
detectLargeInputs('GET', $_GET);
detectLargeInputs('POST', $_POST);
detectLargeInputs('COOKIE', $_COOKIE);

这应该会在一天内显示问题,包括 $_SERVER 信息,其中还包含 REQUEST_URIHTTP_REFERER 等字段,这应该可以帮助您准确定位问题。

【讨论】:

  • 感谢您的建议。这肯定会奏效。出于某种原因,我没有想到这只是一个警告而不是错误,所以 php 代码实际上正在运行。我能够通过使用时间戳来追踪错误,尽管这并不容易,因为大约有 50 个 RPS。问题是 POST 数据,这是一个 javascript 错误日志记录。某人的浏览器有一个插件会生成 1000 多个 javascript 错误,并且它正在重载 js 错误日志记录脚本。
  • 实际上我也认为这是一个错误 - 这就是为什么我将邮件阈值设置为 500 而不是 1000 :) 很高兴知道它已修复。
【解决方案2】:

注意!如果输入变量在子数组中,则此检测不会发出警报: 大批 ( [富] => 100 [条] => 数组 ( [0] => 1111 [1] => 1111 ...(超过 1000 个) ) )

'count' 的返回值为 2,看起来一切正常,但 PHP 不会处理子数组中超过 1000 个的值。

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多