2011-03-15 130 views
10

我一直在读一些关于SQL注入的信息,我想确保我的代码可以说是“安全的”,我打算使用RegExp验证器来检查用户输入,但另一篇文章中建议仅使用参数化查询,以及我正在使用它们,但我想确保我的代码安全,是吗?从SQL注入安全参数插入数据库?

 using (SqlConnection dataConnection = new SqlConnection(myConnectionString)) 
     { 
      using (SqlCommand dataCommand = dataConnection.CreateCommand()) 
      { 
       dataCommand.CommandText = "INSERT INTO Lines (Name, CreationTime) " + 
        "VALUES (@LineName, @CurrentDateTime)"; 

       dataCommand.Parameters.AddWithValue("@LineName", TextBox2.Text); 
       dataCommand.Parameters.AddWithValue("@CurrentDateTime", DateTime.Now.ToString()); 
       dataConnection.Open(); 
       //do other DB stuff 

我砍的最后一部分,使后较短的,剩下的只是想和捕获异常和关闭数据库连接,以及如何插入成功提供用户反馈。

+0

如果'CreationTime'列的类型的'DateTime',你不需要'的ToString()'投。 – Cosmin 2011-03-15 18:41:21

回答

11

你的代码很好,它被注入保护,因为值作为参数传递而不是字符串文字。但是,如果您自己编写此类数据访问,是否考虑创建SqlParameter对象并明确设置类型,大小等,并将参数添加到命令中? AddWithValue可以正常工作,但SQL Server必须确定类型,但有点不必要的开销。

+0

我曾经,但是我不知道如果我这样做,它在性能部分会好一点,我猜我现在会这样做。 ü认为仍然需要使用RegExp验证程序? – Termiux 2011-03-15 18:58:19

+0

将作为参数传递的用户输入的正则表达式验证器? – kd7 2011-03-15 19:17:17

1

那么,你总是可以尝试在文本框中注入一条SQL语句,这可能会给你一个更快,更确切的答案。

1

是的,这是相当安全的。只要你以后不使用准备好的语句中的“消毒”变量来生成动态sql,你通常就可以。您使用准备好的语句的事实将处理逃生字符和其他简单的注射方法。

我不会放弃,虽然任何其他验证...

+0

喜欢什么?除了检查空的字段,我应该检查其他的东西吗? – Termiux 2011-03-15 18:58:54

+0

你期望得到什么样的输入?检查任何没有意义的东西。我是客户端和服务器端验证的忠实粉丝,然后使用参数化/准备语句。如果没有别的我想看到人们试图给我垃圾时,即使它不太可能会成功。 – 2011-03-15 19:09:54