为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语句不完整。这只是一个例子。
我的问题是,似乎没有替换命令参数。
答案 0 :(得分:2)
您不能对表名或列名使用绑定变量。
因此,您必须使用字符串连接构建该SQL语句,并在必要时手动引用/转义,并且要非常小心地进行操作。
直接用户输入会非常危险,但如果它只是间接的,例如只选择自动生成名称的选项,那么你应该没问题。
答案 1 :(得分:0)
在这个特定的代码中,不能有sql注入,因为用户在此没有发言权。
当用户输入被错误地过滤为嵌入在SQL语句中的字符串文字转义字符或用户输入没有强类型和意外执行时,会导致SQL注入在你的情况下,用户不输入任何东西,所以不用担心。
但是,您的create table查询无效。你可以在create statement上阅读here。
您不能在create语句中使用“...”,并且每列必须具有类型