Ich habe viele Benutzereingaben von $_GET und $_POST… Im Moment schreibe ich immer mysql_real_escape_string($_GET['var'])..
Ich würde gerne wissen, ob Sie eine Funktion machen könnten, die das sichert, entkommt und reinigt $_GET/$_POST Arrays sofort, sodass Sie sich nicht jedes Mal damit befassen müssen, wenn Sie mit Benutzereingaben und dergleichen arbeiten.
Ich dachte an eine Funktion, z cleanMe($input)und darin sollte es tun mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes (Ich denke, das wäre alles, um es sauber und sicher zu machen) und dann das zurückzugeben $input.
Also ist das möglich? Erstellen einer Funktion, die für alle funktioniert $_GET und $_POSTalso würden Sie nur dies tun:
$_GET = cleanMe($_GET);
$_POST = cleanMe($_POST);
Also in deinem Code später, wenn du mit zB arbeitest $_GET['blabla'] oder $_POST['haha'] sie werden gesichert, abisoliert und so weiter?
Ich denke, die Datensicherheit hängt davon ab, was sie tun und woher sie kommen. Nicht alle Ihre Behandlungen sind notwendigerweise erforderlich.
– MatTheCat
19. November 2010 um 10:15 Uhr
Die Verwendung einer einmaligen Master-Bereinigungsfunktion ist nicht die richtige Lösung. Deshalb magische zitate gescheitert. Entkommen (oder bessere Lösungen wie vorbereitete Anweisungen verwenden) Falls und wann du brauchst es. Andernfalls werden Sie feststellen, dass Sie zur falschen Zeit und oft mehr als einmal entkommen. Alle diese Funktionen haben sehr unterschiedliche Zwecke, und mehrere (z mysql_real_escape_string und stripslashes) sind im Wesentlichen invers. Sehen [What’s the best method for sanitizing user input with PHP? ](stackoverflow.com/questions/129677) für weitere Informationen.
– Matthäus Flaschen
19. November 2010 um 10:16 Uhr
Oah wow, cleanMe() stoppt nicht alle xss und unternimmt nichts, um sqli zu stoppen stripslashes(). Dieser Code ist schmerzhaft.
– Turm
23. November 2010 um 18:48 Uhr
mögliches Duplikat von Was sind die besten PHP-Eingabebereinigungsfunktionen?
– T. Todua
25. September 2014 um 11:51 Uhr
Pekka
Die Idee einer generischen Sanitärfunktion ist ein kaputtes Konzept.
Es gibt ein für jeden Zweck die richtige Sanierungsmethode. Wenn Sie sie alle wahllos auf einer Zeichenfolge ausführen, wird diese häufig beschädigt. Wenn Sie ein Stück HTML-Code für eine SQL-Abfrage maskieren, wird es für die Verwendung auf einer Webseite beschädigt und umgekehrt. Hygiene sollte angewendet werden kurz bevor Verwendung der Daten:
bevor Sie eine Datenbankabfrage ausführen. Die richtige Bereinigungsmethode hängt von der verwendeten Bibliothek ab; Sie sind in Wie kann ich SQL-Injection in PHP verhindern aufgeführt?
htmlspecialchars() für sichere HTML-Ausgabe
preg_quote() zur Verwendung in einem regulären Ausdruck
escapeshellarg() / escapeshellcmd() zur Verwendung in einem externen Befehl
usw. usw.
Die Verwendung einer „Einheitsgröße“-Hygienefunktion ist wie die Verwendung von fünf Arten hochgiftiger Insektizide auf einer Pflanze, die per Definition nur eine Art von Käfern enthalten kann – nur um herauszufinden, dass Ihre Pflanzen von einer sechsten Art befallen sind, auf der keine vorhanden ist der Insektizidarbeit.
Verwenden Sie immer diese eine richtige Methode, idealerweise direkt bevor Sie die Daten an die Funktion übergeben. noch nie Mischen Sie Methoden, es sei denn, Sie müssen.
Wir haben mit magic_quotes eine „automatisierte Sanierung“ durchlaufen. Nie wieder.
– Mchl
19. November 2010 um 10:15 Uhr
@Mchl +1 Das ist wohl die Nummer eins Grund für Unsicherheit in PHP-Lösungen. Es förderte im Grunde die Ignoranz der Programmierer 🙂
– jensgram
19. November 2010 um 10:17 Uhr
Ich würde hinzufügen, dass es sehr erwägenswert ist, stattdessen vorbereitete Anweisungen (PDO oder mysqli) für Datenbankabfragen zu verwenden.
– Matthäus Flaschen
19. November 2010 um 10:20 Uhr
+1 Sie treffen den Nagel auf den Kopf, eine Schwachstelle hängt vollständig davon ab, wie die Daten verwendet werden.
– Turm
23. November 2010 um 18:46 Uhr
@Toby Wenn Sie es für angebracht halten, eine gültige (und übrigens akzeptierte) Antwort abzulehnen, weil Ihnen die Wortwahl nicht gefällt, dann ist das natürlich Ihr Vorrecht. Aber ich persönlich finde es doof.
– Pekka
15. Dezember 2010 um 15:10 Uhr
Thomas
Es macht keinen Sinn, die Eingabe einfach durch all diese Funktionen zu leiten. All diese Funktionen haben unterschiedliche Bedeutungen. Daten werden nicht “sauberer”, indem mehr Escape-Funktionen aufgerufen werden.
Wenn Sie Benutzereingaben in MySQL speichern möchten, müssen Sie nur verwenden mysql_real_escape_string. Es wird dann vollständig maskiert, um es sicher in der Datenbank zu speichern.
BEARBEITEN
Beachten Sie auch die Probleme, die bei der Verwendung der anderen Funktionen auftreten. Wenn der Client beispielsweise einen Benutzernamen an den Server sendet und der Benutzername ein kaufmännisches Und (&), möchten Sie nicht angerufen haben htmlentities vor dem Speichern in der Datenbank, da dann der Benutzername in der Datenbank enthalten sein wird &.
Du schaust nach filter_input_array(). Ich schlage jedoch vor, dies nur für die Validierung/Bereinigung im Geschäftsstil und nicht für die SQL-Eingabefilterung zu verwenden.
Verwenden Sie zum Schutz vor SQL-Injection parametrisierte Abfragen mit mysql oder PDO.
Das Problem ist, dass etwas Sauberes oder Sicheres für eine Verwendung nicht für eine andere Verwendung gilt: Bereinigung für einen Teil eines Pfads, für einen Teil einer MySQL-Abfrage, für die HTML-Ausgabe (als HTML oder in Javascript oder im Wert einer Eingabe). für XML können verschiedene Dinge erforderlich sein, die widersprechen.
Aber einige globale Dinge können getan werden. Versuchen zu benutzen filter_eingabe um die Eingabe Ihres Benutzers zu erhalten. Und verwenden vorbereitete Erklärungen für Ihre SQL-Abfragen.
Anstelle einer Alleskönner-Funktion können Sie jedoch eine Klasse erstellen, die Ihre Eingaben verwaltet. Sowas in der Art :
class inputManager{
static function toHTML($field){
$data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);
return $data;
}
static function toSQL($field, $dbType="mysql"){
$data = filter_input(INPUT_GET, $field);
if($dbType == 'mysql'){
return mysql_real_escape_string($data);
}
}
}
Wenn Sie bei solchen Dingen $_POST, $GET, $_REQUEST oder $_COOKIE in Ihrem Code sehen, wissen Sie, dass Sie ihn ändern müssen. Und wenn Sie eines Tages ändern müssen, wie Sie Ihre Eingaben filtern, ändern Sie einfach die Klasse, die Sie erstellt haben.
Filipe YaBa Polido
Darf ich vorschlagen, “mod_security” zu installieren, wenn Sie Apache verwenden und vollen Zugriff auf den Server haben?!
Es hat die meisten meiner Probleme gelöst. Verlassen Sie sich jedoch nicht nur auf eine oder zwei Lösungen, sondern schreiben Sie immer sicheren Code 😉
AKTUALISIEREN
Dieses PHP-IDS gefunden (http://php-ids.org/); scheint gut zu sein 🙂
Was hat mod_security mit Input-Escape, SQL-Injection usw. zu tun?
stripslashes()
nach demmysql_real_escape_string()
… meine Augen!– jensgram
19. November 2010 um 10:15 Uhr
Ich denke, die Datensicherheit hängt davon ab, was sie tun und woher sie kommen. Nicht alle Ihre Behandlungen sind notwendigerweise erforderlich.
– MatTheCat
19. November 2010 um 10:15 Uhr
Die Verwendung einer einmaligen Master-Bereinigungsfunktion ist nicht die richtige Lösung. Deshalb magische zitate gescheitert. Entkommen (oder bessere Lösungen wie vorbereitete Anweisungen verwenden) Falls und wann du brauchst es. Andernfalls werden Sie feststellen, dass Sie zur falschen Zeit und oft mehr als einmal entkommen. Alle diese Funktionen haben sehr unterschiedliche Zwecke, und mehrere (z
mysql_real_escape_string
undstripslashes
) sind im Wesentlichen invers. Sehen [What’s the best method for sanitizing user input with PHP? ](stackoverflow.com/questions/129677) für weitere Informationen.– Matthäus Flaschen
19. November 2010 um 10:16 Uhr
Oah wow, cleanMe() stoppt nicht alle xss und unternimmt nichts, um sqli zu stoppen
stripslashes()
. Dieser Code ist schmerzhaft.– Turm
23. November 2010 um 18:48 Uhr
mögliches Duplikat von Was sind die besten PHP-Eingabebereinigungsfunktionen?
– T. Todua
25. September 2014 um 11:51 Uhr