2012-03-22 71 views
0

我有一个使用SqlCommand功能进行sql注入防护的插入sql语句,但它给出了错误:多部分标识符“System.Web.UI.HtmlControls.HtmlInputText”无法绑定。我使用相同的SqlCommand功能来更新相同的表格,但是,下面的这个简单插入提供了该错误。谁能帮忙?无法绑定多部分标识符“System.Web.UI.HtmlControls.HtmlInputText”

sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ([ds0402_key] ,[lname]) " + 
     "VALUES (" + Session["DS0402Key"] + "," + @VisitorLName + ");"; 

try 
{ 
    using (SqlCommand cmd = new SqlCommand(sSql, conn)) 
    { 
    cmd.Parameters.AddWithValue("@VisitorLName", VisitorLName.Value); 
    cmd.ExecuteNonQuery(); 
    } 
} 

catch (Exception ex) 
{ 
//error handling code 
} 
+2

构建'sSql'的方式似乎容易受到SQL注入的影响。你认为[Bobby Tables](http://xkcd.com/327/)可能是你的用户之一吗? – 2012-03-22 02:45:24

+1

准备好的语句除非将每个变量值放入参数中,否则不会有多大帮助。例如,在这种情况下,您会说'VALUES(@ DS0402Key,@VisitorLName)',并以'@ VisitorLName'的相同方式向该命令添加参数'@ DS0402Key'。 – cHao 2012-03-22 02:52:25

回答

2

如果它确实是这个代码的投掷的错误,我的猜测是因为你的逃逸和报价都被抬高了,你最终像

INSERT INTO [camss].[dbo].[tb_ds0402req] ([ds0402_key] ,[lname]) 
VALUES (whatever your key is unquoted!, System.Web.UI.HtmlControls.HtmlInputText) 

查询(假设VisitorLName是一个HtmlInputText控件)。您不添加字符串"@VisitorLName",导致它不在引号中 - 您将从VisitorLName.ToString()插入返回值... AFAIK返回控件类型的完全限定名称。 (你没有在引用@VisitorLName而没有引号的时候出错,因为@是C#逃避标识符的方式,所以你可以使用关键字作为变量名等,就C#而言,你只是说... + VisitorLName + ...)

还要注意,你构建SQL字符串的方式,你没有利用参数,这是防止SQL注入的主要特性 - 并简化了你的SQL构建,开机!如果您要使用参数,请将它们用于不意味着表名或任何其他值的每个值。 (对于表/数据库/模式/ etc名称,你是独立的,你不能使用参数来代替这些参数,阅读:你很容易再次使用SQL注入,所以不要这样做,除非你有到!)

为了解决这个问题,改变你的代码,以便它读取像

sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ([ds0402_key] ,[lname]) " + 
     "VALUES (@DS0402Key, @VisitorLName)"; 

try 
{ 
    using (SqlCommand cmd = new SqlCommand(sSql, conn)) 
    { 
    cmd.Parameters.AddWithValue("@DS0402Key", Session["DS0402Key"]); 
    cmd.Parameters.AddWithValue("@VisitorLName", VisitorLName.Value); 
    cmd.ExecuteNonQuery(); 
    } 
} 
catch (Exception ex) 
{ 
//error handling code 
} 

另外,找到你要坚持把钥匙插进了会议...,并确保你'不是插入一个完整的控件(而不仅仅是它的值)。

+0

谢谢你的回复,所有的好建议。我尝试添加Session [“DS0402Key”]作为参数,当我在insert sql中引用它时,VS2010会提供一个错误,它在当前上下文中不存在。我尝试在sql中将DS0402Key的值与@VisitorLName一起硬编码,并且仍然收到原始错误。 – user1174548 2012-03-22 12:31:42

+0

我也完全删除了DS0402Key柱子,只是为了排除它可能导致问题,但我仍然收到原始错误。 – user1174548 2012-03-22 12:45:37

+0

这不仅仅是上面添加的参数。请注意SQL字符串(特别是,我不是通过将所有东西放在一起来临时构建它;我让参数完成这项工作)。你做事的方式,一切引用都错了。这就是你的错误很可能来自哪里。 – cHao 2012-03-22 13:11:10

相关问题