如何解决使用 quercus 在 tomcat 上运行 mediawiki 时出现的 php 警告

如何解决使用 quercus 在 tomcat 上运行 mediawiki 时出现的 php 警告

我在 Tomcat 7 上安装了带有 quercus (4.0.25) 的 mediawiki (1.19.2)。安装过程顺利,没有错误或警告,数据库连接正常,并且在安装过程结束时,我根据要求将 LocalSettings.php 复制到 mediawiki 基础文件夹中。

从那时起,我在每个 mediawiki 页面顶部多次收到以下 php 警告:

webapps\mediawiki\includes\Message.php:388: Warning: function 'htmlspecialchars' called with 4 arguments, but only expects 3 arguments [htmlspecialchars]

消息.php:

365:/**
366: * Returns the message parsed from wikitext to HTML.
367: * @return String: HTML
368: */
369:public function toString() {
370:    $string = $this->getMessageText();
371:
372:    # Replace parameters before text parsing
373:    $string = $this->replaceParameters( $string, 'before' );
374:
375:    # Maybe transform using the full parser
376:    if( $this->format === 'parse' ) {
377:        $string = $this->parseText( $string );
378:        $m = array();
379:        if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
380:            $string = $m[1];
381:        }
382:    } elseif( $this->format === 'block-parse' ){
383:        $string = $this->parseText( $string );
384:    } elseif( $this->format === 'text' ){
385:        $string = $this->transformText( $string );
386:    } elseif( $this->format === 'escaped' ){
387:        $string = $this->transformText( $string );
388:        $string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
389:    }
390:
391:    # Raw parameter replacement
392:    $string = $this->replaceParameters( $string, 'after' );
393:
394:    return $string;
395:}

谁能告诉我这是否是一个严重警告或者是否可能存在版本冲突(最新的 mediawiki 不能与 quercus 一起使用)?

这个警告是否可能由于错误的编码而产生(我在设置中选择了 utf-8)?

如果没有解决方案,有没有办法摆脱这个特殊警告(据我目前所见,mediawiki 似乎运行良好)?

答案1

根据PHP 手册, html特殊字符接受 4 个参数,其中 3 个是可选的。

这表明 Quercus 是 PHP 的不完整实现。

PHP 中的警告通常表示它将继续运行并执行其所能执行的操作。据推测,在这种情况下,它的行为就像它被设置为 true 一样,因此它将对任何现有实体进行双重编码。

如果第 388 行的第四个参数(以及使用四个参数调用此函数的其他每个地方)设置为 true,则可以忽略此警告。

如果它设置为 false(现在代码在你的问题中,我可以看到它),您很可能会发现 wiki 的 html 中存在双重编码实体。这可能会导致显示问题,并且可能会损坏链接。

我心中更紧迫的问题是如何Quercus 不完整吗?有多少其他函数的工作方式与原生 PHP 不同?

如果这是面向公众的,则可能会存在功能不完整的安全问题(htmlspecialchars_decode()例如,等效问题可能允许 XSS)。

至于如何解决警告,正确的方法是向 Caucho 提交错误报告一旦修复,便会进行更新。

相关内容