【问题标题】:Trapping line of code that emits first character捕获发出第一个字符的代码行
【发布时间】:2017-09-22 08:11:09
【问题描述】:

突然间,应用程序不再能够输出 ZIP 文件。检查发现原因:ZIP 的第一个字符是空白,这违反了 ZIP 格式规范。

为了追踪这个问题,我启用了 CStatementTracer,它将每行执行的代码打印到日志文件中。没有帮助。 [备注:declare(ticks=1);似乎没有捕获每一行执行的代码]

然后我像这样设置一个输出处理程序:

function callback( $buffer )  {

    $deb = print_r( debug_backtrace(), TRUE );
    file_put_contents( './statementTrager.log', $deb );

    return $buffer;

}

ob_start("callback", 1 );

不幸的是,这个处理程序根本没有被调用。

问:是否存在通用/规范的解决方案,它标识发出第一个字符的 PHP 代码的文件/行。

一种解决方案,无论其他代码执行什么,它都能找到 loc。

备注:

  • 使用?> 甚至没有关闭一个 PHP 文件

同时我发现了类似代码的可疑之处:开始前的空白

不过,我想获得有关程序化解决方案的提示。最好是用纯 PHP 编写的解决方案。

【问题讨论】:

  • 如果突然停止工作,首先要检查的是发生了什么变化。首先 - 检查问题是否可以在新环境中重现以确认它是应用程序,而不是第 3 方,然后检查 VCS 并找到它停止工作的提交。一个空白字符可能来自 php 周围的代码 - 来自 any 包含文件的 <?php 标记之前或之后的空格。
  • headers_sent(&$file, &$line) ?
  • 如果没有像 html 这样的输出,请删除文件末尾的任何关闭 ?>。一个小空格可能会输出,把所有东西都搞砸了。

标签: php ob-start


【解决方案1】:

https://linux.die.net/man/1/strace 可能是找出输出来源的最可靠工具。假设你在 Linux 上。其他平台一定有类似的工具。

虽然它不会给你这行 php 代码,但你可以分析在发送攻击性字符之前和之后进行的系统调用的上下文。通常只要确定问题的根源就足够了。

虽然这是一个相当耗时的过程。应该作为最后的手段。

【讨论】:

  • 谢谢。但可能它输出的信息太多了。不幸的是,我现在在窗户上。然而,一个很好的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2012-08-09
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多