Pytanie w sprawie php, security, echo – Jak usunąć uprzednio echo elementów w PHP

41

Czy w php jest jakiś sposób na wyczyszczenie / usunięcie wszystkich wcześniejszych lub wydrukowanych elementów?

Na przykład:

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

Mój skrypt używa funkcji include. Dołączone pliki nie powinny niczego powtarzać. W przypadku próby kogoś (np. Hakera) potrzebuję sposobu na usunięcie.

Jeśli robisz to jako „środek bezpieczeństwa”, prawdopodobnie robisz to źle. Powinieneś rozważyć inne podejście do problemu. Może stwórz kolejne pytanie określające twój problem? Carlos Lima
Używam oci_execute, a jeśli zapytanie nie powiedzie się, wyświetli komunikat <b> ostrzeżenie </b>. Ale radzę sobie z błędem osobno i nie chcę wiadomości oracle. To pytanie dotyczy także tego scenariusza Adarsha

Twoja odpowiedź

5   odpowiedzi
86
<code><?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'

?>
</code>

Funkcje buforowania wyjścia

Funkcje buforowania wyjścia są również przydatne w hakerstwie do wymuszania funkcji, które drukują tylko w celu zwrócenia ciągów, tj.

<code><?php
ob_start();
var_dump($myVar);
$data = ob_get_clean();
// do whatever with $data
?>
</code>
@ Mateusz: bardzo mi pomógł! VKGS
Czy są ustawienia apache, aby włączyć / wyłączyć buforowanie wyjścia dla wielu stron? Pacerier
Możesz również użyć ob_end_flush (), aby wydrukować instrukcje, które następują po ob_start (), zamiast je odrzucać. Widziećus3.php.net/ob_start Vern Jensen
1

czego nie chcesz wydrukować. Oddziel swoją logikę od prezentacji w celu zmniejszenia frustracji.

Powiedziawszy to, możesz skonsultować się zBuforowanie wyjścia opcje w PHP.

-1

że ma dostęp do twojego pliku PHP, będzie również mógł usunąć instrukcję usuwającą bufor wyjściowy.

Jeśli to robisz, ponieważ pozwalasz swoim użytkownikom przesyłać skrypty PHP, pozwól mi powiedzieć, że jest to bardzo zły pomysł.

W obu przypadkach robienie tego, o co prosisz, dodaje 0 bezpieczeństwa.

Mam funkcję ajax, która dostarcza nazwę / lokalizację pliku do dołączenia do mojego dokumentu php. Używam funkcji parse_url, aby zabronić wszelkich wartości, które są ścieżkami bezwzględnymi (przed dołączeniem pliku). Dołączony plik powinien zawierać tylko dowolną tablicę. Zapakowałem tablicę w ob_start i ob_end_clean, aby usunąć wszelką treść echa. Czy widzisz jakieś potencjalne problemy z bezpieczeństwem? edt
Innym sposobem na obejście tego problemu jest całkowite wyłączenie elementów kreślenia, takich jak „..”, które mogą rozwiązać wiele z tych problemów związanych z bezpieczeństwem. Matthew Scharley
Zobaczmy ... "../bar/../../delete_all.php": nadal zostanie wywołany. Po prostu nie ma sposobu na ochronę. Dlaczego nie zapisać seryjnych wartości w bazie danych i pobrać je według identyfikatora? Więc możesz mieć „foobar.php? Id = 20”, co jest znacznie bezpieczniejsze niż foobar.php? File = someArbPath Andrew Moore
Dzięki za wejście. Aby program działał, użytkownik musi mieć możliwość dodania własnych wartości tablicy. Oprócz powyższego wymagałem również, aby dołączony plik zawierał podciąg. Na przykład ciąg musi zawierać „bar”. Nie można dołączyć „foo.php”. Można dołączyć „foo_bar.php”. Tak więc, dopóki w systemie nie ma innych plików zawierających „foo”, program powinien być bezpieczny. Czy to jest poprawne? Jeszcze raz dziękuję za pomoc. Bardzo ceniony. edt
4

lepiej znaleźć bardziej intuicyjne sposoby robienia tego samego. na przykład.:

<code><?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;
?>
</code>

Twoje zdrowie,

jrh

@ monoxide Ryzyko całkowitego wyłączenia tematu można pominąć ostatni zamykający tag PHP na końcu pliku, co jest dobrym sposobem na całkowite wyeliminowanie tego problemu. Josh
+1 dla problemu EOF. Debugowanie zajęło mi kilka dni temu. I tylko przez przypadek go znalazłem. Steve Cooke
Martwi się, że ktoś zmienia na nim pliki, których nie kontroluje, więc kiedy masz rację, nie zwracasz uwagi na to, o co mu chodzi. Matthew Scharley
Czasami ludzie przeoczają EOL na końcu plików dołączania, powodując potencjalne spustoszenie, jeśli musisz wysłać nagłówek () później ... Matthew Scharley
0

a informacje o statusie programu, o które się martwisz, być może trigger_error może być bliżej tego, czego potrzebujesz, na przykład:

<code>trigger_error ("Attempting to load report #{$report_id}.", E_USER_NOTICE);
</code>

Gdy skrypt jest w produkcji, nie pokaże żadnych błędów, ponieważ zazwyczaj są one wyłączone lub zarejestrowane. Najlepiej jest również wykonywać błędy krytyczne w ten sposób za pomocą E_USER_ERROR niż za pomocą die ().

<code>ob_start ();
require ($filename);
$html = ob_get_clean ();
</code>

Powyższe zawiera również plik i podaje jego zawartość jako ciąg.

Zastrzeżenie: Zrzucenie bufora spowoduje również zrzucenie wszystkich komunikatów o błędach, powodując debugowanie (potencjalnie) koszmaru.

Lub potencjalnie dużo lepiej, jeśli użyjesz $ html z get_clean () i umieścisz go w treści swojej strony zamiast wkręcać nagłówki i pozycjonowanie większości swojej strony. Matthew Scharley

Powiązane pytania