Как очистить ранее отображенные элементы в PHP

В php есть ли способ очистить / удалить все ранее отображенные или напечатанные элементы?

Например:

<code><?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'

?>
</code>

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

 Adarsha14 окт. 2010 г., 02:58
Я использую oci_execute, и если запрос не удастся, он выдаст предупреждение & lt; / b & gt; сообщение. Но я обрабатываю ошибку отдельно и не хочу сообщения оракула. Так что этот вопрос применим в этом сценарии также
 Carlos Lima29 июн. 2009 г., 14:22
Если вы делаете это в качестве «меры безопасности» Вы, вероятно, делаете это неправильно. Вы должны рассмотреть другой подход к проблеме. Может быть, создать еще один вопрос с указанием вашей проблемы?

Ответы на вопрос(5)

лучше найти более интуитивные способы сделать то же самое. например.:

<?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

 26 апр. 2015 г., 09:31
+1 за выпуск EOF. Эта проблема заняла у меня несколько дней назад для отладки. И только случайно, что я нашел это.
 29 июн. 2009 г., 14:24
Кроме того, иногда люди пропускают EOL в конце включаемых файлов, что может привести к хаосу, если вам потребуется отправить header () позже ...
 29 июн. 2009 г., 18:36
@monoxide. Если вы рискуете стать совершенно не по теме, вы можете опустить последний закрывающий тег PHP в конце файла, что является хорошим способом полностью устранить эту проблему.
 29 июн. 2009 г., 14:23
Он обеспокоен тем, что кто-то изменяет на нем файлы, которые он не контролирует, поэтому, хотя вы и правы, вы не решаете, о чем он беспокоится.

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

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

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

 edt29 июн. 2009 г., 18:37
Спасибо за вклад. Чтобы программа работала, пользователь должен иметь возможность добавлять свои собственные значения массива. В дополнение к вышесказанному я также теперь требую, чтобы включаемый файл содержал подстроку. Например, строка должна содержать «bar». & Quot; foo.php & Quot; не может быть включен & Quot; foo_bar.php & Quot; могут быть включены. Таким образом, до тех пор, пока в системе нет других файлов, содержащих «foo», программа должна быть защищена. Это правильно? В очередной раз благодарим за помощь. Очень признателен.
 29 июн. 2009 г., 17:24
На самом деле много. Это означает, что ваш злоумышленник может выполнить любой файл php в вашей системе. Вам лучше иметь один php-файл на массив и вызывать этот файл напрямую.
 29 июн. 2009 г., 23:50
Давайте посмотрим ... "... / bar /../../ delete_all.php": все еще будет вызываться. Просто нет способа защитить себя. Почему бы не сохранить сериализованные значения в базе данных и извлечь их по идентификатору? Таким образом, вы могли бы иметь & quot; foobar.php? Id = 20 & quot; что намного безопаснее, чем foobar.php? file = someArbPath
 30 июн. 2009 г., 00:33
Или еще один способ сделать это - полностью отключить элементы пути, такие как «...», которые могут решить многие из этих видов проблем безопасности.
 edt29 июн. 2009 г., 15:07
У меня есть функция ajax, которая предоставляет имя файла / местоположение файла, который будет включен в мой документ php. Я использую функцию parse_url, чтобы запретить любые значения, которые являются абсолютными путями (до включения файла). Включенный файл должен содержать только любой массив. Я обернул массив в ob_start и ob_end_clean, чтобы удалить любой отраженный контент. Видите ли вы какие-либо потенциальные проблемы безопасности с этим?

о которой вы беспокоитесь, возможно, 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 ();

Выше также будет включать файл и даст вам его содержимое в виде строки.

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

 29 июн. 2009 г., 14:48
Или, возможно, намного лучше, если вы используете $ html, полученный от get_clean (), и поместите его в тело своей страницы вместо того, чтобы ломать заголовки и размещать большую часть своей страницы.
Решение Вопроса
<?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
?>
 20 мар. 2014 г., 14:08
@ Мэтью: очень помог!
 09 мар. 2013 г., 12:18
Существуют ли настройки apache для включения / отключения буферизации вывода для нескольких страниц?
 21 янв. 2014 г., 03:02
Вы также можете использовать ob_end_flush (), чтобы распечатать операторы, следующие за ob_start (), а не отбрасывать их. Увидетьus3.php.net/ob_start

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

При этом вы можете проконсультироваться сБуферизация выхода варианты в PHP.

Ваш ответ на вопрос