Regulärer Ausdruck für SQL-Where-Klausel gesucht
Goofy
- programmiertechnik
Guten Morgen,
ich hätte mal gerne wieder ein Problem. Ich habe mich ein (sehr kleines) bißchen in Reguläre Ausdrücke eingelernt, da ich einen Ausdruck für eine SQL-Where- Klausel suche.
Hintergrund ist, daß ich die Where-Klausel in einem Eingabefeld angeben lassen will und natürlich kann da alles Mögliche reingeschrieben werden. Gibt es da schon existierende Lösungen? Und kennt ihr vielleicht einen guten Link? Das Thema ist doch recht komplex für den Einstieg in Reguläre Ausdrücke und ich sollte eigentlich erst mal kleinere Brötchen backen...
Über eine kleine Starthilfe wäre ich euch trotzdem sehr dankbar!
Vielen Dank
Grüße Goofy
Hi,
Hintergrund ist, daß ich die Where-Klausel in einem Eingabefeld angeben lassen will und natürlich kann da alles Mögliche reingeschrieben werden.
hoppla. Das ist sehr, sehr, *sehr* gefährlich. Insbesondere wenn die erlaubte Syntax hochgradig komplex ist, wie es bei Regular Expressions der Fall ist, fällt eine Prüfung auf Gültigkeit extrem schwierig aus - und ruckzuck hat Dir jemand aus dem SELECT- ein DELETE-Statement gemacht.
Gibt es da schon existierende Lösungen?
So pauschal gefragt *kann* es keine geben. Die meisten DBMSse beherrschen keine Regular Expressions, bzw. zumindest nicht ohne weiteres.
Cheatah
Hallo Cheatah,
was er sucht ist wohl eher ein regulärer Ausdruck,
um zu prüfen ob die eingegebene where Klausel legal ist.
Das müßte leicht gehen, wenn man einfach die Grammatik
für WHERE aus einer guten Doku nimmt.
Info mysql ist da leider nicht so auskunftsfreudig.
Meine Bücher habe ich gerade nicht zur Hand.
CYa
GONZO
Hey Cheatah
hoppla. Das ist sehr, sehr, *sehr* gefährlich.
Bingo! Und deshalb will ich, bevor das Statement an die Datenbank geht, auch auf Gültigkeit prüfen lassen.
Ich hab mir schon gedacht, daß es schwierig und natürlich auch sehr, sehr, *sehr* gefährlich wird ;-).
Die Eingabe soll in den bereits bestehenden String eingefügt werden. Also in etwa so: select * from dbt where bla = x and (**Eingabefeld**) order by ...
Kann man da noch ein delete-Statement einfügen? Ich weiß, der User ist grundsätzlich böse *g*, aber das müßte dann doch einen SQL-Fehler geben, oder täusche ich mich da?
So pauschal gefragt *kann* es keine geben. Die meisten DBMSse beherrschen keine Regular Expressions, bzw. zumindest nicht ohne weiteres.
Aber ein programmtechnisches Abfangen, sei es mit JavaScript (eher schlechte Idee) oder Perl (bessere Idee) ist doch möglich?
Bye Goofy
Hi,
Bingo! Und deshalb will ich, bevor das Statement an die Datenbank geht, auch auf Gültigkeit prüfen lassen.
ach so, da habe ich Dich missverstanden, sorry.
Kann man da noch ein delete-Statement einfügen? Ich weiß, der User ist grundsätzlich böse *g*, aber das müßte dann doch einen SQL-Fehler geben, oder täusche ich mich da?
Nicht, wenn das DBMS Befehlstrenner akzeptiert.
Aber ein programmtechnisches Abfangen, sei es mit JavaScript (eher schlechte Idee) oder Perl (bessere Idee) ist doch möglich?
Regular Expressions reichen da nicht aus. So dürfte beispielsweise ein "; DELETE FROM" verboten sein (wenn man mal davon ausgeht, das Semikolon sei der Befehlstrenner), innerhalb von Singlequotes jedoch nicht. Nein, Du brauchst einen Grammatik-Parser, der dem Deines DBMS' entspricht. Von der Komplexität her veranschlage ich die Größenordnung einiger Dutzend bis einiger hundert Codezeilen. Die Alternative ist, _nicht_ die Eingabe einer WHERE-Klausel zu ermöglichen, sondern über eine GUI ausschließlich die erlaubten Wertekombinationen anzubieten, welche Du dann höchstens noch richtig kodieren musst.
Cheatah
ach so, da habe ich Dich missverstanden, sorry.
kein Problem, gib mir einfach ein Bier aus und die Sache ist vergessen *g*
Nicht, wenn das DBMS Befehlstrenner akzeptiert.
Daran hab ich mal überhaupt nicht gedacht. Ok, das kann ziemlich gefährlich werden. Ich werde mir das ganze nochmal durch den Kopf gehen lassen und mir ne Alternative suchen.
Dank dir
Gruß Goofy
Hi,
ach so, da habe ich Dich missverstanden, sorry.
kein Problem, gib mir einfach ein Bier aus und die Sache ist vergessen *g*
gerne doch:
µ
/ \
|#|
|_|
Cheatah ;-)
hi,
Die Eingabe soll in den bereits bestehenden String eingefügt werden. Also in etwa so: select * from dbt where bla = x and (**Eingabefeld**) order by ...
da sollte es weniger probleme mit der sicherheit geben, aber muss immer noch aufpassen, wo man den string einfügt. manche rdbms erlauben zum beispiel auch unterabfragen. generell würde ich einige schlüsselwörter nicht erlauben, so wie drop oder delete oder update. dann hat man schon mal ein wenig mehr sicherheit.
Aber ein programmtechnisches Abfangen, sei es mit JavaScript (eher schlechte Idee) oder Perl (bessere Idee) ist doch möglich?
Bye Goofy
javascript geht gar nicht, weil das client-seitig ausgeführt wird, und somit auch verändert werden kann. javascript prüfungen von eingabe feldern dinen mehr dazu, das nicht immer fehlerhafte eingaben zum server geschickt werden, sondern schon beim client gemekert wird. was deine sicherheit betrifft, mußt du auf jeden fall eine prüfung auf der server seite vollziehen, zum beispiel mit php, das reguläre ausdrücke unterstützt.
Ilja
da sollte es weniger probleme mit der sicherheit geben, aber muss immer noch aufpassen, wo man den string einfügt. manche rdbms erlauben zum beispiel auch unterabfragen.
Hey Ilja
Abfragen darf man bei dieser Tabelle eigentlich alles, wegen mir. Es geht mir nur um die Integrität der Daten.
Ein Drop wäre da schon das höchste der Gefühle und die Gewährleistung für einen besc***en Nachmittag.
Wenn ich nicht doch noch über einen passenden Regulären Ausdruck stolpere, werde ich wahrscheinlich Cheatahs Rat befolgen und vom Eingabefeld abkommen.
Gruß Goofy