我需要避免在我的ASP.NET应用程序中容易受到SQL注入攻击.我怎么能做到这一点?
即使您的问题非常通用,但仍然适用一些规则:
使用参数化查询(SqlCommand
with SqlParameter
)并将用户输入放入参数中.
不要使用未经检查的用户输入构建SQL字符串.
不要假设您可以构建一个可以检查用户输入是否存在各种畸形的清理程序.边缘情况很容易被遗忘.检查数字输入可能很简单,可以让您安全,但对于字符串输入,只需使用参数.
检查二级漏洞 - 如果这些值由用户输入组成,则不要使用SQL表值构建SQL查询字符串.
使用存储过程封装数据库操作.
使用预准备语句(链接到使用"为产品添加节点"部分中的预准备语句的ASP.NET教程).这里的所有都是它的.
那么,或者使用ORM,比如Linq to SQL或NHibernate,它们在内部使用预处理语句.
使用参数!它真的很简单:-)
像这样创建你的查询(对于带有C#的MS Sql server):
SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn);
这里@Name是你想要避免sql注入的参数,conn是一个SqlConnection对象.然后要添加参数值,请执行以下操作:
getPersons.Parameters.AddWithValue("@Name", theName);
这里的theName是一个包含您要搜索的名称的变量.
现在应该不可能对该查询进行任何sql注入.
由于这很简单,没有理由不使用参数.
永远不要信任用户输入 - 使用验证控件,正则表达式,代码等验证所有文本框条目
永远不要使用动态SQL - 使用参数化SQL或存储过程
切勿使用管理员级帐户连接到数据库 - 使用受限访问帐户连接到数据库
不要以明文形式存储机密 - 加密或散列密码和其他敏感数据; 你还应该加密连接字符串
例外情况应该泄露最少的信息 - 不要在错误信息中泄露太多信息; 使用customErrors在出现未处理错误时显示最少的信息; 将debug设置为false
MSDN上的有用链接停止SQL注入
发生SQL注入是因为正在实时构造对数据库的查询,例如:
SELECT * From Table1 WHERE " + UserInput
UserInput
可能是恶意的,并且包含您不想要的其他陈述。
为了避免这种情况,您需要避免将查询串联在一起。
您可以通过使用参数化查询来完成此操作-签出DBCommand
特定DB风格的对象。