Frage an echo, php, security – So löschen Sie zuvor wiedergegebene Elemente in PHP

41

Gibt es in PHP eine Möglichkeit, alle zuvor wiedergegebenen oder gedruckten Elemente zu löschen / zu entfernen?

Zum Beispiel:

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

Mein Skript verwendet die Include-Funktion. Die enthaltenen Dateien sollen nichts wiedergeben. Nur für den Fall, dass jemand (ex = Hacker) es versucht, brauche ich einen Weg, um es zu entfernen.

Ich verwende oci_execute. Wenn die Abfrage fehlschlägt, wird eine <b> Warnmeldung </ b> ausgegeben. Aber ich behandle den Fehler separat und möchte keine Orakelmeldung. Diese Frage ist also auch in diesem Szenario anwendbar Adarsha
Wenn Sie es als "Sicherheitsmaßnahme" tun, tun Sie es wahrscheinlich falsch. Sie sollten eine andere Herangehensweise an das Problem in Betracht ziehen. Vielleicht eine andere Frage erstellen, die angibt, was Ihr Problem ist? Carlos Lima

Deine Antwort

5   die antwort
-1

Wenn ein Hacker beispielsweise Zugriff auf Ihre PHP-Datei hat, kann er auch die Anweisung entfernen, die den Ausgabepuffer löscht.

Wenn Sie dies tun, weil Sie Ihre Benutzer PHP-Skripte hochladen lassen, lassen Sie mich Ihnen sagen, dass dies eine äußerst schlechte Idee ist.

In beiden Fällen wird die Sicherheit um 0 erhöht, wenn Sie das tun, wonach Sie fragen.

Eine andere Möglichkeit besteht darin, Pfadelemente wie '..' vollständig zu deaktivieren, um viele dieser Sicherheitsprobleme zu lösen. Matthew Scharley
Eigentlich jede Menge. Dies bedeutet, dass Ihr Angreifer eine beliebige PHP-Datei auf Ihrem System ausführen kann. Es ist besser, eine PHP-Datei pro Array zu haben und diese Datei direkt aufzurufen. Andrew Moore
Danke für die Eingabe. Damit das Programm funktioniert, muss der Benutzer in der Lage sein, eigene Array-Werte hinzuzufügen. Darüber hinaus habe ich jetzt auch verlangt, dass die enthaltene Datei eine Unterzeichenfolge enthalten muss. Beispielsweise muss die Zeichenfolge "bar" enthalten. "foo.php" kann nicht eingeschlossen werden. "foo_bar.php" kann eingeschlossen werden. Solange sich keine anderen Dateien auf dem System befinden, die "foo" enthalten, sollte das Programm sicher sein. Ist das richtig? Danke nochmal für deine Hilfe. Sehr geschätzt. edt
Mal sehen ... "../bar/../../delete_all.php": Wird noch aufgerufen. Es gibt einfach keine Möglichkeit, sich zu schützen. Warum werden die serialisierten Werte nicht in der Datenbank gespeichert und nach ID abgerufen? Sie könnten also "foobar.php? Id = 20" haben, was weitaus sicherer ist als foobar.php? File = someArbPath Andrew Moore
0

Wenn es sich um Debug-Ausgabe- und Programmstatusinformationen handelt, über die Sie sich Sorgen machen, ist trigger_error möglicherweise näher an Ihren Anforderungen, z. B .:

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

Wenn Ihr Skript in Produktion ist, werden keine Fehler angezeigt, da diese normalerweise deaktiviert oder protokolliert sind. Es ist auch am besten, auf diese Weise schwerwiegende Fehler mit E_USER_ERROR zu machen, anstatt die () zu verwenden.

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

Das Obige enthält auch eine Datei und gibt Ihnen deren Inhalt als Zeichenfolge.

Vorsichtsmaßnahme: Durch das Löschen des Puffers werden auch alle Fehlermeldungen gelöscht, was das Debuggen (möglicherweise) zu einem Albtraum macht.

Oder möglicherweise viel besser, wenn Sie das von get_clean () erhaltene $ html verwenden und es in den Hauptteil Ihrer Seite einfügen, anstatt die Überschriften zu verfälschen und den größten Teil Ihrer Seite zu positionieren. Matthew Scharley
4

Während @monoxide richtig ist, ist es besser, intuitivere Möglichkeiten zu finden, um dasselbe zu tun. z.B.:

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

Prost,

jrh

Manchmal übersehen Leute auch die EOLs am Ende von Include-Dateien, was zu Chaos führen kann, wenn Sie später einen Header () senden müssen ... Matthew Scharley
Er ist besorgt darüber, dass jemand Dateien auf ihn ändert, die er nicht kontrolliert. Wenn Sie also Recht haben, sprechen Sie nicht an, worüber er besorgt ist. Matthew Scharley
+1 für die EOF-Ausgabe. Dieses Problem hat vor einiger Zeit einige Tage gedauert, bis ich es behoben habe. Und nur durch Zufall habe ich es gefunden. Steve Cooke
@monoxide Sie können das letzte schließende PHP-Tag am Ende einer Datei weglassen, um dieses Problem vollständig zu beheben. Josh
1

Im Idealfall sollten Sie nichts ausgeben, was Sie letztendlich nicht drucken möchten. Halten Sie Ihre Logik von Ihrer Präsentation getrennt, um weniger Frustration zu verursachen.

Davon abgesehen können Sie die konsultierenAusgabepufferung Optionen in PHP.

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>

Ausgabepufferfunktionen

Die Ausgabepufferfunktionen sind auch in der Hackerei nützlich, um Funktionen zu erzwingen, die nur drucken, um Zeichenfolgen zurückzugeben, d. H.

<code><?php
ob_start();
var_dump($myVar);
$data = ob_get_clean();
// do whatever with $data
?>
</code>
Gibt es Apache-Einstellungen zum Aktivieren / Deaktivieren der Ausgabepufferung für mehrere Seiten? Pacerier
@Matthew: hat mir sehr geholfen! VKGS
Sie können auch ob_end_flush () verwenden, um die Anweisungen, die auf ob_start () folgen, auszudrucken, anstatt sie zu verwerfen. Sehenus3.php.net/ob_start Vern Jensen

Verwandte Fragen