2011-05-11 35 views
5

私は現在C#とLINQ-TO-SQLを使ってプロジェクトを行っています。このプロジェクトでは、セキュリティが最重要課題であるため、明らかにSQLインジェクションを防止したいと考えています。私はその問題について尋ねたが、何も役に立たない。 LINQがデバッガで生成するコードを見て、LINQ-To-SQLのSQLへの構築方法を少し読んだだけで、LINQがパラメータを処理する方法のために、インジェクションは問題にならないと私は言っていました。これがどのように適用されるかLINQ-To-SQLはSQLインジェクションをどのように防止しますか?

この問題を扱う文献やリンクはありますか?

答えて

6

のLINQは自動的にSQLParametersを使用しています。ユーザの入力は、単に連結された文字列(SQLインジェクションを可能にするもの)ではなく、パラメータ値に変換されます。これはサーバーサイドのIIRCで発生するため、クライアント側のコードが表示されている可能性があります。もう少し背景や情報が必要な場合は、the information hereを読むことができます。

+0

さて、記事の2ページ目が私の質問をクリアしました。あなたの答えをありがとう! – fk2

6

これは非常に単純です。実際には、変数はパラメータ化せずに変数を注入することはありません。そう:

var orders = from ord in ctx.Orders 
      where ord.CustomerName = name 
      select ord; 

はなります:

p0は、より多くのあなたの捕獲 name

何も、あまり何もないから取られた値を持つパラメータである

SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @p0 

。しかし、これは注入攻撃を回避します。 間違った偶然のとは対照:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = '" + name + "'"; 

巨大なリスクを紹介しています。あなたも、正しく上記parameterise当然のことができます:SQLへ

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @name"; 

(およびnameからの値でパラメータ@nameを追加)

+0

どのようにですか?たとえば、文字列を含む入力フィールドがあるとします。誰かが ";データベースを削除する"などのように入力します。これは 'SELECT * FROM [Orders] WHERE [CustomerId] =; Dropデータベース'と評価されます。私に問題はない? – fk2

+0

@ fk2、私はあなたがパラメータ化されたSQLを理解しているとは思わない... – canon

+1

@ fk2 '@ p0' ***はパラメータです***; TSQLとして評価されることはありません。任意の文字列コンテンツにすることができます。 –

関連する問題