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

本文关键字:SQL 攻击 注入 可能性 To 是否 LINQ | 更新日期: 2023-09-27 18:03:40

我有一个表格,我的雇主使用LINQ到SQL的CRUD。我可以只是依靠LINQ到SQL?

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

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

所以基本上微软已经找到了防止sql注入的方法?

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

并不是微软想出了这个办法。几乎每种语言都支持参数化查询。

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数据对象mysqli:准备,Ruby on Rails参数化查询和ActiveRecord

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

还有其他类型的攻击需要注意,比如XSS/CSRF攻击。SQL注入只是成功的一半。微软还为此提供了一些其他内建的框架特性,比如ASP中的AntiForgeryToken。净MVC。

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

sql注入的解决方案自经典asp以来一直可用(尽管使用起来要麻烦得多):只是不要直接将值替换到sql查询字符串中。

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

这样,数据就是数据,代码就是代码,两者永远不能相遇。只要在你的应用程序中没有在将查询参数值发送到服务器之前直接替换为sql代码的地方,你就可以100%安全地免受sql注入攻击。这种方法适用于大多数数据库和大多数语言。

Linq-to-sql恰好是使用这个系统的一种方法(不是唯一的方法)。它在后台需要的地方构建带有占位符的查询。

如果你负责任何地方的代码使用字符串串联把你的sql代码在一起,停止你正在做的事情,去修复它使用某种形式的参数化查询

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);

LINQ to SQL允许注入安全版本,如果你使用字符串参数占位符,并将参数传递给ExecuteQuery的重载版本,接受对象的参数数组:

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注入。另一方面,实体框架实际上有一些其他潜在的可注入区域如果你想沿着这条路走下去的话

SQL注入在ADO解决。净的水平。如果你在命令中使用参数,那么你是安全的。