3

防止创建语句的 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 语句不完整。这只是一个例子。

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

4

2 回答 2

2

您不能将绑定变量用于表名或列名。

因此,您必须使用字符串连接来构造该 SQL 语句,并在必要时手动引用/转义,并且要非常小心如何去做。

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

于 2013-08-21T09:27:43.553 回答
0

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

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

在您的情况下,用户没有输入任何内容,所以不用担心。

但是,您的创建表查询无效。您可以在此处阅读创建声明。

您不能在创建语句中使用“...”,并且每一列都必须有一个类型

于 2013-08-21T09:23:21.403 回答