PHP中捕获eval执行输出并仅显示$B内容的解决方案
解决方案
要解决重复输出的问题,关键是在eval执行前就开启输出缓冲,这样eval产生的输出会被捕获到缓冲里,不会直接输出到页面,之后我们获取缓冲内容到$B,再清空缓冲,最后只打印$B就不会重复了。
修改后的代码如下:
<?php ob_start(); // 提前开启输出缓冲,捕获后续所有输出 $A = '<?php echo "Output"; ?>'; eval(" ?> $A <?php "); $B = ob_get_contents(); // 获取缓冲内容 ob_end_clean(); // 清空缓冲并不输出,避免之前的内容泄露 echo $B; // 只打印一次$B的内容 ?>
为什么这样有效?
ob_start()会开启输出缓冲,后续所有本应直接输出的内容都会被暂存到内存缓冲区里,不会直接发送到浏览器。ob_end_clean()会清空当前的输出缓冲,并且关闭缓冲,这样eval执行产生的内容就不会被意外输出,我们只保留了存到$B里的内容。- 最后只执行
echo $B,自然就只会输出一次想要的内容。
内容的提问来源于stack exchange,提问作者ReflectYourCharacter
相关产品推荐
相关产品推荐

