如何防止SQL注入在asp.net网站

本文关键字:asp net 网站 注入 何防止 SQL | 更新日期: 2023-09-27 18:14:53

对于用户在文本框中的电子邮件条目,我正在进行客户端检查,以查找电子邮件是否有效

 string emailexist = "SELECT COUNT(DISTINCT UserID) as count FROM tbl_user WHERE Email=@Email ";     

   <asp:RegularExpressionValidator ID="RegularExpressionValidator2" ValidationGroup="Login" ControlToValidate="txtUserName"
                            ValidationExpression="'w+([-+.]'w+)*@'w+([-.]'w+)*'.'w+([-.]'w+)*" CssClass="Error"
                             runat="server" />

这个正则表达式是否足以防止email的SQL注入?

其他文本:

   string groupExistQuery = "SELECT COUNT(DISTINCT GroupID) as count FROM tbl_group WHERE GroupName=@GroupName";   

我正在服务器端进行查询,以检查用户输入的组名是否已经在数据库中可用,这里有很强的可能性执行sql注入。我该如何避免呢?

如何防止SQL注入在asp.net网站

一个正则表达式是无关的 SQL注入(黑名单等从来都不是最强的方法);然而,参数@Email的使用意味着(假设仍然是参数化)容易受到SQL注入的影响。

SQL注入涉及不适当的输入连接;对付它的主要工具是参数,这在这里已经发生了。

例如:

var sql = "SELECT ...snip... WHERE Email='" + email + "'"; // BAD!!!!!

then that非常容易受到SQL注入的影响。通过使用参数,该值不会被视为查询的一部分,因此攻击者没有攻击向量。

如果你使用参数化的值,你将会很好,无论如何,你不能通过参数注入,只能通过连接的值。

您可以通过不使用Direct SQL而使用参数化查询和/或存储过程来防止它。

  1. 使用参数化值
  2. 对字符串进行编码

以下是Microsoft Pattern &练习组到你的问题

一般来说,简单的规则是:不要使用动态SQL生成,如果使用,请清理输入。

永远不要仅仅连接字符串来构建SQL查询。如果您需要在您的应用程序中自己构建查询,那么使用带参数的参数化SQL查询——这样您就安全了。

下面是我上面提供链接的文档中的一个示例:

  DataSet userDataset = new DataSet();
  SqlDataAdapter myCommand = new SqlDataAdapter( 
             "LoginStoredProcedure", connection);
  myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
  myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
  myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
  myCommand.Fill(userDataset);