1

嗨,我从下拉列表中获取 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 ))
                {
    }
4

6 回答 6

3

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

但是,使用参数化查询通常是一种很好的做法。
这样,即使是字符串值也是安全的。

SqlCommand command = new SqlCommand("SELECT dddd FROM table1 WHERE abcID NOT IN(@myID)");
command.Parameters.AddWithValue("@myID", abcID);
于 2013-05-13T08:41:47.393 回答
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

于 2013-05-13T08:42:12.550 回答
1

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

于 2013-05-13T08:41:08.420 回答
1

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

于 2013-05-13T08:41:56.430 回答
1

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

但是,如果您训练自己始终使用存储过程或参数化查询,您将永远无法将它放入您的系统中来创建这样的 SQL 语句。这样,您将永远不会(可能是偶然的)会创建 SQL 注入攻击向量。

于 2013-05-13T08:41:06.123 回答
1

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

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

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

于 2013-05-13T08:41:07.297 回答