Aus Gründen der Argumentation, sagen wir einfach ich haben eine lokale Variable erstellen eine SQL-Abfrage enthält, die eine INSERT hat:SQL Server: Sanitizing @param gegen Injection-Angriffe
DECLARE @insert NVARCHAR(MAX)
SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES...
EXEC (@insert)
Diese INSERT ist auch geht auf einen Spaltenwert enthalten:
DECLARE @insert NVARCHAR(MAX)
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
Nun, ich bin über eine Injektions Angriff offensichtlich besorgt, und möchte, dass @ Nachricht Wert, um sicherzustellen, kann nicht @ Einsatz Wert böswillige oder fehlerhaft als eine Abfrage machen exec .
Das bringt uns zu meiner Frage: Entkommt die Zeichen in @Message ausreichend? Gibt es noch andere Zeichen, die in @message erscheinen könnten, die auslaufen könnten?
Beispiel:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(Wenn ich sage „zu haben“, ist dies, weil meine Abfrage in einer gespeicherten Prozedur ist, und diese gespeicherte Prozedur akzeptiert @table, die die Zieltabelle einzufügen ist Ich bin nicht daran interessiert, meine Architektur zu diskutieren, oder warum die Tabelle, in die INSERT eingefügt werden soll, über einen Prozedurparameter "dynamisch" angegeben wird. Bitte beachten Sie , es sei denn, es gibt eine andere Möglichkeit als EXEC() eine Abfrage zur Angabe einer Tabelle INSERT, wenn dann der Tabellenname als Prozedurparameter empfangen wird.)
Wollen wir uns wirklich mit Fragen beschäftigen, die sich mit absichtlich falschem Code beschäftigen? – dkretz
Wenn es bedeutet, eine Lösung zu finden, ja. Entwickler müssen sich ständig mit Mist-Code auseinandersetzen, vor allem, wenn Sie Projekte in Bangladesch für $ 8 pro Stunde konsultieren und erben. Wir haben nicht immer den Luxus, Projekte von Grund auf neu zu entwickeln und sie so zu gestalten, wie sie sein sollten.:) – core