Frage

Auf diese Frage gibt es hier bereits eine Antwort:

Ich habe eine Datenbank mit Namen wie John Doe usw.Leider enthalten einige dieser Namen Anführungszeichen wie Keiran O'Keefe.Wenn ich nun versuche, nach solchen Namen zu suchen, gehen Sie wie folgt vor:

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' 

Ich erhalte (verständlicherweise) eine Fehlermeldung.

Wie verhindere ich, dass dieser Fehler auftritt?Ich verwende Oracle und PLSQL.

War es hilfreich?

Lösung

Das Escape-Zeichen ist ', daher müssten Sie das Anführungszeichen durch zwei Anführungszeichen ersetzen.

Zum Beispiel,

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'

wird

SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'

Allerdings ist es wahrscheinlich falsch, dies selbst zu tun.Ihre Sprache verfügt möglicherweise über eine Funktion zum Escapen von Zeichenfolgen zur Verwendung in SQL. Eine noch bessere Option ist jedoch die Verwendung von Parametern.Normalerweise funktioniert dies wie folgt.

Ihr SQL-Befehl wäre:

SELECT * FROM PEOPLE WHERE SURNAME=?

Wenn Sie es dann ausführen, übergeben Sie „O'Keefe“ als Parameter.

Da die SQL analysiert wird, bevor der Parameterwert festgelegt wird, besteht für den Parameterwert keine Möglichkeit, die Struktur der SQL zu ändern (und es geht sogar etwas schneller, wenn Sie dieselbe Anweisung mehrmals mit unterschiedlichen Parametern ausführen möchten).

Ich sollte auch darauf hinweisen, dass Ihr Beispiel zwar nur einen Fehler verursacht, Sie sich jedoch vielen anderen Problemen aussetzen, wenn Sie Zeichenfolgen nicht ordnungsgemäß maskieren.Sehen http://en.wikipedia.org/wiki/SQL_injection für einen guten Einstieg bzw. den darauffolgenden Klassiker xkcd-Comic.

alt text

Andere Tipps

Oracle 10-Lösung ist

SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'

Parametrisierte Abfragen sind Ihr Freund, wie von Matt vorgeschlagen.

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

Sie schützen Sie vor den damit verbundenen Kopfschmerzen

  • Zeichenfolgen mit Anführungszeichen
  • Abfragen anhand von Datumsangaben
  • SQL-Injektion

Die Verwendung von parametrisiertem SQL hat weitere Vorteile: Sie reduziert den CPU-Overhead (sowie andere Ressourcen) in Oracle, indem sie den Arbeitsaufwand reduziert, den Oracle zum Parsen der Anweisung benötigt.Wenn Sie keine Parameter verwenden (wir nennen sie in Oracle Bind-Variablen), werden „select * from foo where bar='cat'“ und „select * from foo where bar='dog'“ als separate Anweisungen behandelt, wobei „ select * from foo where bar=:b1" ist die gleiche Anweisung, was bedeutet, dass Dinge wie Syntax, Gültigkeit der referenzierten Objekte usw. nicht erneut überprüft werden müssen.Bei der Verwendung von Bind-Variablen treten gelegentlich Probleme auf, die sich normalerweise darin äußern, dass nicht der effizienteste SQL-Ausführungsplan erstellt wird. Es gibt jedoch Problemumgehungen dafür, und diese Probleme hängen wirklich von den Prädikaten ab, die Sie verwenden, von der Indizierung und vom Datenversatz.

Die Eingabefilterung erfolgt normalerweise auf Sprachebene und nicht auf Datenbankebene.
PHP und .NET verfügen beide über ihre jeweiligen Bibliotheken zum Escapen von SQL-Anweisungen.Überprüfen Sie Ihre Sprache und sehen Sie, was verfügbar ist.
Wenn Ihre Daten vertrauenswürdig sind, können Sie einfach eine Zeichenfolge ersetzen, um ein weiteres „ vor dem „ einzufügen, um es zu maskieren.Normalerweise reicht das aus, wenn keine Gefahr besteht, dass die Eingabe böswillig ist.

Ich nehme an, eine gute Frage ist, welche Sprache verwenden Sie?
In PHP würden Sie Folgendes tun:SELECT * FROM PEOPLE WHERE SURNAME='mysql_escape_string(O'Keefe)'
Da Sie jedoch die Sprache nicht angegeben haben, schlage ich vor, dass Sie sich eine Escape-String-Funktion in MySQL oder einer anderen Sprache in Ihrer Sprache ansehen.

Wenn Sie Zend Framework verwenden, finden Sie hier den Code zum Ausgeben von Anführungszeichen

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

$db->quoteInto('your_query_here = ?','your_value_here');

Zum Beispiel ;

//SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' will become
SELECT * FROM PEOPLE WHERE SURNAME='\'O\'Keefe\''

Gefunden bei unter 30 auf Google...

Oracle SQL-FAQ

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top