我在自定义构建的CMS中使用Redactor编辑器。Redactor有一个选项phpTags
,当设置为true
时,允许输入PHP代码并将其作为内容的一部分保存。
问题是,这个PHP代码被视为文本,而不是PHP代码,并且被转义而不是被处理。
例如,如果我在编辑器中输入以下内容:
<?php echo date('Y'); ?>
代码不是显示年份,而是在页面的标记中注释掉,如下所示:
<!--?php echo date('Y'); ?-->
我该如何防止这种情况发生?要确保PHP代码被服务器这样处理/解释吗?
我可能应该提到,有很多人使用这个CMS,所以没有办法提前知道可能添加了什么PHP代码。
也许
<!-- <?php echo date('Y') ?> -->
您不能像现在这样更改PHP的打开/关闭标记,除非重新编译PHP。如果您想隐藏php的输出,那么用html注释标记包围整个php代码块。
PHP不会在意html注释。它根本不在乎它嵌入了什么。你可以把一个PHP代码块塞进.jpg文件的中间,它仍然会执行,只要网络服务器被配置为通过PHP解释器运行.jpg文件。
为了解决这个问题,我将之前刚刚通过echo
显示的内容保存到一个临时文件中。
然后,我打开输出缓冲,将该临时文件包含在PHP脚本中,并通过ob_get_contents()
获取其内容。
这使我能够显示其中所有PHP都已解析的内容。这是供参考的代码:
// Create path to temporary file
$tmpPath = '/temp.php';
// Set file variable to null for error checking
$tmpFile = NULL;
// Try creating the temporary file
if ( $tmpFile = fopen($tmpPath, 'w') ) {
if ( fwrite($tmpFile, $postContent) === FALSE ) {
// Do something if the file can't be written to
} else {
// Close file
fclose($tmpFile);
}
}
// Start output buffereing
ob_start();
// Include the temporary file created above
include $tmpPath;
// Save buffered contents to a variable
$content = ob_get_contents();
// End output buffering
ob_end_clean();
// Display content
echo $content;
我很感激对我的问题的各种评论,因为它帮助我朝着正确的方向去解决这个问题。