Welche Zeichen dürfen nicht im Text stehen?

Hallo,

UPDATE tab SET feld = „Text“;

ich weiß natürlich, dass " nicht im Text stehen darf. Wenn der Text mit ’ begrenzt wird, darf dieses ’ nicht innerhalb des Textes einfach vorkommen, aber auch Backslash \ geht nicht, da es zur Interpretation von Steuerzeichen benutzt wird.

Gibt es weitere Zeichen, die von MySQL und Oracle benutzt werden und daher nicht übergeben werden können?

Ein Problem hatte ich auch mit den schrägen Hochkommas (Ascii-Werte 132,145,146,147,148), von denen bin ich aber noch nicht sicher, ob der Windowsanwender sie überhaupt eingeben kann.

Für jegliche Hinweise wäre ich sehr dankbar,
Fralang

Moin moin,

Gibt es weitere Zeichen, die von MySQL und Oracle benutzt
werden und daher nicht übergeben werden können?

Ich glaub du verstehst da was nicht .

Es gibt einen delimiter , der an den Anfang und an das Ende einer Zeichenkette kommt. Damit diese Zeichenkette nicht vorzeitig beendet wird , darf also nicht das 2 mal dieser delimiter vorkommen.
Um ein zeichen unwirksam zu machen , wird es escaped . Das heist es wird ein Zeichen dafor gesetzt das dem System sagt, das folgende zeichen hat keine Bedeutung.

Kommt also ein ’ als Trenner vor , so sollte man ’ es in der bedeutung wirkungslos machen. Da aber auch das Zeichen \ selber im text vorkommen könnte muss das auch escaped werden. Also \ .

Ein Problem hatte ich auch mit den schrägen Hochkommas
(Ascii-Werte 132,145,146,147,148), von denen bin ich aber noch
nicht sicher, ob der Windowsanwender sie überhaupt eingeben
kann.

Im zweifel einfach alles escapen.

Die folgenden Sequenzen werden z.b. bei php mysql_real_escape escaped.

\x00, \n, \r, \, ', " und \x1a

nicht escaped wird
% and _.
Das sind Platzhalter in verbindung mit LIKE, GRANT oder REVOKE

hochkommas sollten also nix bewirken wenn sie in delimiter eingeschlossen sind.

Hallo Thomas,

Da aber auch das Zeichen \
selber im text vorkommen könnte muss das auch escaped werden.
Also \ .

Ja, um diese Zeichen, die escaped werden müssen, um die geht es mir. Danke für deine Hinweise. '," und \ war mir schon klar. Du sagst also auch die binäre 0, das CR und das LF-Zeichen und mit dem x1a meinst du vielleicht das x1b das Ascii-ESC?

Von den Steuerzeichen AScii

Moin moin,

Von den Steuerzeichen AScii

Hi,

Warum soll das nicht möglich sein ? Und warum gehts du davon
aus was möglich wäre. Es ist immer möglich , solange ich
zeichen eingeben kann , kann ich auch steuerzeichen eingeben.

Warum escaped php dann nicht alle 32 Steuerzeichen, sondern, wie du selber sagst, nur vier davon?

Wenn so bei dir sicherheit aussieht, dann stelle das nicht ins
internet.

Ich habe nichts ins Internet gestellt, sondern gefragt. Ich bin dir ja dankbar für deine Antwort. Aber ich möchte nicht unbedingt nach allen 32 Steuerzeichen suchen müssen. Es geht auch um die Laufzeit.

Übrigens habe ich inzwischen mit MySQL ausprobiert, was mit x0, xA und xD passiert. Garnichts. Er trägt es in die Datenbank einfach genauso ein. Setzt man einen Backslash \ davor, nimmt er ihn weg und trägt den Rest ein, wie wenn kein Backslash vorhanden gewesen wäre. Also wozu escapen?

Mit Oracle habe ich es nicht ausprobiert. Es würde mir wirklich helfen, weißt du, ob Oracle hier ein anderes Verhalten aufweist?

Gruß Fralang

Hallo FraLang,

was Thomas mit dem Stichwort „Sicherheit“ meinte ist, dass man auf diese Weise eine klassische Sicherheitslücke aufmachen kann, insbesondere wenn solche Skripte übers Internet erreichbar sind. Du solltest dich unbedingt zum Thema „SQL Injections“ schlaumachen, wenn du etwas in der Richtung planst.
Ansonsten werden von den Datenbanktreibern der meisten Sprachen (z.B. PHP) sogenannte Prepared Statements unterstützt, bei deren Einsatz du dir gar keine Gedanken mehr um Escaping machen musst. Performanter als normale Statements sind sie zudem auch noch (zumindest wenn man Anfragen mehrfach ausführt).

Gruß
Chondron

Hallo Chondron,

SQL Injections" schlaumachen, wenn du etwas in der Richtung
planst.

Ich arbeite mit Visual Basic und MySQL, später auch Oracle.
Die Daten übergebe ich, vereinfacht, durch:

call myProc(’„wert1“,„wert2“,„wert3“’);

Zuvor aber ersetze ich %,,& und alle Hochkommas durch %a,%b,%c,usw.

MySQL übernimmt in der Proz. den Parameter myString und zerteilt ihn:

set @myVar = ELT(1,myString);
set @myVar = func_retrieve_orig_chars(@myVar); # Rückübersetzung
update tab set col = @myVar;

Kann mir dabei noch irgendetwas passieren? Ist hierbei noch SQL Injection möglich? Gibt es noch weitere Zeichen, die ich ersetzen sollte?

Gruß Fralang