您好我从下拉列表中获取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 ))
{
}
答案 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();
完成以下操作:
答案 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注入中存活...所以,不......你不会有这个问题