Habe ich alle Basen mit Sicherheit abgedeckt, wenn ich eine Servervariable für die Seite wiederholte?
Frage
Mit Formularen habe ich immer verwendet
<form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
Meine Formulare dazu bringen, sich selbst zu unterwerfen.
ich benutze striptags()
Falls jemand zu:
http://www.mysite.com/page-with-form.php?bla="><script src="http://www.nasty.com/super-nasty.js"></script><a href="#
Habe ich alle Basen abgedeckt, um sich aus XSS -Angriffen zu schützen, oder sollte ich einen Whitelist -Ansatz verwenden, sagen Sie eine Regex, die nur alphanumerische Zeichen, das Vorwärts -Schrägstrich, das Fragezeichen, das gleiche Zeichen, die Klammern usw. ermöglicht?
Vielen Dank!
Lösung
Verwenden htmlspecialchars
Anstatt von strip_tags
.
Andere Tipps
Wenn Sie auf das gleiche Schema/Host/Pfad verweisen möchten, eine einfache Aktion = "?" Schuh ausreichen. Entsprechend http://tools.ietf.org/html/rfc3986#section-4.2
relative-ref = relative-part [ "?" query ] [ "#" fragment ] relative-part = "//" authority path-abempty / path-absolute / path-noscheme / path-empty
Es ist ein gültiger relativer URI.
Lassen Sie ein Formular an sich selbst einreichen, indem Sie es darauf senden:
$_SERVER["PHP_SELF"]
Diese globale Variable gibt die aktuelle Seite aus. Es sei denn, es gibt einen Grund, warum Sie die gesamte Abfragezeichenfolge zusammen mit sich benötigen?
BEARBEITEN
Seit, wie von Volkerk in den Kommentaren hervorgehoben wird, sogar PHP_SELF
ist verletzlich, Sie können Ihre eigene kleine Variable basierend auf dem schreiben PHP_SELF
und explodieren Sie den Rest des URI, von dem Sie wissen, dass es nicht Teil Ihrer Seite ist. Etwas wie das:
$file_ext = '.php'; //knowing what file extension your URI is
$page_on = $_SERVER["PHP_SELF"]; //grab this page, with all that junk
$page_huh = explode($file_ext, $page_on); //blow it apart based on file ext
$page_on = $page_huh[0].$file_ext; //attach the leg back onto the URI
echo $page_on;
Wenn dein striptags()
Strips nur Tags (Zeichen zwischen "<" und ">" einschließlich der Winkelklammern), kann jemand JavaScript immer noch injizieren:
http://www.mysite.com/page-with-form.php?bla=" onsubmit="return function(){ /*nasty code here*/ }()" style="
Bessere Whitelist jede mögliche Metabarakter in HTML, JavaScript und CSS (dh Winkelklammern, Klammern, Zahnspangen, Halbkolons, Doppelzitat, Einzelzitat usw.).
Wenn Sie möchten, dass ein Formular sich selbst einreicht, lassen Sie einfach die Aktion leer, z.
<form action="" method="POST">
...
</form>