如何在PHP中清除之前回显的项目

60

在PHP中,是否有任何方法可以清除/删除之前输出的所有内容?

例如:

<?php

echo 'a';
print 'b';

// some statement that removes all printed/echoed items

echo 'c';

// the final output should be equal to 'c', not 'abc'

?>
我的脚本使用include函数。被包含的文件不应该输出任何内容。为了防止有人(比如黑客)试图这样做,我需要一种方法来移除它们。

5
如果你把这样做当作“安全措施”,那么你可能是在错误地做事。你应该考虑采用其他方法来解决问题。也许可以创建另一个问题来说明你的问题? - Carlos Lima
我正在使用oci_execute,如果查询失败,它会输出<b>警告</b>信息。但是我正在单独处理错误,并且不希望看到Oracle的消息。因此,在这种情况下,这个问题也适用。 - Adarsha
5个回答

120
<?php

ob_start();
echo 'a';
print 'b';

// some statement that removes all printed/echoed items
ob_end_clean();

echo 'c';

// the final output is equal to 'c', not 'abc'

?>

输出缓冲函数

输出缓冲函数在黑客技术中也很有用,可以强制只打印而不返回字符串的函数返回字符串。

<?php
ob_start();
var_dump($myVar);
$data = ob_get_clean();
// do whatever with $data
?>

有没有Apache设置可以启用/禁用多个页面的输出缓冲? - Pacerier
你也可以使用ob_end_flush()来打印出跟随ob_start()的语句,而不是丢弃它们。请参见http://us3.php.net/ob_start - Vern Jensen
@Matthew:帮了很多忙! - vkGunasekaran
ob_start(); 不需要。 - Alex78191

4

虽然@monoxide是正确的,但最好找到更直观的方法来完成相同的事情。例如:

<?php
$val_to_print = $a;
if( $need_to_change==true ) 
    $val_to_print = $b;
// when you are sure you won't have to change again...
echo $val_to_print;
?>

祝好!

jrh


1
他担心有人更改他无法控制的文件,所以虽然你是对的,但你没有解决他所关心的问题。 - Matthew Scharley
有时候人们会忽略包含文件末尾的EOL,如果之后需要发送header(),可能会造成潜在的混乱... - Matthew Scharley
1
@monoxide 冒着完全偏离主题的风险,您可以省略文件末尾的最后一个 PHP 结束标记,这是消除该问题的好方法。 - Josh
+1 对于 EOF 问题。这个问题让我之前调试了好几天,而且只是偶然发现的。 - Steve Cooke

1
理想情况下,您不应输出任何最终不需要打印的内容。将逻辑与呈现分开以减少挫败感。
话虽如此,您可以在 PHP 中查看 输出缓冲 选项。

0
如果您担心的是调试输出和程序状态信息,也许trigger_error更接近您所需的内容,例如:
trigger_error ("Attempting to load report #{$report_id}.", E_USER_NOTICE);

当您的脚本处于生产状态时,通常会禁用或记录错误,因此不会显示任何错误。最好使用E_USER_ERROR来处理致命错误,而不是使用die()。

ob_start ();
require ($filename);
$html = ob_get_clean ();

以上还将包括一个文件,并将以字符串形式给出其内容。
注意:放弃缓冲区也会放弃任何抛出的错误消息,使得调试(潜在地)成为一场噩梦。

或者,如果您使用从get_clean()获取的$html并将其放在页面正文中而不是破坏大部分页面的标题和定位,那么可能会更好。 - Matthew Scharley

-1

如果一个黑客能够访问您的PHP文件,他也将能够删除清除输出缓冲区的语句。

如果您之所以这样做是因为您允许用户上传PHP脚本,那么请让我告诉您,这是一个极其糟糕的想法。

在这两种情况下,执行您要求的操作都不会增加任何安全性。


实际上有很多。它意味着攻击者可以在您的系统上执行任何给定的php文件。最好每个数组只使用一个php文件,并直接调用该文件。 - Andrew Moore
另一种方法是完全禁用路径元素(如“..”),这可以解决很多此类安全问题。 - Matthew Scharley
我无法在数据库中存储预先制作的值,因为该脚本是一个 JQuery 插件。用户需要能够输入任何相对路径。我更改了脚本的逻辑,使路径必须是相对路径(而不是绝对路径),路径的最后一部分必须包含 "foo",并且所包含文件的文件名必须包含 "foo"。这样会有效吗? - edt
@ed:总有办法摆脱路径限制。我不明白为什么jQuery会阻止您从数据库中获取数据。这是PHP的工作,而不是jQuery...您需要做的就是将jQuery指向具有正确查询字符串的PHP文件。如果插件真的是以无法自定义的方式硬编码的,也许您应该修改插件。 - Andrew Moore
这里有一个相关的问题:https://dev59.com/GkjSa4cB1Zd3GeqPDjxf - edt
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接