我在 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 提交错误报告一旦修复,便会进行更新。