hid*_*den 6 c# linq sql-injection
我有一个为我的雇员使用LINQ to SQL for CRUD的fom.我可以依靠LINQ to SQL吗?
以下网站说:使用LINQ LINQ to SQL保护数据访问,当专门用于数据访问时,消除了在应用程序中注入SQL的可能性,原因很简单:LINQ为您执行的每个SQL查询都是参数化的.当LINQ从嵌入式查询语法构建SQL查询时,从任何源提供给查询的任何输入都被视为文字.
来源:http: //msdn.microsoft.com/en-us/library/bb386929.aspx
那么基本上微软已经找到了如何防止SQL注入?
从经典的asp开始,sql注入的解决方案已经可用了(虽然当时使用起来要麻烦得多):只是不要将值直接替换为sql查询字符串.
相反,您可以在每个值的sql代码中放置一个占位符,并且用于与数据库通信的网络协议支持将每个参数的值作为单独的项从sql命令本身发送.然后,数据库接收sql并知道如何在添加数据之前仅使用占位符...为查询构建执行计划.
这样,数据就是数据,代码就是代码,而twain就不会满足.只要您的应用程序中没有地方将查询参数值直接替换为sql代码,然后再将其发送到服务器,您就可以100%安全地接受sql注入攻击.这种方法适用于大多数数据库和大多数语言.
Linq-to-sql恰好是使用这个系统的一种方式(不是唯一的方法).它在幕后需要的位置构建查询.
如果您负责任何使用字符串连接的代码将您的sql代码放在一起,请立即停止正在执行的操作并修复它以使用某种形式的参数化查询.
微软并没有想出来.几乎每种语言都支持参数化查询.
SQL注入攻击的最大风险之一来自简单的天真字符串连接:
string query = "SELECT * FROM Users WHERE UserName = " + userName + " AND....
Run Code Online (Sandbox Code Playgroud)
Jeff Atwood的一篇文章:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html
其他语言示例:
PHP数据对象, mysqli :: prepare, Ruby on Rails参数化查询和ActiveRecord
使用LINQ-to-SQL,EntityFramework,NHibernate都将有助于防范这些类型的攻击.
但是,您需要注意其他类型的攻击,例如XSS/CSRF攻击.SQL注入只是成功的一半.Microsoft还为其提供了一些其他内置框架功能,例如ASP.NET MVC中的AntiForgeryToken.
LINQ to SQL 大大降低了 SQL 注入的可能性,但并没有完全消除它。例如,如果您正在使用存储过程并调用 spExecuteSQL,并在 SQL 存储过程中传入一个连接字符串,您仍然会受到 SQL 注入的影响。当然,这与数据访问技术无关,这表明即使存储过程也无法消除 SQL 注入的可能性。
此外,LINQ to SQL DataContext 确实提供了将 SQL Pass-through 查询作为可注入的字符串传递的能力。例如,以下返回 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);
Run Code Online (Sandbox Code Playgroud)
如果您使用字符串参数占位符并将参数传递到接受对象参数数组的 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);
Run Code Online (Sandbox Code Playgroud)
值得庆幸的是,如果您是标准的 LINQ 方法,那么您就可以避免使用 LINQ to SQL 进行 SQL 注入。另一方面,如果您想沿着这条路线走下去,实体框架实际上确实有一些其他潜在的可注入区域。
| 归档时间: |
|
| 查看次数: |
3465 次 |
| 最近记录: |