Sicherheits-Frage
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
aussehen
begriff
code
ding
eingabe
empfehlen
erlauben
filtern
input
lese
methode
sparen
string
tabelle
test
text
url
wort
zugriff
-
Hallo, ich habe eine PHP-Methode geschrieben, die eine Benutzereingabe entgegennimmt und daraus ein MySQL-Querry zusammenbaut, der dann ausgeführt wird. Ich wollte euch fragen ob das gegen Angreifer sicher wäre wenn ich die Eingabe des Benutzers dann nur auf diese Weise prüfe?
$eingabe_escaped = mysql_real_escape_string($eingabe); $mein_query = "SELECT FROM ... {$eingabe_escaped} ..."; ...
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wichtig ist, dass die
auch in Anführungszeichen ($eingabe_escaped
) in der Query landet:'
$eingabe_escaped = mysql_real_escape_string($eingabe); $mein_query = "SELECT FROM ... WHERE xxx = '{$eingabe_escaped}' ...";
Ansonsten nützt dir das escapen gar nichts... -
Ich würde gerne nur Lese-Zugriffe erlauben, deswegen möchte ich nach bößwilligen Wörtern prüfen. Wie würde das in meiner Methode aussehen?
F1: Gibt es eine Methode, die nach mehreren Begriffen prüfen kann, mit preg_match geht es z.B. nicht
F2: Was gibt es denn sonst noch für bösartige Begriffe, nach denen man prüfen kann, mir fallen leider nicht viele ein.
private function getSequreInput($input) { $input_escaped = mysql_real_escape_string($input); $not_allowed = array('DELETE', 'REPLACE'); if(preg_match($not_allowed, $input_escaped)){ return ' '; } else { return $input_escaped; } }
EDIT: Hier ist meine etwas verbesserte Methode. Bin für Verbesserungen offen. Ich erwarte als Eingabe eigentlich nur Buchstaben Eckige Klammern und Doppelpunkte. Später evtl auch Datum
private function getSequreInput($input) { # String escapen $input_escaped = mysql_real_escape_string($input); # Unerwartete Wörter filtern $bannedWords = array('DELETE', 'INSERT', 'OR', 'AND'); foreach ($bannedWords as $bannedWord) { if(strpos($input_escaped, $bannedWord)){ return ' '; } else { return $input_escaped; } } }
Beitrag zuletzt geändert: 28.6.2012 12:54:48 von pixilab -
pixilab schrieb:
Was hast du bitte vor? Wenn du nur eine SELECT-Abfrage mit WHERE beschränken möchtest kannst du dir das alles sparen, dann reicht mysql_real_escape_string. Wenn du den User eine SQL-Abfrage eingeben möchtest (das ist nicht zu empfehlen), dann wirst du um das Filtern nicht herumkommen...
Ich würde gerne nur Lese-Zugriffe erlauben, deswegen möchte ich nach bößwilligen Wörtern prüfen. Wie würde das in meiner Methode aussehen?
Also das hier wäre schon sicher:$data = mysql_real_escape_string($_POST['data']); $query = "SELECT * FROM tabelle WHERE data = '$data'"; $result = mysql_query($query);
Durch das escapen der Eingabe und die Anführungszeichen in der Query (
) ist es unmöglich eine SQL-Injection durchzuführen vor der du dich ja schützen möchtest. Wenn in $_POST['data'] z.b.'
oder'
oder sonst was stünde, würde einfach danach in der Tabelle gesucht werden aber der "böse Code" wird nie ausgeführt.OR
Falls du noch Rechenpower verbraten möchtest und die Eingabe auf normale Wörter wie "DELETE" überprüfen willst kannst du trotzdem preg_match verwenden... als Pattern einfach
verwenden und es sollte funktionieren (F1)./wort-1|wort-2|wort-3|blabla/i
Alle weiteren "bösartigen Begriffe" findest du im Handbuch von MySQL (F2)
Nachdem du ja nur bestimmte Zeichen zulassen willst bietet sich preg_match wieder an...$pattern = '/^[0-9a-zA-Z\[\]:]*$/'; if(!preg_match($pattern, $input)) echo('böse!'); else echo('gut');
-
hackyourlife schrieb:
Was hast du bitte vor? Wenn du nur eine SELECT-Abfrage mit WHERE beschränken möchtest kannst du dir das alles sparen, dann reicht mysql_real_escape_string. Wenn du den User eine SQL-Abfrage eingeben möchtest (das ist nicht zu empfehlen), dann wirst du um das Filtern nicht herumkommen...
Ach so, bin ein wenig über vorsichtig, dann lass ich die Prüfung nach INSERT usw besser weg. Wie ist es, wenn die Doppelpunkte und Eckigen Klammern 2xHIntereinander vorkommen müssen, also [[test1::text]][[test2::text]] aber nicht [test:text][test:text]. Würde es so stimmen? \^[0-9a-zA-Z\[{2}\]{2}:{2}]*$\
private function getSequreInput($input) { # String escapen $input_escaped = mysql_real_escape_string($input); # Nach erlaubten Zeichen filtern $pattern = ' \^[0-9a-zA-Z\[{2}\]{2}:{2}]*$\'; if(!preg_match($pattern, $input)) return ' '; } else { return $input_escaped; } }
EDIT: Habs schon, mit einem RegEx Tool kann man das sehr einfach aufbauen und gleich testen. Habs in php übersichtshalber mit Variablen gemacht. Wenn man das Ding zusammenbaut ist es ein Mords-Ding, nur um meine lustige Klammer-Eingabe zu prüfen. Hier wird aber nicht mehr einfach nach Zeichen, sondern nach einem Eingabemuster geprüft. Hoffentlich ist das jetzt sicher genug.
/^([\[]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\:]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)(([\s]?[\(]([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\s]?[\)])?)[\]]{2})((([\|]{2})?[\[]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\:]{2}([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)(([\s]?[\(]([a-zA-Zöäü]+[0-9]*)(([\s_]?[a-zA-Zöäü]+[0-9]*)*)[\s]?[\)])?)[\]]{2})*)$/
Beitrag zuletzt geändert: 28.6.2012 19:12:37 von pixilab -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage