2013-04-30 75 views
1

我有数据库功能,它选择不同的条件数据。有两种可能的方法来实现这一点。 首先哪个更好的方法来停止sql注入

public string select(string name) 
    { 
     string s = null; 
     query = "select * from tablename where [email protected]"; 
     con.Open(); 
     com=new SqlCeCommand(query,con); 
     com.Parameters.AddWithValue("@name",name); 
     sdr=com.ExecuteReader(); 
     while (sdr.Read()) 
     { 
      s = sdr.GetString(0); 
     } 
     return s; 
    } 

在这种方法中,我需要在查询,如订单的地名或在查询多个参数变化小的,地址,前20名等代码的不同功能,但这种方法固定在sql注入方面。 二

public string select(string query) 
    { 
     string s = null; 
     con.Open(); 
     com=new SqlCeCommand(query,con); 
     sdr=com.ExecuteReader(); 
     while (sdr.Read()) 
     { 
      s = sdr.GetString(0); 
     } 
     return s; 
    } 

在第二种方法我通过数据库查询与值函数的参数,所以我不需要com.Parameters.AddWithValue("@name",name);,并不需要为选择查询的变化代码的不同功能。查询中的参数值由代码而不是由用户给出。由于用户未给出参数输入,因此可以使用此方法进行sql注入。

哪一个是安全的,高效的,因为我的应用程序无法承受数据丢失。

+1

我结合之前,我曾经通过数据持久层验证长。在我达到这一点之前,我会拒绝它。 – duffymo 2013-04-30 12:41:49

+0

Imho第一种方法更好 €:duffymo是正确的,检查你的输入。 – jAC 2013-04-30 12:41:53

回答

1

您是否考虑过使用Linq进行SQL或EDM?使用这些对象意味着你的代码(理论上)是免于SQL注入攻击的。

+0

对于我来说,在.NET社区的某些部分有多少恐惧/混淆了LINQ和实体框架(以及其他ORM)。 – jfrankcarr 2013-04-30 12:50:31

+0

不知道我明白你来自哪里。我的理解是查询被转换为参数化查询“底层”,但是您可以利用LINQ的易用性。这就是为什么我们无论如何使用它:) – Andrew 2013-04-30 12:52:53

+0

我认为这是一个很好的建议,因为使用它有助于消除不使用参数化查询的快捷方式的诱惑。我见过很多遗留.NET代码,它们将参数化存储的proc调用与直接从用户输入构建SQL语句的“SQL构建器”代码混合在一起。如果有人忘记检查用户在程序中的其他位置输入,则会出现问题。 – jfrankcarr 2013-04-30 13:18:20

1

由于用户没有给出参数输入 ,所以在此方法中是否可以执行sql注入。

只要你的用户没有与数据库进行交互,谁会尝试在你的参数中注入SQL。

一般来说,只要您在查询中使用参数,您就可以安全使用SQL注入。

+0

是否有可能在某种程度上修改exe文件并访问sql注入的第二种方法。我知道它的愚蠢问题的类型,但我不能承受数据丢失。 – 2013-04-30 12:55:55

+1

如果有人可以访问您的EXE并可以做这样的事情,那么忘记SQL注入,您应该担心其他事情。但话虽如此,你的第一种方法比另一种更好。 – Habib 2013-04-30 13:02:48

3

主要防御:

选项#1:使用准备的语句(参数化查询)

选项#2:使用存储过程

选项#3:逸出所有用户提供的输入

额外防御:

另外强制:最低特权

还执行:白名单输入验证

来源www.owasp.org

+0

哪一个比较好从上面两个方面来看。 – 2013-04-30 12:52:18

+0

在你的情况下,由系统创建的查询更安全,如果你正在执行客户端验证,然后将查询旁边的参数传递给查询将会OK ..但是,正如我所说的使用存储过程是更好的方法 – 2013-04-30 13:00:20