2010-08-09 11 views
7

ich normalerweise diese Funktion verwenden, um meine Form Eingänge zu sanieren, bevor sie in der Datenbank zu speichern:Sanitize Kontaktformular ohne mysql_real_escape_string

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

Bis heute habe ich nicht erkennen, dass mysql_real_escape_string eine Datenbankverbindung erforderlich, da ich nur habe Ich habe es benutzt, als ich die Daten gereinigt habe, bevor ich sie in der Datenbank gespeichert habe.

Ich habe versucht, die Funktion auf einem Kontaktformular und bekam den Fehler "Eine Verbindung zum Server konnte nicht festgestellt werden". Ich könnte eine Verbindung zur Datenbank herstellen, aber das ist nicht nötig, weil ich einfach versuche, die Daten zu bereinigen, bevor sie über das Kontaktformular an meine E-Mail gesendet werden.

Was ist der beste Weg, Daten zu bereinigen, die nicht in einer Mysql-Datenbank gespeichert werden, und müssen diese Daten noch bereinigt werden?

Antwort

15

Verwendung filter_var()

http://php.net/manual/en/function.filter-var.php

wie wenn Sie eine E-Mail sanieren:

$_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

zu Nachricht

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); 

ist enogth

+0

Welche speziellen Filter meinen Sie bitte? Es gibt so viele von ihnen –

1

Der Zweck der Bereinigung der Daten mit mysql_real_escape_string besteht darin, SQL-Injektion zu vermeiden. Wenn Sie SQL nicht verwenden, sind Sie bereits immun.

Männer bekommen keinen Gebärmutterhalskrebs.

Verwenden Sie eine Desinfektionsfunktion, die den Sonderzeichen entspricht, die Sie vermeiden müssen. Idealerweise sollten Sie nicht etwas abziehen, das keinen Schaden verursacht.

+0

mysql_real_escape_string allein nichts helfen –

-1

Das ganze Konzept ist falsch. Diese Funktion hilft nicht für E-Mail nicht einmal für die Datenbank.

mysql_real_escape_string nichts "hygienisieren". Es ist nur Escape-Begrenzer und nichts anderes. Nur um Syntaxfehler zu vermeiden, wenn Sie ein Trennzeichen in Ihren Daten haben:

SELECT * FROM table WHERE name = 'it's me' # error! 

nach Daten entkommen sind, Ihre Daten werden 'it\'s me' und es gibt keinen Fehler.
Daher funktioniert diese Funktion nur mit SQL-Abfrage und für Daten, nur in Anführungszeichen.

Daher ist es sinnvoll, nur mysql_real_escape_string ohne Anführungszeichen zu tun. mysql_real_escape_string sollte verwendet werden
a) allein. Sachen wie trim oder stripslashes haben hier nichts zu tun
b) direkt vor dem Query String Composing und sonst nirgends
c) nur mit Daten, die in Anführungszeichen gesetzt werden.
d) alle anderen Daten benötigen eine andere Art der Bereinigung

Wie für die E-Mail, benötigen Sie keine Bereinigung es senden Sie es als Nur-Text. Die einzige Vorsichtsmaßnahme, die Sie ergreifen müssen, ist gegen Mail-Injektion
Keine große Sache, obwohl. Fügen Sie nur Benutzereingaben in den Nachrichtentext ein. nicht in Betreff, zu oder von oder irgendeinem anderen Header. Nur Nachrichtentext. Und Sie sind sicher

+0

Was? Benutze immer sanitäre Einrichtungen. Vertraue niemals Benutzereingaben. Ein solcher Ratschlag geht davon aus, dass a) es keine Möglichkeit gibt, einen anderen Header in das Skript einzufügen (wenn Sie die Eingabe nicht bereinigen, woher wissen Sie das sicher?) Und b) dass alle Mail-Clients das Richtige tun, auch mit einem Text/einfache Überschrift. Ich bezweifle das ernsthaft. – Cfreak

+0

@Cfreak der einzige sinnvolle Punkt hier ist über einige ungerade Mail-Clients. Hast du ein Beispiel? Aber Sie "vertrauen nie Benutzereingaben", sinnloses Gebet ist in der Tat lustig. Warum nicht vor dem Richter andere Erfahrungen sammeln? –

-1

(Ich bin neu in Stackoverflow so darüber werde ich den falschen Weg/einen schlechten Job mit dem Styling meiner Antwort tun fühlen Sie sich frei, mich zu informieren.)

Korrigieren Sie mich, wenn ich falsch liege, da ich mich jetzt auch mit dem gleichen Problem befasse, glaube ich aber nicht, dass die akzeptierte Antwort mit filter_var ausreicht, da Angreifer dies mit Unicode umgehen könnten.

Beispiel: "& # 66; # 99 &; & # 99; # 58 &"; (Leerzeichen hinzugefügt, damit stackoverflow es korrekt anzeigt)

Dieses wurde nicht aus der Zeichenfolge entfernt und später durch "Bcc:" ersetzt.

Dies ist meine Lösung, aber es könnte einen besseren Weg geben. Wenn jemand davon weiß, würde ich es gerne hören.

$string = str_replace("&", "(and)", $string); 
    $string = str_replace("#", "(num)", $string); 
    $string = str_replace(";", "(semi-colon)", $string); 
    $string = str_replace(":", "(colon)", $string); 
    $string = str_replace("@", "(at)", $string); 
    $string = str_replace("\\", "(backslash)", $string); 
    $string = filter_var($string, FILTER_SANITIZE_STRING);