如何在ASP.NET应用程序中避免SQL注入攻击?

bal*_*log 18 .net sql asp.net security sql-injection

我需要避免在我的ASP.NET应用程序中容易受到SQL注入攻击.我怎么能做到这一点?

Tom*_*lak 24

即使您的问题非常通用,但仍然适用一些规则:

  • 使用参数化查询(SqlCommandwith SqlParameter)并将用户输入放入参数中.
  • 不要使用未经检查的用户输入构建SQL字符串.
  • 不要假设您可以构建一个可以检查用户输入是否存在各种畸形的清理程序.边缘情况很容易被遗忘.检查数字输入可能很简单,可以让您安全,但对于字符串输入,只需使用参数.
  • 检查二级漏洞 - 如果这些值由用户输入组成,则不要使用SQL表值构建SQL查询字符串.
  • 使用存储过程封装数据库操作.

  • 不会.但是,提出这类问题的人很可能对这些问题没有深入了解.使它们明确是支持理解.随着你的抽象经验和能力的提升,你不需要明确,你也不可能再提出这样的问题了. (2认同)

Vin*_*vic 17

使用预准备语句(链接到使用"为产品添加节点"部分中的预准备语句的ASP.NET教程).这里的所有都是它的.

那么,或者使用ORM,比如Linq to SQLNHibernate,它们在内部使用预处理语句.


Run*_*tad 14

使用参数!它真的很简单:-)

像这样创建你的查询(对于带有C#的MS Sql server):

SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn); 
Run Code Online (Sandbox Code Playgroud)

这里@Name是你想要避免sql注入的参数,conn是一个SqlConnection对象.然后要添加参数值,请执行以下操作:

getPersons.Parameters.AddWithValue("@Name", theName);
Run Code Online (Sandbox Code Playgroud)

这里的theName是一个包含您要搜索的名称的变量.

现在应该不可能对该查询进行任何sql注入.

由于这很简单,没有理由不使用参数.


kev*_*ers 13

永远不要信任用户输入 - 使用验证控件,正则表达式,代码等验证所有文本框条目

永远不要使用动态SQL - 使用参数化SQL或存储过程

切勿使用管理员级帐户连接到数据库 - 使用受限访问帐户连接到数据库

不要以明文形式存储机密 - 加密或散列密码和其他敏感数据; 你还应该加密连接字符串

例外情况应该泄露最少的信息 - 不要在错误信息中泄露太多信息; 使用customErrors在出现未处理错误时显示最少的信息; 将debug设置为false

MSDN上的有用链接停止SQL注入


Bri*_*itt 5

发生SQL注入是因为正在实时构造对数据库的查询,例如:

SELECT * From Table1 WHERE " + UserInput
Run Code Online (Sandbox Code Playgroud)

UserInput 可能是恶意的,并且包含您不想要的其他陈述。

为了避免这种情况,您需要避免将查询串联在一起。

您可以通过使用参数化查询来完成此操作-签出DBCommand特定DB风格的对象。