使用 LINQ to SQL 是不是有助于防止 SQL 注入
Posted
技术标签:
【中文标题】使用 LINQ to SQL 是不是有助于防止 SQL 注入【英文标题】:Will using LINQ to SQL help prevent SQL injection使用 LINQ to SQL 是否有助于防止 SQL 注入 【发布时间】:2009-01-23 14:59:22 【问题描述】:我正在建立一个公共站点,我首先想到的是 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 吗?
【问题讨论】:
读者注意:实体框架也是如此。见***.com/questions/3473841/… 【参考方案1】:是的,LINQ 将有助于阻止 SQL 注入。
LINQ to SQL 将所有数据传递到 数据库通过 SQL 参数。所以, 虽然 SQL 查询是组成的 动态地,值被替换 服务器端通过参数 防范最常见的 SQL注入攻击的原因。
另外,请参阅Eliminate SQL Injection Attacks Painlessly with LINQ 了解一些信息。
【讨论】:
应该注意的是,当他们说“传递所有数据”时,他们的意思是“所有数据”——甚至是硬编码值:“db.Employees.Where(e=>e.Active == 1)”将“1”作为参数传递。 有一个小例外:如果您的存储过程或函数存在 SQL 注入漏洞(由于动态 SQL 组合),那么对该 SP/func 的任何调用当然都存在漏洞。 @KristoferA- 如果其中一些程序是必要的,并且不容易转换为 LINQ/实体框架,那么如何保护?我的直觉是确保用户文本字段输入不会在没有某种验证的情况下直接放入 SQL 语句中。是否应该考虑其他攻击媒介?【参考方案2】:你可以走了。 Linq 确实参数化了它发送到数据库的数据。
使用 Log 属性检查发生了什么:dc.Log = Console.Out;
【讨论】:
【参考方案3】:这应该是因为发出的 SQL 使用命名参数,不能被利用来执行任意 SQL。
【讨论】:
以上是关于使用 LINQ to SQL 是不是有助于防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows Phone 上使用 Linq to SQL 时,是不是可以提高批量删除的性能?