Ich verwende eine API, die eine SQL-Zeichenfolge erwartet. Ich nehme eine Benutzereingabe, entkomme sie und leite sie an die API weiter. Die Benutzereingabe ist recht einfach. Es werden Spaltenwerte abgefragt. Wie so:
string name = userInput.Value;
Dann erstelle ich eine SQL-Abfrage:
string sql = string.Format("SELECT * FROM SOME_TABLE WHERE Name = '{0}'",
name.replace("'", "''"));
Ist das sicher genug? Wenn dies nicht der Fall ist, gibt es eine einfache Bibliotheksfunktion, die Spaltenwerte sicher macht:
string sql = string.Format("SELECT * FROM SOME_TABLE WHERE Name = '{0}'",
SqlSafeColumnValue(name));
Die API verwendet SQLServer als Datenbank.
c#
sql
sql-server
sc45
quelle
quelle
SELECT [Name], [Value] FROM [SomeTable] WHERE [Name] IN (@ListOfNames)
Ich meine einen anderen Weg alsvar listParNames = listNames.Select(name => { var pname = string.Format("@n{0}", cmd.Parameters.Count); cmd.Parameters.AddWithValue(pname, name); return pname; });
cmd.CommandText = string.Format("SELECT [Name], [Value] FROM [SomeTable] WHERE [Name] in ({0})", string.Join(",", listParNames.ToArray()));
eher direktcmd.Parameters.AddWithValue("@ListOfNames", listNames.ToArray());
Antworten:
Da die Verwendung von SqlParameter keine Option ist, ersetzen Sie in den Zeichenfolgenliteralen einfach 'durch' '(das sind zwei einfache Anführungszeichen, nicht ein doppeltes Anführungszeichen). Das ist es.
Für potenzielle Downvoter: Lesen Sie die erste Zeile der Frage erneut. "Parameter verwenden" war auch meine Darmreaktion.
EDIT: Ja, ich weiß über SQL-Injection-Angriffe. Wenn Sie der Meinung sind, dass dieses Zitat für diese anfällig ist, geben Sie bitte ein funktionierendes Gegenbeispiel an. Ich denke es ist nicht.
quelle
Ich habe dynamisches SQL (ich kann hören, wie das Exekutionskommando seine Gewehre lädt) für die Suchfunktion verwendet, aber es wurde immer dann unterbrochen, wenn ein Benutzer nach jemandem mit einem Nachnamen wie "O'Reilly" suchte.
Ich habe es geschafft, eine Problemumgehung zu finden (lesen Sie "Hack"):
Erstellt eine skalarwertige Funktion in SQL, die ein einfaches Anführungszeichen durch zwei einfache Anführungszeichen ersetzt und dem beleidigenden einfachen Anführungszeichen effektiv entgeht, sodass
"... Nachname WIE '% O'Reilly%' UND ..." zu "... Nachname" wird WIE '% O''Reilly%' UND ... "
Diese Funktion wird aus SQL heraus aufgerufen, wenn ich vermute, dass Felder ein einfaches Anführungszeichen enthalten könnten, dh: Vorname, Nachname.
CREATE FUNCTION [dbo].[fnEscapeSingleQuote] (@StringToCheck NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Result NVARCHAR(MAX) SELECT @Result = REPLACE(@StringToCheck, CHAR(39), CHAR(39) + CHAR(39)) RETURN @Result END
Nicht sehr elegant oder effizient, aber es funktioniert, wenn Sie in einer Notlage sind.
quelle
Möglicherweise möchten Sie "durch" ersetzen, anstatt zu parametrisieren, wenn Sie das Problem in einer großen Menge von Ad-hoc-SQL in kurzer Zeit mit minimalem Bruchrisiko und minimalen Tests beheben müssen.
quelle
Verwendung von SqlCommand und Entity Framework
exec sp_executesql...
.Es gibt also wirklich eine Alternative zu rohen Saiten mit vermutlich Ihrem eigenen Fluchtmuster. Mit SqlCommand verwenden Sie technisch parametrisierte Abfragen, umgehen jedoch die ADO.Net-Abstraktion des zugrunde liegenden SQL-Codes.
Während Ihr Code SQL Injection nicht verhindert, lautet die endgültige Antwort sp_executesql und nicht SqlCommand.
Ich bin mir jedoch sicher, dass es spezielle Handhabungsanforderungen für die Generierung einer SQL Injection-Proof-Zeichenfolge gibt, die sp_executesql verwendet.
Siehe: Wie kann ich Werte von einer dynamischen gespeicherten SQL-Prozedur an das Entity Framework zurückgeben?
quelle
Einfach:
const string sql = "SELECT * FROM SOME_TABLE WHERE Name = @name";
und fügen Sie den
@name
Parameter mit dem Wert hinzu:cmd.CommandText = sql; cmd.Parameters.AddWithValue("@name", name);
quelle
Wenn Sie eine Zeichenfolge für eine MSSQL-Abfrage maskieren müssen, versuchen Sie Folgendes:
System.Security.SecurityElement.Escape(Value)
quelle