Ich schreibe eine Suchfunktion und habe mir diese Abfrage mit Parametern ausgedacht, um SQL-Injection-Angriffe zu verhindern oder zumindest einzuschränken. Wenn ich es jedoch über mein Programm ausführe, wird nichts zurückgegeben:
SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')
Können Parameter so verwendet werden? oder sind sie nur in einer Instanz gültig wie:
SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'
(Wo <string>
ist das Suchobjekt).
EDIT: Ich konstruiere diese Funktion mit VB.NET. Hat das Auswirkungen auf die Syntax, die ihr beigetragen habt?
Außerdem habe ich diese Anweisung in SQL Server ausgeführt: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE
% max% ') `und das gibt Ergebnisse zurück.
SQL
Injektionen, nurLIKE
Injektionen. Dies bedeutet , dass die Benutzer Sonderzeichen eingeben können, wie%
^
und_
welcheLIKE
speziell interpretiert. Dies bedeutet, dass der Benutzer möglicherweise nicht das erhält, was er für bestimmte Suchvorgänge erwartet. Beispielsweise kann eine Suche nach'less than 1% fat'
das Ergebnis zurückgeben'less than 1% of doctors recommend this - it's full of fat!'
.searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]")
, wodurch eine ähnliche Injektion vermieden wird (solange Sie die Escape-Klausel nicht verwenden).Nun, ich würde gehen mit:
Dim cmd as New SqlCommand( "SELECT * FROM compliance_corner"_ + " WHERE (body LIKE @query )"_ + " OR (title LIKE @query)") cmd.Parameters.Add("@query", "%" +searchString +"%")
quelle
cmd.Parameters.Add
wirdcmdLoad.Parameters.AddWithValue
oder ist es eine Frage? Ich verstehe, dass James Antwort von 2008 ist :)du musst:
LIKE '%' + @param + '%'
quelle
Möglicherweise müssen Sie die% -Zeichen mit Ihrem Parameter verketten, z.
WIE '%' || @query || '%'
Edit: Eigentlich macht das vielleicht überhaupt keinen Sinn. Ich glaube, ich habe Ihr Problem möglicherweise falsch verstanden.
quelle
Manchmal ist das als Platzhalter verwendete Symbol
%
nicht dasselbe, wenn Sie eine Abfrage von VB ausführen, wie wenn Sie sie von MS SQL / Access ausführen. Versuchen Sie, Ihr Platzhaltersymbol von auf%
zu ändern*
. Das könnte funktionieren.Wenn Sie jedoch debuggen und Ihre SQL-Zeichenfolge direkt in MS SQL oder Access kopieren möchten, um sie zu testen, müssen Sie das Symbol möglicherweise wieder
%
in MS SQL oder Access ändern , um tatsächlich Werte zurückzugeben.Hoffe das hilft
quelle
versuche es auch so
Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%') OR title LIKE CONCAT('%',@query,'%') )") cmd.Parameters.Add("@query", searchString) cmd.ExecuteNonQuery()
Verwendet Concat anstelle von +
quelle