我有一个文件“xxx.php”,其中包含HTML和PHP代码。当我使用include("xxx.php");
时,它很好并且按预期工作。但我正在开发一个我不能使用include的系统,但我可以使用file_get_contents()
。
问题在于,如果我回显了file_get_contents(“xxx.php”),它会显示整个源代码而无需解释PHP。
所以我做了很多研究,发现我可以使用eval()
来运行PHP代码。问题是“xxx.php”有php和HTML代码。我试过了:
eval(file_get_contents("xxx.php"));
但HTML没有显示。 xxx.php的示例:
<?php
echo "HELLO";
?>
<b>HELLO BOLD</b>
<?php
echo "BYE";
?>
问题是eval没有显示任何HELLO!
答案 0 :(得分:2)
echo file_get_contents()
是可以预期的。 f_g_c()不会执行它检索的任何内容。它只是从磁盘中剔除字节并将它们作为字符串返回。这就是你需要eval()
。
同样,当您eval()
代码时,您应该不包含<?php
分隔符。 e.g。
php > eval('2+2;'); // no return, no echo, so no output
php > eval('echo 2+2;');
4
php > eval('<?php echo 2+2;');
PHP Parse error: syntax error, unexpected '<' in php shell code(1) : eval()'d code on line 1
php >
评论跟进:
只需将您提供的任何内容视为eval,就好像它是一个普通的PHP脚本一样,恰好有一个<?php
开场标记应用于它:
php > eval('?> foo <?php echo 2+2;');
foo 4
如果退出PHP模式作为eval块中的第一件事,eval会将该文本视为正常输出,就像一个完整的PHP脚本一样
答案 1 :(得分:2)
在评估之前,先将"?>\n"
添加到PHP代码(进入HTML模式):
eval("?>\n" . file_get_contents("xxx.php"));
并修复CMS中的安全问题,这样您就不必采取如此严厉的措施来躲避脚本小子的攻击。</ p>
答案 2 :(得分:0)
对于<insert diety here>
的爱,不要这样做....但是你的代码失败了,因为你需要从eval的顶部删除<?php
。
Eval期望php代码如此假设为<?php
和?>
。
您在这里所做的不是保护您的网站,而是让它更容易入侵。