1

我有数据库功能,可以根据不同的条件选择数据。有两种可能的方法来实现这一点。第一的

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

在这种方法中,我需要为查询中的小变化编写不同的函数,例如 order by ,地址代替 name 或 where query 中的多个参数,top 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 注入,因为用户没有为参数提供输入。

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

4

3 回答 3

3

主要防御:

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

选项 #2:使用存储过程

选项#3:转义所有用户提供的输入

额外的防御:

同时执行:最小特权

同时执行:白名单输入验证

来源 www.owasp.org

于 2013-04-30T12:43:09.570 回答
1

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

于 2013-04-30T12:42:19.817 回答
1

在这种方法中是否可以进行 sql 注入,因为用户没有提供参数输入。

只要您的用户不与数据库交互,那么谁会尝试在您的参数中注入 SQL。

通常,只要您在查询中使用参数,就可以安全地避免 SQL 注入。

于 2013-04-30T12:42:54.430 回答