5 Stimmen

Wie kann man $_SERVER['PHP_SELF'] sichern?

Ich verwende den folgenden Code zur Steuerung der Paginierung. Es verwendet $_SERVER['PHP_SELF'], also wollte ich wissen, ob dies sicher ist oder was ich tun muss, um $_SERVER['PHP_SELF'] sicher zu machen?

 10) {
        echo '
        Nächste';
    } 

    $prev = $startrow - 10;

    if ($prev >= 0) {
        echo '
        Vorherige';
    }

?>

0 Stimmen

"sicher" hat viele Bedeutungen - was ist deine?

0 Stimmen

"sicher" bedeutet $_SERVER['PHP_SELF'] im Grunde genommen, was in der Adressleiste ausgeführt wird. Ich bin neu in PHP, aber mir wurde gesagt, dass $_SERVER['PHP_SELF'] bereinigt werden muss...

0 Stimmen

In diesem Fall gibt es kein Problem, wenn Sie $_SERVER['PHP_SELF'] als Formularaktion verwenden. Und das nur, wenn Sie dumm genug sind, Eingaben ohne Überprüfung zu akzeptieren.

10voto

alganet Punkte 2487

Sie sollten filter_input verwenden: http://php.net/filter_input

$phpSelf = filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_URL);

Verwenden Sie dann $phpSelf anstelle von $_SERVER['PHP_SELF'].

Dies ist besser als htmlspecialchars, aber eine ideale Lösung wäre die Verwendung eines Tools wie http://htmlpurifier.org/

0 Stimmen

Vielen Dank. Da ich neu in PHP bin, bin ich mir unsicher, was der Unterschied ist zwischen der Verwendung von filter_input und htmlspecialchars? Kannst du das klären?

0 Stimmen

Htmlspecialchars konvertiert nur einige HTML-Symbole in Entitäten, aber der Benutzer kann immer noch fremde Zeichen oder UTF-8-Sonderzeichen einspeisen. filter_input mit FILTER_SANITIZE_URL validiert einen URL-Link (Sie können auch mehr Sanitizer-Typen im PHP-Handbuch sehen), aber das ist auch unvollständig (es gibt komplexe XSS-Techniken, die das umgehen können). HTMLPurifier ist noch besser, weil es darauf ausgelegt ist, XSS zu vermeiden und all diese Probleme mit anderen Funktionen zu umgehen.

0 Stimmen

Ok aber htmlspecialchars(); würde immer noch ordnungsgemäß funktionieren, um Benutzereingaben anzuzeigen, oder?

9voto

Austin Smith Punkte 146

Zur Verhinderung von XSS-Angriffen sollten Sie htmlspecialchars() oder filter_input() verwenden, um $_SERVER['PHP_SELF'] zu escapen. Siehe diese Frage für weitere Informationen.

Beachten Sie auch, dass wenn Sie ein href-Attribut mit ? und ohne Pfad starten, der Browser die folgende Abfragezeichenkette an die aktuelle Anforderung anhängen wird, ähnlich wie ein relativer Link im selben Verzeichnis angehängt würde.

Ich gehe davon aus, dass Sie $prev und $startrow an anderer Stelle bereinigen. Die mathematischen Vergleiche sollten sie sicher machen, aber wenn sie von $_GET kommen, ist es eine gute Idee, sie vorher durch intval() laufen zu lassen, bevor Sie etwas anderes tun.

0 Stimmen

Danke. Das ist, was ich am Anfang der Abfrage habe: //Neues Skript beginnen if (!isset($_GET['pg']) or !is_numeric($_GET['pg'])) { $startrow = 0; } else { $startrow = (int)mysql_real_escape_string($_GET['pg']); } Ist es also richtig, (int) und Escaping zu verwenden?

0 Stimmen

Durch das Übergeben eines Werts mit inval() oder das Umwandeln in eine Ganzzahl mit (int) wird dasselbe Ergebnis erzielt, ja.

0 Stimmen

Psst: Wenn du eine Injektion verhindern möchtest, entferne einfach das action-Attribut vollständig. Es wird standardmäßig auf einen leeren String gesetzt, der die relative URI darstellt, die $_SERVER['PHP_SELF'] in 99,9% der Fälle hat, also ... .

0voto

$_SERVER['PHP_SELF'] ist bereits sicher in dem Sinne, dass kein Zeichen Änderungen an Ihrer HTML-Syntax verursachen kann, die Sie veröffentlichen möchten. Das einzige ist der Dateiname selbst.

Normalerweise sollten Sie Methoden wie htmlspecialchars verwenden, um die Ausgabe vor der Veröffentlichung im Browser zu bereinigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X