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

41

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

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

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

Ваш Ответ

5   ответов
4

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

<?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 за выпуск EOF. Эта проблема заняла у меня несколько дней назад для отладки. И только случайно, что я нашел это.
Кроме того, иногда люди пропускают EOL в конце включаемых файлов, что может привести к хаосу, если вам потребуется отправить header () позже ...
@monoxide. Если вы рискуете стать совершенно не по теме, вы можете опустить последний закрывающий тег PHP в конце файла, что является хорошим способом полностью устранить эту проблему.
Он обеспокоен тем, что кто-то изменяет на нем файлы, которые он не контролирует, поэтому, хотя вы и правы, вы не решаете, о чем он беспокоится.
-1

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

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

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

На самом деле много. Это означает, что ваш злоумышленник может выполнить любой файл php в вашей системе. Вам лучше иметь один php-файл на массив и вызывать этот файл напрямую.
Давайте посмотрим ... "... / bar /../../ delete_all.php": все еще будет вызываться. Просто нет способа защитить себя. Почему бы не сохранить сериализованные значения в базе данных и извлечь их по идентификатору? Таким образом, вы могли бы иметь & quot; foobar.php? Id = 20 & quot; что намного безопаснее, чем foobar.php? file = someArbPath
Или еще один способ сделать это - полностью отключить элементы пути, такие как «...», которые могут решить многие из этих видов проблем безопасности.
Спасибо за вклад. Чтобы программа работала, пользователь должен иметь возможность добавлять свои собственные значения массива. В дополнение к вышесказанному я также теперь требую, чтобы включаемый файл содержал подстроку. Например, строка должна содержать «bar». & Quot; foo.php & Quot; не может быть включен & Quot; foo_bar.php & Quot; могут быть включены. Таким образом, до тех пор, пока в системе нет других файлов, содержащих «foo», программа должна быть защищена. Это правильно? В очередной раз благодарим за помощь. Очень признателен. edt
У меня есть функция ajax, которая предоставляет имя файла / местоположение файла, который будет включен в мой документ php. Я использую функцию parse_url, чтобы запретить любые значения, которые являются абсолютными путями (до включения файла). Включенный файл должен содержать только любой массив. Я обернул массив в ob_start и ob_end_clean, чтобы удалить любой отраженный контент. Видите ли вы какие-либо потенциальные проблемы безопасности с этим? edt
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 ();

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

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

Или, возможно, намного лучше, если вы используете $ html, полученный от get_clean (), и поместите его в тело своей страницы вместо того, чтобы ломать заголовки и размещать большую часть своей страницы.
86
<?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 для включения / отключения буферизации вывода для нескольких страниц?
@ Мэтью: очень помог!
Вы также можете использовать ob_end_flush (), чтобы распечатать операторы, следующие за ob_start (), а не отбрасывать их. Увидетьus3.php.net/ob_start
1

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

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

Похожие вопросы