web-dev-qa-db-ja.com

LINQ to SQLを使用してSQLインジェクションを防ぐ

私はパブリックサイトをセットアップしています。最初に頭に浮かぶのはSQLインジェクションです。保存しているテキストフィールドがいくつかあり、linqを使用してデータベースの更新/書き込みを行っています。 linqを使用しても安全ですか?

この例では、ユーザーアカウントを作成しています。

Data.MemberRegistrationDataContext context = new MemberRegistrationDataContext();
Data.tbl_Member_UserProfile profile = new tbl_Member_UserProfile();
profile.SSN = Convert.ToDecimal(Session["tempMemberSSN_Registration"]);
profile.UserName = userName;
profile.Password = password;
profile.EmailAddress = email;
profile.QuestionID = qID;
profile.QuestionResponse = securityAnswer;
profile.LastModDt = DateTime.Now;
profile.LastModBy = "web";
context.tbl_Member_UserProfiles.InsertOnSubmit(profile);
context.SubmitChanges();

この例はパスワードを変更しています

   MemberRegistrationDataContext dc = new MemberRegistrationDataContext();
   var mProfileRecord = dc.tbl_Member_UserProfiles.Single(c => c.SSN == sSSN);
   mProfileRecord.Password = sNewPassword;
   dc.SubmitChanges();

これらは安全ですか? LINQは自動的に生成するSQLをパラメーター化しますか?

50
Bill Martin

はい、LINQはSQLインジェクションの停止に役立ちます。

LINQ to SQLは、SQLパラメーターを介してすべてのデータをデータベースに渡します。したがって、SQLクエリは動的に構成されますが、SQLインジェクション攻撃の最も一般的な原因から保護するパラメーターによって、サーバー側で値が置き換えられます。

また、いくつかの情報については LINQを使用してSQLインジェクション攻撃を簡単に排除する を参照してください。

73
Galwegian

あなたは行ってもいいです。 Linqは、データベースに送信するデータをパラメーター化します。

Logプロパティを使用して、何が起こっているかを確認します:dc.Log = Console.Out;

14
Amy B

これは、発行されたSQLが、任意のSQLの実行に悪用できない名前付きパラメーターを使用しているためです。

3
Jan Bannister