Вопрос по 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-скрипты, позвольте мне сказать вам, что это очень плохая идея.

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

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

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