运用LINQ轻松清除SQL注入式攻击
2007-09-01 13:08:07 来源:WEB开发网在为Customers表中的数据定义了对象模型的类之后中,你可以为客户的数据搜索页面直接以代码的形式查询数据。LINQ-powered 页面(LINQtoSQL.aspx.cs)的Page_Load方法,具体展现了由对象关系设计器创建的CustomersDataContext类,重新使用了前面在SQLInjection.aspx页面中使用的连接字符串。下面的LINQ查询重新使用了与where子句匹配的Customer对象的集合。
protected void Page_Load(object sender, EventArgs e)
{
string connectionString =
ConfigurationManager.ConnectionStrings
["northwndConnectionString1"].ConnectionString;
CustomersDataContext db = new
CustomersDataContext(connectionString);
GridView1.DataSource =
from customer in db.Customers
where customer.CompanyName ==
txtCompanyName.Text
orderby customer.CompanyName
select customer;
GridView1.DataBind();
}
在使用了LINQ to SQL之后,如果我们将“Ernst Handel”作为搜索值,由LINQ在运行时生成并在服务器上执行的SQL语句看起来将会是如下这个样子:
SELECT [t0].[CustomerID], [t0].[CompanyName],
[t0].[ContactName], [t0].[ContactTitle], [t0].[Address],
[t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country],
[t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CompanyName] = @p0
ORDER BY [t0].[CompanyName]}
可以看出,WHERE子句自动被加上了参数,因此,用传统的SQL注入式攻击是无法造成破坏的。不管用户将什么值作为输入提交给搜索页面,这个查询是安全的,它不允许用户的输入执行服务器上的命令。如果你输入了前面例子中用来实施SQL注入攻击的字符串,查询并不会返回任何信息。事实上,一个用户用这个查询可以进行的最大的破坏是执行一次强力攻击(或称蛮力攻击(Brute force attack)),主要通过使用搜索功能穷举Customers表中所有公司的记录,其使用的方法是猜测每一个可能的值。不过,即使这样也只提供了那个页面上所暴露的Customers表中的值,并不会给攻击者注入命令的机会,这里的命令指的是访问数据库中额外的数据表的命令。
LINQ与安全
正如前面的例子所显示的那样,在Web应用程序中引入SQL注入漏洞是很容易的,不过采用适当的方法也容易修正这些漏洞。但是,没有什么方法天生就能防止开发人员犯这些简单的但却是危险的错误。然而,微软的LINQ to SQL技术通过让开发人员直接与对象模型交互而不是直接与数据库交互,消除了来自数据库应用程序的SQL注入攻击的可能性。内建于c#和Visual Basic的 LINQ基础结构关注正确地表述合法而安全的SQL语句,可以防止SQL注入攻击,并使开发人员专注于对他们来说最自然的程序设计语言。不管你是将LINQ to SQL用作新的.NET应用程序开发的一部分,还是对它进行花样翻新,用于现有的实际应用程序的数据访问,你都是作了一个构建更安全的应用程序的选择。
更多精彩
赞助商链接