Как очистить ранее отображенные элементы в PHP - PullRequest
42 голосов
/ 29 июня 2009

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

?>

Мой скрипт использует функцию включения. Включенные файлы не должны отражать что-либо. На всякий случай, если кто-то (бывший = хакер) попытается, мне нужен способ удалить.

Ответы [ 5 ]

94 голосов
/ 29 июня 2009
<?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
?>
4 голосов
/ 29 июня 2009

Хотя @monoxide и прав, лучше найти более интуитивные способы сделать то же самое. e.g.:

<?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 голос
/ 29 июня 2009

В идеале, вы не должны выводить то, что не хотите печатать. Держите свою логику отдельно от вашей презентации для меньшего разочарования.

При этом вы можете обратиться к опциям Output Buffering в PHP.

0 голосов
/ 29 июня 2009

Если, скажем, хакер имеет доступ к вашему файлу PHP, он также сможет удалить оператор, очищающий выходной буфер.

Если вы делаете это, потому что вы разрешаете своим пользователям загружать PHP-скрипты, позвольте мне сказать вам, что это очень плохая идея.

В обоих случаях выполнение того, о чем вы просите, добавляет 0 безопасности.

0 голосов
/ 29 июня 2009

Если это отладочный вывод и информация о состоянии программы, о которой вы беспокоитесь, возможно, 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 ();

Вышеприведенный файл также включает файл и предоставляет его содержимое в виде строки.

Предупреждение: отключение буфера также отбрасывает любые сообщения об ошибках, что делает отладку (потенциально) кошмаром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...