Validierungsfunktion - SQL Syntax prüfen
Steven Binder
- php
0 Cheatah0 Steven Binder
Hallo,
ich hab leider nichts passendes im forum gefunden deswegen post ich jetzt mal...
kennt vieleicht jemand über des folgende thema eine funktion ? oder doku oder sonstiges ? ich denke doch mal das da einer bestimmt schon ne funktion für gemacht hat ...
Beschreibung: Die Funktion wird benötigt, um vor dem Senden von Daten an die
Datenbank zu prüfen, ob unerlaubterweise SQL-Befehle eingegeben wurden.
Beispiel: Gefragt wird der user nach seinem Namen und er gibt ein " Hans;
insert into user user_name, user_password values 'hacker', 'ichhabeuch' "
Mit einer solchen Eingabe würde man nicht nur einen Namen in eine
Benutzertabelle eintragen, sondern einen zweiten Eintrag in eine andere
Tabelle machen.
Die Funktion sollte daher "false" liefern, wenn kein Verdacht auf ein
SQL-Befehl besteht und "true", wenn ein SQL-Befehl gefunden wurde.
ich mein es ist zwar denke ich nicht der fall das jeder weiß wie die tabellen bzw spalten einer datenbank heisen aber möglich wärs ja ..
danke schon mal im voraus
Gruß Steven
Hi,
Beschreibung: Die Funktion wird benötigt, um vor dem Senden von Daten an die
Datenbank zu prüfen, ob unerlaubterweise SQL-Befehle eingegeben wurden.
falsch.
Du benötigst eine "Funktion", die dafür sorgt, dass die Eingaben des Users ausschließlich als Feldinhalte interpretiert werden.
Beispiel: Gefragt wird der user nach seinem Namen und er gibt ein " Hans; insert into [...]
Daraus machst Du:
INSERT INTO deine_tabelle (spalte) VALUES (' Hans; insert into [...]')
Es existiert kein Problem. Deine Aufgabe ist es dafür zu sorgen, dass bei _keiner_ Eingabe des Users ein Problem existiert.
Wenn Du ein hinreichend mächtiges DBMS benutzt, dann beschäftige Dich mit Bind-Variablen, die Dein Problem vollständig eliminieren. AFAIK kannst Du dies bei MySQL vergessen.
Cheatah
Hey,
Beispiel: Gefragt wird der user nach seinem Namen und er gibt ein " Hans; insert into [...]
Daraus machst Du:
INSERT INTO deine_tabelle (spalte) VALUES (' Hans; insert into [...]')
hmm ja schon aber was wäre wenn dein SQL so aussieht
SELECT * FROM user WHERE name = '$name';
und $name wird per formular übergeben...
der böse mensch gibt aber ein:
hallo'; DELETE FROM user WHERE id > 0;\
das würde dan so aussehen:
SELECT * FROM user WHERE name = 'hallo';'; DELETE FROM user WHERE id > 0;
ich glaube mysql ist es wurst ob da jetzt noch ein ; ist oder nicht .. da bin ich gerade beim ausprobieren ...
aber ich lasse mich gerne vom gegenteil überzeugen ;)
Gruß Steven
Hi,
was ist so schwer daran, dir selbst eine kleine Funktion zu schreiben, die entweder auf ; oder auf " bzw. ' prüft, wenn es Dir so viele Kopfschmerzen bereitet.
AFAIK reicht eine vernünftige Stringbehandlung, wie Cheatah schon sagte.
ciao
romy
was ist so schwer daran, dir selbst eine kleine Funktion zu schreiben, die entweder auf ; oder auf " bzw. ' prüft, wenn es Dir so viele Kopfschmerzen bereitet.
natürlich ist das kein problem .. das werde ich auch machen .. mir gings eher allgemein um des thema ... und ich hab auch festgestellt das es eh net so leicht geht wie ich mir des so mal überlegt habe...
trozdem thx ;)
Gruß Steven
wenn mir jetzt einer sagen könne das mysql_query() nur den ersten befehl ausführt wären meine bedenken ganz weg.
den was wäre bei folgendem fall:
Ausgehend von "SELECT * FROM user WHERE name = '$name';"
mit:
hallo'; DELETE FROM user WHERE id > 0; select from user where
name='"
würde mit
"SELECT * FROM user WHERE name = 'hallo'; DELETE FROM user WHERE
id > 0; select from user where name='';"
eine vollständig korrekte Syntax ergeben - oder nicht?
Gruß Steven
Hi!
"SELECT * FROM user WHERE name = 'hallo'; DELETE FROM user WHERE
id > 0; select from user where name='';"eine vollständig korrekte Syntax ergeben - oder nicht?
Nein. Du must jede SQL-Anweisung in ein eigenes mysql_query() stellen:
mysql_query( "SELECT * FROM user WHERE name = 'hallo'" );
mysql_query( "DELETE FROM user WHERE id > 0" );
mysql_query( "select from user where name=''" );
Mir mysql_query( ... ) or die( mysql_error() ) solltest du überprüfen, ob alles fehlerfrei abläuft. Alles weiter in http://www.php.net/manual/de/ref.mysql.php
Gruß Herbalizer
Hi,
INSERT INTO deine_tabelle (spalte) VALUES (' Hans; insert into [...]')
hmm ja schon aber was wäre wenn dein SQL so aussieht
SELECT * FROM user WHERE name = '$name';
und $name wird per formular übergeben...
$name wird aus $_GET['name'] bzw. $_POST['name'] ermittelt, wie ich stark hoffe.
der böse mensch gibt aber ein:
hallo'; DELETE FROM user WHERE id > 0;\
Ich habe schon verstanden, worauf Du hinaus willst.
das würde dan so aussehen:
Nein, würde es nicht, weil _Du_ dafür sorgst, dass das komplette "hallo'; DELETE FROM user WHERE id > 0;" als ein einziger String interpretiert wird. Was hierzu bei Deinem DBMS gegeben sein muss, erfährst Du in dessen Doku.
SELECT * FROM user WHERE name = 'hallo';'; DELETE FROM user WHERE id > 0;
SELECT * FROM user WHERE name = 'hallo''; DELETE FROM user WHERE id > 0;'
Je nachdem, wie Dein DBMS Escaping interpretiert. Bei MySQL weiß ich es nicht auswendig.
Cheatah