C#为create语句阻止SQL注入

时间:2013-08-21 09:16:58

标签: c# sql-injection

为create语句阻止sql注入是否有意义?我怎么能这样做? 我想使用命令参数,但它没有接缝工作:

示例:

var createSql = "CREATE TABLE @TableName (@Column1 ...)";
var command = new SqlCommand();

command.CommandText = createSql;
command.Parameters.AddWithValue("@TableName", "XYZ");
command.Parameters.AddWithValue("@Column1", "Col");

// somewhere else
command.Connection = connection;
command.ExecuteNonReader(); // --> exception: invalid syntax at @TableName

编辑:根据其他数据生成Column和TableNames。间接也是用户输入,是的。给定的create语句不完整。这只是一个例子。

我的问题是,似乎没有替换命令参数。

2 个答案:

答案 0 :(得分:2)

您不能对表名或列名使用绑定变量。

因此,您必须使用字符串连接构建该SQL语句,并在必要时手动引用/转义,并且要非常小心地进行操作。

直接用户输入会非常危险,但如果它只是间接的,例如只选择自动生成名称的选项,那么你应该没问题。

答案 1 :(得分:0)

在这个特定的代码中,不能有sql注入,因为用户在此没有发言权。

当用户输入被错误地过滤为嵌入在SQL语句中的字符串文字转义字符或用户输入没有强类型和意外执行时,会导致SQL注入

在你的情况下,用户不输入任何东西,所以不用担心。

但是,您的create table查询无效。你可以在create statement上阅读here

您不能在create语句中使用“...”,并且每列必须具有类型