SQL Serverには学ぶべきことがたくさんあり、私はいつもそれが素晴らしいと感じています。顧客との会話では、SQLインジェクションに関するセキュリティの質問がよく出てきます。多くの人がSQLインジェクションはSQLServerの問題であると主張しています。 SQLServerとSQLインジェクションについて何もないことを彼らに知らせるにはかなりの時間がかかります。 SQLインジェクションは、誤ったコーディング手法の結果です。私が提供する推奨事項の1つは、動的SQLを使用しないことです。避けられない状況もあるかもしれません。私の唯一のアドバイスは、可能であれば避けることです。このブログでは、動的SQLによるSQLインジェクションの問題と、考えられる解決策について説明します。
ユーザーが空白の検索を使用したり、任意のフィールドにフィルターを指定したりできる単純な検索ページがあるとします。 「名」と「姓」を使用するための2つのフィールドが用意されています。ユーザーが何かを入力して検索を押します。これが、舞台裏で起動するストアドプロシージャのコードです。
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
この文字列を使用してラストネームで実行する場合”; drop table t1 –
EXEC search_first_or_last '%K%', ''';drop table t1--'
動的な文字列は
SELECT FirstName, MiddleName, LastName FROM Person. Person WHERE 1 = 1 AND FirstName LIKE '%K%' AND LastName LIKE '';DROP TABLE t1--'
問題がありますか?はい、コードが高特権アカウントで実行されている場合、ユーザーはテーブルt1を削除できます。
問題の解決策の1つは、sp_executesqlを使用することです。これが
を使用したより良いバージョンです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
これを使用して、プロジェクトに実装できることを願っています。これらの単純な手法を本番コードで使用していますか?監査中に同様の問題に直面したことがありますか?あなたの学んだことを私に知らせてください。