SQL インジェクションは厄介な問題になる可能性がありますが、それを回避する方法があります。Linq2Entities、Linq2SQL、NHibrenate などの ORM を使用するだけで、リスクが軽減されます。ただし、それらを使用しても SQL インジェクションの問題が発生する可能性があります。
SQL インジェクションの主なものは、ユーザー制御の入力です (XSS の場合と同様)。ユーザー名とパスワードを受け取るログインフォームがある場合の最も単純な例 (これを行うだけのフォームがないことを願っています)。
SELECT * FROM Users WHERE Username = '" + username + "' AND password = '" + password + "'"
ユーザーがユーザー名Admin' に対して次のように入力した場合 --データベースに対して実行すると、SQL ステートメントは次のようになります。
SELECT * FROM Users WHERE Username = 'Admin' --' AND password = ''
この単純なケースでは、パラメータ化されたクエリ (ORM が行うこと) を使用すると、リスクが取り除かれます。また、あまり知られていない SQL インジェクション攻撃ベクトルの問題もあり、それはストアド プロシージャにあります。この場合、パラメータ化されたクエリまたは ORM を使用しても、SQL インジェクションの問題が発生します。ストアド プロシージャには実行コマンドを含めることができ、それらのコマンド自体が SQL インジェクション攻撃を受けやすい可能性があります。
CREATE PROCEDURE SP_GetLogin @username varchar(100), @password varchar(100) AS
DECLARE @sql nvarchar(4000)
SELECT @sql = ' SELECT * FROM users' +
' FROM Product Where username = ''' + @username + ''' AND password = '''+@password+''''
EXECUTE sp_executesql @sql
したがって、この例では、パラメータ化されたクエリまたは ORM を使用している場合でも、前の例と同じ SQL インジェクションの問題が発生します。この例はばかげているように見えますが、このようなものがどれほど頻繁に書かれているかに驚かれることでしょう。
私のお勧めは、ORM を使用して SQL インジェクションの問題が発生する可能性をすぐに減らし、問題のあるコードとストアド プロシージャを見つけて修正する方法を学ぶことです。必要がない限り、ADO.NET (SqlClient、SqlCommand など) を直接使用することはお勧めしません。パラメーターを指定して使用するのは安全ではないからではなく、怠惰になって SQL の記述を開始する方がはるかに簡単だからです。文字列を使用してパラメーターを無視してクエリを実行します。ORMS は、パラメーターの使用を強制するという素晴らしい仕事をします。
次に、SQL インジェクションに関する OWASP サイトhttps://www.owasp.org/index.php/SQL_Injectionにアクセスし、SQL インジェクション チート シートを使用して、コードで発生する問題を見つけて解決できるようにします。 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet 最後に、SQL インジェクションや XSS などについてお互いのコードを確認できる、社内の他の開発者との間で適切なコード レビューを行うことをお勧めします。多くの場合、プログラマーは機能を急いで実装しようとしていて、コードのレビューにあまり時間をかけないため、このようなことを見逃しています。