Backslash in String?
-
c.rackwitz schrieb:
deus, dann hab ich die frage falsch interpretiert. konnte ja nicht ahnen, dass jemand sowas nicht weiss. mein fehler.
Das kommt leider recht häufig vor. Daher auch der FAQ-Eintrag, weil ich es irgendwann leid war immer wieder zu erklären
c.rackwitz schrieb:
davon abgesehen lassen sich backslashes in strings so quoten.
Was du damit sagen willst versteh ich leider nciht. Deine Vorgehensweise wird nie benötigt (programmatisch einen \ durhc 2 zu ersetzen)
-
dEUs schrieb:
c.rackwitz schrieb:
davon abgesehen lassen sich backslashes in strings so quoten.
Was du damit sagen willst versteh ich leider nciht. Deine Vorgehensweise wird nie benötigt (programmatisch einen \ durhc 2 zu ersetzen)
Passt perfekt hierher.
Es gibt Fälle wo man in einem String (Variable) alle \ quoten muss. Und nicht nur die Backslash. Bei MySQL wenn man den Query der DB übergibt. MySQL hat aber eine Funktion dafür. (mysql_escape_string() oder so ähnlich)Nach so einem Spezialfall wurde aber hier nicht gefragt und deshalb ist es die Standardantwort aus der FAQ.
-
Einer Datenbank-Abfrage übergibt man nie Daten im Query-String!!! Da öffnest Du tür und Tor für SQL-Injects!
Dazu gibt es Parameter, die man separat der Datenbank übergibt!
-
Dann schreibe mal bitte einen INSERT dem du beim INSERT keine Daten (z.B. Text) übergibst.
Also z.B.
INSERT INTO tabelle SET spalte = 'Hallo Welt';
bzw.
INSERT INTO tabelle (spalte) VALUES ('Hallo Welt');
-
INSERT INTO tabelle (spalte) VALUES (@MyText);
Und das "@MyText" übergibst Du direkt Deiner Datenbankverbindung!
Suche doch bitte mal nach SQL-Inject...Jede vernünftige Datenbank unterstützt das übergeben von Parametern!
-
kann MySQL das?
-
Unix-Tom schrieb:
dEUs schrieb:
c.rackwitz schrieb:
davon abgesehen lassen sich backslashes in strings so quoten.
Was du damit sagen willst versteh ich leider nciht. Deine Vorgehensweise wird nie benötigt (programmatisch einen \ durhc 2 zu ersetzen)
Es gibt Fälle wo man in einem String (Variable) alle \ quoten muss. Und nicht nur die Backslash.
Zugegeben, an diesen Fall habe ich nciht gedacht
-
Du kannst mir glauben wenn ich dir sage das ich weiß was SQL-Injetions sind.
Was steht in @MyText drin.
Liefere doch mal etwas Code bitte.
-
In @MyText steht nix drin! Das ist ein Platzhalter für einen Parameter, welcher der DB separat übergeben wird!!!
Das was MySql macht mit dem Esquaping macht ist IMHO nur gemurkse und nicht eine saubere Lösung...
Eine saubere Lösung ist z.B.:
http://www.uni-kiel.de/rz/lehr/doku/perlkurs/node88.htmlAdd: Und die MS-DB Schnittstellen können das alle... z.B. CDaoRecordset::SetParamValue
-
Schön. Und was glaubst du was dieser Code dann macht?
Der setzt auch nur einen SQL-Query zusammen und senden diesen an die Datenbank.Wenn du dann in diesem Text ein Escape drin hast muss du dies auch ändern.
Ob das die Funktionen zum Binden von Parametren dann im Hintergrund machen ändert nichts daran das es gemacht werden muss.Du spricht im Übrigen von einem Scriptsprache, Framework oder sonstwas.
Ich spreche von Direkt mit der DB kommunizieren über C-API
DU kannst auch ODBC verwenden um mit Datenbank zu sprechen nur ist das nicht sehr effizient.
-
Ich will Dir wirklich nicht zu Nahe treten... aber wer sowas behauptet hat von "echten" Datenbanken keine Ahnung...
Schau Dir mal bitte die Native Interfaces von "echten" Datenbanken wie DB2, Oracle, MS-SQL, usw. an!
Nur als kleiner Hinweis (DB2):
http://www.devx.com/IBMDB2/Article/27475
(und da im besonderen BindParam)
-
Und was hat dies nun mit SQL-Injektions zu tun.
Datenbanken sprechen SQL.
Wie eine API deinen CODE dann zu SQL zusammensetzt stand hier nie zur Debatte.BindParam ist ein Befehl eines API.
Das hat nichts mit SQL zu tun.Ob andere Datenbanken den Text escapen müssen stand hier nie zur Debatte. Ich habe von MySQL gesprochen.
-
Unix-Tom schrieb:
Ich habe von MySQL gesprochen.
Und ich habe davon gesprochen das sowas murks ist, wenn man Daten in SQL-Strings verpacken muss!
Das macht heute keine vernünftige Datenbank!