SQL Server bietet so viele Dinge zu lernen und ich finde es immer wieder erstaunlich. In meinen Gesprächen mit Kunden tauchen oft Sicherheitsfragen auf, insbesondere rund um SQL Injection. Viele haben behauptet, SQL Injection sei ein SQL Server-Problem. Es dauert ziemlich lange, bis ich ihnen mitteile, dass es nichts über SQL Server und SQL Injection gibt. SQL Injection ist das Ergebnis falscher Codierungspraktiken. Eine der Empfehlungen, die ich gebe, bezieht sich auf die Verwendung von Dynamic SQL. Es kann Situationen geben, in denen Sie es nicht vermeiden können. Mein einziger Rat wäre, wenn möglich zu vermeiden. In diesem Blog würde ich ein SQL-Injection-Problem aufgrund von dynamischem SQL und eine mögliche Lösung, die Sie haben können, demonstrieren.
Nehmen wir an, wir haben eine einfache Suchseite, auf der der Benutzer die leere Suche verwenden oder in jedem Feld Filter bereitstellen kann. Wir haben zwei Felder für die Verwendung von „Vorname“ und „Nachname“ bereitgestellt. Der Benutzer tippt etwas ein und klickt auf Suchen. Hier ist unser Code für gespeicherte Prozeduren, die hinter den Kulissen ausgelöst werden.
USE AdventureWorks2014 GO CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName ,MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE ''' + @firstName + '''' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE ''' + @lastName + '''' EXEC (@sql) END
Wenn ich diese Zeichenfolge verwende, um im Nachnamen auszuführen, ”;Tabelle t1–
löschenEXEC search_first_or_last '%K%', ''';drop table t1--'
Die dynamische Zeichenfolge wäre
SELECT FirstName, MiddleName, LastName FROM Person. Person WHERE 1 = 1 AND FirstName LIKE '%K%' AND LastName LIKE '';DROP TABLE t1--'
Sehen Sie das Problem? Ja, Benutzer können Tabelle t1 löschen, wenn Code unter einem Konto mit hohen Berechtigungen ausgeführt wird.
Eine Lösung des Problems wäre die Verwendung von sp_executesql. Hier ist die bessere Version mit
CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName , MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE @firstName' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE @lastName ' EXEC sp_executesql @sql ,N'@firstName nvarchar(50), @lastName nvarchar(50)' ,@firstName ,@lastName END
Ich hoffe, Sie können dies verwenden und in Ihrem Projekt implementieren. Verwenden Sie diese einfachen Techniken in Ihrem Produktionscode? Sind Sie bei Audits schon einmal mit ähnlichen Problemen konfrontiert worden? Lassen Sie mich wissen, was Sie gelernt haben.