LINQ To SQL C#是否消除了SQL注入攻击的可能性?

时间:2011-07-28 03:14:19

标签: c# linq sql-injection

我的雇主使用LINQ to SQL for CRUD。我可以依靠LINQ to SQL吗?

以下网站说: 使用LINQ保护数据访问  LINQ to SQL,当专门用于数据访问时, 在应用程序中消除了SQL注入 的可能性,原因很简单:LINQ为您执行的每个SQL查询都是参数化的。当LINQ根据嵌入式查询语法构建SQL查询时,从任何源提供给查询的任何输入都被视为文字。

来源: http://msdn.microsoft.com/en-us/library/bb386929.aspx

所以基本上微软已经想出了如何防止sql注入?

4 个答案:

答案 0 :(得分:6)

自经典asp以来,sql注入的解决方案已经可用了(虽然当时使用它比较麻烦):只是不要将值直接替换为sql查询字符串。

相反,您可以在sql代码中为每个值放置一个占位符,并且用于与数据库通信的网络协议支持将每个参数的值作为独立项从sql命令本身发送。然后,数据库接收sql,并知道如何仅使用占位符... 添加数据之前为查询构建执行计划。

这样,数据就是数据,代码就是代码,而twain就不会满足。只要您的应用程序中没有地方将查询参数值直接替换为sql代码,然后再将其发送到服务器,您就可以100%安全地免受sql注入攻击。这种方法适用于大多数数据库和大多数语言。

Linq-to-sql碰巧是单向(不是唯一的方式)来使用这个系统。它在幕后需要占位符的情况下构建查询。

如果您负责任何使用字符串连接的代码将您的sql代码放在一起,停止您现在正在做什么,去修复以便使用某种形式的参数化查询。

答案 1 :(得分:6)

微软并没有想出来。几乎每种语言都支持参数化查询。

SQL注入攻击的最大风险之一来自简单的天真字符串连接:

string query = "SELECT * FROM Users WHERE UserName = " + userName + " AND....

Jeff Atwood的一篇文章:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html

其他语言示例:

PHP Data Objectsmysqli::prepareRuby on Rails Parameterized Queries and ActiveRecord

使用LINQ-to-SQL,EntityFramework,NHibernate将有助于防范这些类型的攻击。

您需要注意其他类型的攻击,例如XSS / CSRF攻击。 SQL注入只是成功的一半。 Microsoft还为其提供了一些其他内置框架功能,例如ASP.NET MVC中的AntiForgeryToken。

http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

答案 2 :(得分:4)

LINQ to SQL大大降低了SQL注入的可能性,但并未完全消除它。例如,如果您正在使用存储过程并调用spExecuteSQL传入SQL存储过程中的连接字符串,则仍然需要SQL注入。当然,无论数据访问技术如何,这都适用,并表明即使存储过程也无法消除SQL注入的可能性。

此外,LINQ to SQL DataContext确实能够将SQL传递查询作为可注入的字符串传递。例如,以下内容返回Authors表中的所有行:

string searchName = "Good' OR ''='";
TypedDataContext context = this;

string sql = @"Select ID, LastName, FirstName, WebSite, TimeStamp    " +
          "From dbo.Author " +
          "Where LastName = '" + searchName + "'";

IEnumerable<Author> authors = context.ExecuteQuery<Author>(sql);

如果您使用字符串参数占位符并将参数传递给ExecuteQuery的重载版本,接受对象的参数:

,LINQ to SQL允许使用注入安全版本
string sql = @"Select ID, LastName, FirstName, WebSite, TimeStamp    " +
          "From dbo.Author " +
          "Where LastName = {0}";

IEnumerable<Author> authors = context.ExecuteQuery<Author>(sql, searchName);

幸运的是,如果你是标准的LINQ方法,那么使用LINQ to SQL的SQL注入是安全的。另一方面,实体框架实际上确实有一些其他潜在的可注射区域,如果你想要沿着那条路走下去。

答案 3 :(得分:0)

SQL注入在ADO.NET级别解决。如果您在命令中使用参数,那么您就是安全的。