【问题标题】:How to clear previously echoed items in PHP如何在 PHP 中清除以前回显的项目
【发布时间】:2010-11-06 16:15:36
【问题描述】:

在 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'

?>

我的脚本使用包含函数。包含的文件不应该回显任何内容。以防万一有人(例如黑客)尝试,我需要一种删除方法。

【问题讨论】:

  • 如果您将其作为“安全措施”,您可能做错了。你应该考虑用不同的方法来解决这个问题。也许创建另一个问题来说明您的问题是什么?
  • 我使用的是oci_execute,如果查询失败,会回显warning信息。但是我正在单独处理错误并且不想要 oracle 消息。所以这个问题也适用于这种情况

标签: php output echo output-buffering


【解决方案1】:
<?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'

?>

Output buffering functions

输出缓冲函数在hackery中也很有用,可以强制只打印返回字符串的函数,即。

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

【讨论】:

  • 是否有 apache 设置来启用/禁用多个页面的输出缓冲?
  • 您也可以使用 ob_end_flush() 打印出 ob_start() 之后的语句,而不是丢弃它们。见us3.php.net/ob_start
  • @Matthew:帮了大忙!
  • ob_start();不需要
【解决方案2】:

虽然@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

【讨论】:

  • 他担心有人更改了他无法控制的文件,所以虽然你是对的,但你并没有解决他担心的问题。
  • 另外,有时人们会忽略包含文件末尾的 EOL,如果您需要稍后发送 header() 会造成潜在的破坏......
  • @monoxide 冒着完全偏离主题的风险,您可以省略文件末尾的最后一个关闭 PHP 标记,这是完全消除该问题的好方法。
  • +1 表示 EOF 问题。这个问题花了我几天前调试。我只是偶然发现了它。
【解决方案3】:

理想情况下,您不应输出最终不想打印的任何内容。将您的逻辑与演示文稿分开,以减少挫败感。

话虽如此,您可以参考 PHP 中的 Output Buffering 选项。

【讨论】:

    【解决方案4】:

    如果是你担心的调试输出和程序状态信息,可能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 并将其放在页面正文中,而不是搞砸大部分页面的标题和定位,可能会更好。跨度>
    【解决方案5】:

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

    如果你这样做是因为你让你的用户上传 PHP 脚本,那么我告诉你这是一个非常糟糕的主意。

    在这两种情况下,做你所要求的会增加 0 安全性。

    【讨论】:

    • 我有一个 ajax 函数,可以将文件的文件名/位置传递到我的 php 文档中。我正在使用 parse_url 函数来禁止任何绝对路径的值(在包含文件之前)。包含的文件应该只包含任何数组。我将数组包装在 ob_start 和 ob_end_clean 中以删除任何回显的内容。您是否发现任何潜在的安全问题?
    • 实际上很多。这意味着您的攻击者可以在您的系统上执行任何给定的 php 文件。您最好每个数组有一个 php 文件,然后直接调用该文件。
    • 感谢您的意见。要使程序正常工作,用户必须能够添加自己的数组值。除了上述之外,我现在还要求包含的文件必须包含子字符串。例如,字符串必须包含“bar”。不能包含“foo.php”。可以包含“foo_bar.php”。因此,只要系统中没有包含“foo”的其他文件,程序就应该是安全的。这是正确的吗?再次感谢你的帮助。非常感谢。
    • 让我们看看... "../bar/../../delete_all.php": 仍然会被调用。根本没有办法保护自己。为什么不将序列化的值存储到数据库中并通过 id 获取它们?所以你可以拥有比 foobar.php?file=someArbPath 更安全的“foobar.php?id=20”
    • 或者另一种解决方法是完全禁用诸如“..”之类的路径元素,这可以解决很多此类安全问题。
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多