Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到SQL C是否消除了SQL注入攻击的可能性?_C#_Linq_Sql Injection - Fatal编程技术网

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

C# LINQ到SQL C是否消除了SQL注入攻击的可能性?,c#,linq,sql-injection,C#,Linq,Sql Injection,我有一个fom供我的员工使用LINQ to SQL for CRUD。我可以仅仅依靠LINQ到SQL吗 以下网站称: 使用LINQ保护数据访问 LINQ to SQL专用于数据访问时,消除了应用程序中SQL注入的可能性,原因很简单:LINQ代表您执行的每个SQL查询都是参数化的。当LINQ从嵌入的查询语法构建SQL查询时,从任何源向查询提供的任何输入都被视为文本 资料来源: 因此,基本上微软已经找到了防止sql注入的方法?sql注入的解决方案从经典asp开始就可用了,尽管在当时使用起来要麻烦得

我有一个fom供我的员工使用LINQ to SQL for CRUD。我可以仅仅依靠LINQ到SQL吗

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

资料来源:


因此,基本上微软已经找到了防止sql注入的方法?

sql注入的解决方案从经典asp开始就可用了,尽管在当时使用起来要麻烦得多:只是不要将值直接替换到sql查询字符串中

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

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

LINQtoSQL恰好是利用这个系统的一种方法,而不是唯一的方法。它在需要的幕后构建带有占位符的查询


如果您负责任何使用字符串连接将sql代码组合在一起的代码,请立即停止您正在执行的操作,并将其修复为使用某种形式的参数化查询。

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

不是Microsoft解决了这个问题。几乎每种语言都支持参数化查询

SQL注入攻击的最大风险之一来自简单朴素的字符串concat:

string query = "SELECT * FROM Users WHERE UserName = " + userName + " AND....
杰夫·阿特伍德的一篇文章:

其他语言示例:

,, ,

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

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


LINQtoSQL大大降低了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);
如果使用字符串参数占位符并将参数传递到接受paramarray对象的重载版本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到SQL的SQL注入是安全的。另一方面,实体框架实际上有一些其他潜在的可注入区域,如果你想沿着这条路线走下去的话。

是的,就像使用参数化SQL语句防止SQL注入一样。