这可能是sql注入的受害者

时间:2013-05-13 08:37:47

标签: c# asp.net sql sql-injection

您好我从下拉列表中获取id值并将其传递给后面的代码,该方法将值传递给sql以执行某些操作。

我想知道这是否是正确的做法。

如果不是那么为什么不,以及如何有人可以用sql注入注入它以及解决方案是什么。

   protected void Drop1_SelectedIndexChanged(object sender, EventArgs e)
            {
               int abcID;
                    abcID= Convert.ToInt32(drop1.SelectedItem.Value);

    string sc = "SELECT dddd FROM table1 WHERE abcID NOT IN("
                    +  abcID + ")";

                using (SqlDataSource ds = new SqlDataSource(ConnectionString(), sc ))
                {
    }

6 个答案:

答案 0 :(得分:3)

由于您对用户发送的值使用Convert.ToInt32,因此不会发生SQL注入。无效的值会引发异常。

然而,使用参数化查询通常是一种好习惯 这样即使字符串值也是安全的。

SqlCommand command = new SqlCommand("SELECT dddd FROM table1 WHERE abcID NOT IN(@myID)");
command.Parameters.AddWithValue("@myID", abcID);

答案 1 :(得分:3)

您应该使用参数化查询,如下所示:

string sc = "SELECT dddd FROM table1 WHERE abcID NOT IN(@par)";

cmd=new SqlCommand(sc,conn);
cmd.Parameters.AddWithValue("@par",abcID );
da=newsqldataadapter(cmd);
ds=new DataSet();
da.Fill(ds);
cmd.excutenonquery();

完成以下操作:

http://en.wikipedia.org/wiki/SQL_injection

答案 2 :(得分:1)

不,此特定示例不能用于SQL注入。

然而,如果你训练自己总是使用存储过程或参数化查询,你将永远不会进入你的系统来创建这样的SQL语句。这样,您将永远不会创建会产生SQL注入攻击向量的东西(可能是偶然的)。

答案 3 :(得分:1)

为了获得最佳实践,您应该使用参数化查询。

 SqlCommand command = new SqlCommand("SELECT dddd FROM table1 WHERE abcID NOT IN( @Value )"
 command.Parameters.Add(new SqlParameter("Value", abcId));

你可以假设你是安全的,因为Convert.ToInt32如果有人试图注入类似FormatException的内容,DROP TABLE table1;会抛出{{1}}您的下拉列表并将其传递回服务器。但是,我强烈建议使用参数化查询。

答案 4 :(得分:1)

由于您将值转换为32位整数,因此不会出现“注入”问题。但是有更好的方法来逃避价值观。 (参见参数化)

答案 5 :(得分:1)

不是一个很好的做事方式,但它会在sql注入中存活...所以,不......你不会有这个问题