【问题标题】:PHP: if ($Name=='ProxiedIP') leads to 500 (Internal Server Error)PHP: if ($Name=='ProxiedIP') 导致 500(内部服务器错误)
【发布时间】:2023-03-22 21:20:01
【问题描述】:

这个问题可能太晦涩难懂了,但我已经解决了一个令人费解的服务器错误几个小时,并将其归结为最奇怪的问题;在这一点上,我只想知道是否有人曾经发生过类似的事情,或者可能对可能发生的事情有任何见解。

以下代码行触发了错误:

if ($Name=='ProxiedIP') { return true; }

这个版本运行完全没有问题:

if ($Name=='proxiedIP') { return true; } 

令牌'ProxiedIP'似乎以某种方式弄脏了一些东西,但我什至无法想到解析器将如何翻译字符串文字,从而使服务器像这样挂起。顺便说一句,我确定 $Name!='proxiedIP'$Name!='ProxiedIP'

这是 apache 错误日志中的条目:

[Fri Jan 18 18:15:12.924419 2013] [core:error] [pid 27676:tid 3427232831232] [client 12.345.67.890:34482] Premature end of script headers: index.php, referer: http://mySite.com/

我搜索了“ProxiedIP”作为我系统上我能想到的每个组件的关键字,但我一无所获。不过,对我来说更重要的问题是字符串如何以某种方式在比较检查中产生这种影响。有什么想法吗?


另外值得注意的是,PHP 错误日志对此完全保持沉默。我在页面顶部启用了错误输出,但脚本从未完成加载,因此这可能是一个因素。我是这样设置的:

error_reporting(E_ALL);
ini_set('display_errors', 1);

因为代码工作 here,它似乎更有可能是特定于平台实现的东西。我在 Gandi.net 的“简单托管”服务的实例上运行它,该服务运行 Varnish 以加速应用程序。值得一提的是,代码正在加载到单独域中的 iframe 中。

我也在对标题做一些密集的工作,这似乎是问题的最大潜在根源,尽管就我而言奇怪的是触发错误的方式。此外,我知道没有一个名为“ProxiedIP”的通用标头,尽管到目前为止,使用冲突似乎是唯一有意义的事情。无论如何,我没有看到它。

对我来说,真正相关的是字符串比较导致服务器崩溃的事实。我已经用 PHP 编程超过 10 年了,以前从未发生过这样的事情。我正在尝试了解它是如何发生的背后的后勤工作。


更新:我尝试了以下变体,但仍然产生相同的结果:

if ($Name === (strtoupper("p").'roxiedIP')) { return true; }

有人问我是否会发布完整的代码,但 iframe 端的脚本有 1400 多行,所以这并不可行。我正在调整相关片段以尝试在新脚本中运行它,并将发布结果。

【问题讨论】:

标签: php string http-headers self-reference


【解决方案1】:

我认为问题出在变量 $Name 上。检查它是否被正确分配。还要检查导致问题的 if 语句之后的代码。

【讨论】:

    【解决方案2】:

    实际上,我认为您的问题在于调用函数,即根据返回值,它会做一些“愚蠢”的事情并且 PHP 崩溃。 尝试用硬return truereturn false 替换 if() 看看会发生什么。

    【讨论】:

    • 它工作的情况(小写p)表明它可以很好地处理返回值。
    • 很好的洞察力,但稍微修改的版本完全没有问题返回。顺便说一句,我确定 $Name!='proxiedIP'
    【解决方案3】:

    正如我从你的错误中得到的,你正在搞乱框架,你的 if 的变化会在 fw 允许输出之前触发一些输出被调用。仔细看一下,你上错车了,那不是错误的原因,它是fw不神圣状态的开始。

    尝试在 php 调试器中运行脚本,而不是使用 var dump。

    【讨论】:

    • 我同意这似乎是最可能的原因。我正在尝试在更受控制的条件下重新创建序列,但到目前为止还没有成功。值得注意的是,我正在使用的没有名为“ProxiedID”的标头,但这似乎是迄今为止最好的线索。
    • 刚刚对您的问题有了一个想法,我曾经遇到过一种情况,即应该包含刺痛的变量包含一个对象。尝试对变量进行 var_dump 以查看它在崩溃时包含的内容。
    【解决方案4】:

    感谢您的帖子,但事实证明这是一个非常复杂的场景,函数链下几个级别的条件会导致超出任一相关函数范围的意外行为。

    实际问题是由于在一个完全独立的进程中解析 debug_backtrace() 数组的输出时进行了条件检查,具有讽刺意味的是,这是为了防止无限递归,而是触发了类似的破坏性级联事件,这些事件超出了分配的内存限制。

    我最初发帖是因为我对真正似乎是字符串文字比较做一些我认为不可能的事情感到困惑,并且想了解如果是这样的话,什么条件可以允许它发生。我很高兴原因实际上并不是它看起来的那样。感谢您帮助解决难题。


    更新:错误的真正根源在于 PHP 难以翻译包含对其自身的引用的对象或数组。我正在存储转换后的标头、直接标头引用、$_REQUEST[] 和 $_SERVER[] 项,以及在复杂的关联数组中记录消息和相关数据。这些项目之间有很多动态引用,尤其是那些涉及我使用的原生 PHP 全局变量的引用。

    PHP 有traditionallyproblems 管理自引用实体,尽管已经进行了改进,但我的特殊情况足够复杂,以至于在尝试映射这些对象时将ReflectionClass 发送到无限循环中。我在轮询项目时通过手动dereferencing 修复了它,但如果需要在一个公共数组或引用结构中使用多个与 $GLOBALS 相关的变量,则需要注意这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2013-08-11
      • 2012-03-29
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多