Sou*_*ade 2 c# sql-server asp.net
我一直在尝试在ASP.NET中以编程方式添加列来修改SQL Server中的表.
请参阅以下代码:
string suppliernotxt = supplieridlist[1].ToString();
//SqlCommand cmd2 = new SqlCommand("ALTER TABLE [ProductNormalDB] ADD suppliernotxt nvarchar(20) NULL", con);
SqlCommand cmd2 = new SqlCommand("ALTER TABLE ProductNormalDB ADD @supplierlist nvarchar(20) NULL", con);
cmd2.Parameters.AddWithValue("@supplierlist", suppliernotxt);
//cmd2.Parameters.AddWithValue("@supplierlist", suppliernotxt.ToString());
//cmd2.Parameters["@supplierlist"].Value = supplieridlist[x];
cmd2.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
supplieridlist是一个数组,它获取要添加到SQL Server数据库中的所有列名.由于某种原因,参数化方法不起作用并显示以下错误:
'@supplierlist'附近的语法不正确.
基本思路是让用户从复选框中选择供应商的名称,根据所选的供应商数量,阵列将为ex创建供应商名称.如果我们选择了3个供应商,该阵列将节省"Supplier1","Supplier2","Supplier3"然后SqlCommand应该改变表并添加新列.
您不能使用参数来表示列的名称.
参数只能用于表示WHERE子句或INSERT或UPDATE语句的值.
您可以对查询文本使用字符串连接,将字符串值传递给存储过程或使用某种形式的动态sql.
请谨慎使用这些方法,因为如果您不对传递给代码的值保持绝对控制,那么您将接触到Sql Injection.
添加作为动态SQL执行的示例,但仍然容易受到SQL注入攻击
string suppliernotxt = supplieridlist[1].ToString();
string execSQL = "DECLARE @sup nvarchar(15); " +
"SET @sup = '" + suppliernotxt + "'; " +
"EXEC ('ALTER TABLE ProductNormalDB ADD ' + @sup + ' nvarchar(20) NULL')"
SqlCommand cmd2 = new SqlCommand(execSQL, con);
cmd2.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,即使使用动态SQL,也没有任何东西阻止SQL注入攻击通过suppliernotxt变量传递
编辑正如下面@RBarryYoung的评论中所解释的,对于这种动态sql情况,SQL注入问题的一个很好的改进可能是使用QUOTENAME函数来获取带有输入字符串周围所需分隔符的Unicode字符串
string execSQL = "DECLARE @sup nvarchar(15); " +
"SET @sup = QUOTENAME('" + suppliernotxt + "'); " +
"EXEC ('ALTER TABLE ProductNormalDB ADD ' + @sup + ' nvarchar(20) NULL')"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8898 次 |
| 最近记录: |