Entwickler-Ecke

Datenbanken - Anführungszeichen in SQL Statement


NOS1971 - Do 06.03.14 21:11
Titel: Anführungszeichen in SQL Statement
Hallo,

ich würde gern in ein Textfeld einen String speichern in dem es auch " gibt ... wie behandle ich das ? Es sollen html tags in einem textfeld gespeichert werden die auch src="iuhiuhikuh" style="lkdshfgjdhljh" beinhalten können ...

aber das INSERT INTO kommt ja so damit nicht klar ... was tun ?


WasWeißDennIch - Do 06.03.14 22:38

Wie machst Du es denn? Ich kenne weder SQLite noch Deine Zugriffskomponenten, aber wenn diese SQL-Parameter unterstützen sollten, empfehle ich dringend die Verwendung derselben.


NOS1971 - Do 06.03.14 22:44

Hier ist ein Beispiel .. ich nutze nur einen sql wrapper ... die url in die db eintragen ist kein thema aber wie handle ich anführungszeichen in einem text


Delphi-Quelltext
1:
SQLExecString := 'INSERT INTO ResultURLTable(URL, URLLINK, STATUS, PAGERANK, HTTPSTATUS) VALUES ("' + tempurlstring + '","' + linktagsource + '",-1,-1,-1' + ');';                    


tempurlstring enthält eine URL und linktagsource den Source des links also etwas in der art <a href="http://test.de" style="color:#000000;" >Linktext</a>

wenn ich das zusammenführe sieht es so aus


Delphi-Quelltext
1:
SQLExecString := 'INSERT INTO ResultURLTable(URL, URLLINK, STATUS, PAGERANK, HTTPSTATUS) VALUES ("http://test.de","<a href="http://test.de" style="color:#000000;" >Linktext</a>",-1,-1,-1' + ');';                    


und genau da kommt er halt nicht mit klar


Xion - Do 06.03.14 23:07

Prinzipiell kannst du deine Anführungszeichen escapen, indem du ein Anführungszeichen durch zwei ersetzt (z.B: http://stackoverflow.com/questions/7550345/how-to-escape-in-sqlite).

So oder so solltest du vorsichtig sein, was du SQL übergibst. Sonst hat schnell ein Angreifer die Kontrolle über die gesamte Datenbank (SQL Injection [http://de.wikipedia.org/wiki/SQL-Injection]).


NOS1971 - Do 06.03.14 23:09

Also es ist so das die DB für eine Webseitenanalyse lokal auf dem Rechner läuft .. also unproblematisch :-) ... ich schaue mal ob ich das so hinbekomme indem ich ein " durch "" ersetze ... :-)


NOS1971 - Do 06.03.14 23:12

Erstklassig ... das war es :-) nun ist alles da wo es hin soll :-) ...

Vielen lieben Dank und eine gute Nacht


Nersgatt - Fr 07.03.14 09:08

Generell ist es besser, parametrisierte Abfragen zu verwenden. Das hast Du solche Probleme nicht.

Das sieht dann ungefähr so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
myQuery.Sql.Text := 'INSERT INTO TABELLE (Wert1, Wert2, Wert3) VALUES (:Wert1, :Wert2, Wert3)';
myQuery.ParamByName('Wert1').asInteger := 4711;
myQuery.ParamByName('Wert2').asFloat := 4711.123;
myQuery.ParamByName('Wert3').asString := 'Hallo, "NOS"';
myQuery.ExecSql;


Je nach Zugriffskomponenten kann das ein wenig abweichen. Aber auf diese Art musst Du Dich gar nicht darum kümmern, irgendwas zu escapen. Das ist deutlich sicherer.
Sonst legt vielleicht jemand eine präparierte Seite auf seinen Server, die Deinen Spider abstürzen lässt.