2012-08-14 14 views
6

Ich muss eine Suche implementieren, wo Benutzer * als Platzhalter eingeben können. Die Datenbank, die sie suchen, ist ein SQL-Server. Ich dachte, nur die * mit einem% ersetzt:So verwenden Sie * als Platzhalter in SQL-Abfrage sicher

userInput = userInput.replace('*', '%'); 

Ich mache mir Sorgen, dass ich da mache die „von Hand“ Ich könnte einige Fehler oder Sicherheitslücken einzuführen. Siehst du irgendwelche Probleme dabei? Gibt es eine Bibliothek, um das für mich zu tun?

Ich verwende Hibernate als ORM-Mapper und Criteria-API, um die Abfrage zu erstellen, wenn es bei Antworten hilft.

+1

Wenn Sie 'like' verwenden, möchten Sie auch die vorhandenen'% ',' _' und '[...]'. Dies * könnte * ein Duplikat sein von: [Escape eine Zeichenfolge in SQL Server, so dass es sicher ist, in LIKE-Ausdruck zu verwenden] (http://stackoverflow.com/questions/258757/escape-a-string-in-sql- server-so-dass-es-ist-sicher-zu-verwenden-in-like-expression) – Kobi

+0

aber solange Sie eine PreparedStatement verwenden, werden Sie keine Sicherheitslücken induzieren. –

+0

@Kobi Danke, ich wusste nichts über _ und []. Versuchen Sie, wie diese die Abfrage beeinflussen. Hibernate ermöglicht es mir, einen Escape-Charakter zu setzen, damit ich diese Frage mit mir aktualisieren kann, indem ich versuche, Dingen zu entkommen, die Benutzer nicht verwenden sollen. – palto

Antwort

2

Genau das machen wir in unserem Unternehmen. Wir haben zwei Produkte, eines, das einen einfachen Ersatz im Code wie Ihr Beispiel verwendet. Der andere, der sehr speicherprozedurlastig ist, macht es innerhalb der "Suche" gespeichert.

In beiden Fällen gab es keine Sicherheitslücken oder Benutzerbeschwerden über das System.

einfach das gespeicherte Prozedur Layout zu zeigen, aber wahrscheinlich überflüssig wie Sie gesagt haben Ihre Verwendung von ORM:

CREATE PROC [dbo].[p_aaa] 
    @username nvarchar(100) = 'dbo', 
    @rows int = 0, 
    @name nvarchar(100) = '%'  
AS 

SET @name = REPLACE(@name, '*', '%') 
2

Ich glaube, ändert * zu% wird keine Probleme verursachen, wenn alle Daten in dieser Tabelle ist öffentlich basierend auf diesem Suchwert. Es gibt auch similar topic, die mehr regexp zu SQL-Beispielen hat.

Dadurch wird Ihre Anwendung unabhängiger als mit database vendror-specific regexp matching mechanism.

+0

Ist es nicht umgekehrt? Wenn ich es in der Service-Ebene transformiere, bin ich schwer zu programmieren, was ich in dieser speziellen Datenbank tun muss. Wenn ich es in der DAO-Schicht mache, kann ich verschiedene Implementierungen für verschiedene Speicher haben. Ich könnte sogar einen NOSQL-Datenspeicher haben. – palto

+0

Ich denke du hast Recht .. – JMelnik

Verwandte Themen