运用LINQ轻松清除SQL注入式攻击
2007-09-01 13:08:07 来源:WEB开发网protected void btnSearch_Click(object sender, EventArgs e)
{ String cmd = "SELECT [CustomerID], [CompanyName], [ContactName]
FROM [Customers] WHERE CompanyName ='" + txtCompanyName.Text
+ "'";
SqlDataSource1.SelectCommand = cmd;
GridView1.Visible = true;
}
在这种情况下,如果一个用户输入“Ernst Handel”作为公司名,并单击“搜索”按钮,作为响应屏幕会向用户显示那个公司的记录,这正是我们所期望的理想情况。不过一个攻击者可以轻易地操纵这个动态查询。例如,攻击者通过插入一个UNION子句,并用一个注释符号终止这个语句的剩余部分。换句话说,攻击者不是输入“Ernst Handel”,而是输入如下的内容:
Ernst Handel' UNION SELECT CustomerID, ShipName, ShipAddress
FROM ORDERS--
其结果是这个SQL语句在服务器端执行,由于添加了这个恶意的请求。它会将这个动态的SQL查询转换为下面的样子:
SELECT [CustomerID], [CompanyName],
[ContactName]
FROM [Customers]
WHERE CompanyName ='Ernst Handel'
UNION SELECT CustomerID, ShipName,
ShipAddress
FROM ORDERS--'
这是一个相当合法的SQL语句,它可以在应用程序数据库上执行,返回order表中所有的客户,这些客户通过应用程序已经处理了定单。
典型的SQL防护
可以看出,在你的应用程序中创造并利用一个SQL注入漏洞是多么容易。幸运的是,如前所述,只需要采取几项简单的对策通常就可以预防SQL注入攻击。最常用的、成本效率最高的预防SQL注入攻击的方法是验证应用程序中所有的最终用于数据访问的数据输入。用户发出的任何输入,不管是通过Web应用程序输入的或者是常驻于数据存储设备的,都要在服务器处理你的数据访问命令之前在服务器端验证其类型、长度、格式和范围。不幸的是,基于代码的对策并不十分安全,而且有可能失败,特别是当发生如下情况时:
更多精彩
赞助商链接