我试图在C#中针对SQL Server数据库创建参数化查询.
码:
query = new StringBuilder( "SELECT @fields FROM @tables");
using(SqlConnection connection = new SqlConnection(connection))
{
SqlCommand command = new SqlCommand(query.ToString(), connection);
command.Parameters.AddWithValue("@fields", fields.ToString());
command.Parameters.AddWithValue("@tables", tables.ToString());
try
{
connection.Open();
Int32 rowsAffected = command.ExecuteNonQuery();
Console.WriteLine("RowsAffected: {0}", rowsAffected);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的部分是失败的消息"必须声明表变量"@ tables \".但是正如你所看到的,它已经被明确定义了.
所以我的问题是:
我希望这是一个正确的问题,parameters.addwithvalue工作怎么样?我正在考虑防止SQL注入?我一直在Stackoverflow上看很多,很多人说"//反对sql注入".我一直在盲目地使用它,但现在我必须提交一份关于我的任务的文章,我需要解释为什么它是保护.我一直试图在MSDN上找到一些东西,找到了这个:
SQL注入但它使用了parameters.add.然后我读到他们替换.Add了.AddWithValue,是真的吗?那么任何官员呢?
所以基本上,任何人都可以更好地搜索一些可以防止SQL注入的官方文书工作?或者可以告诉我它是如何工作的?
我不是想让你做我的工作,我只是找不到自己.
我这样使用它:
using (SqlConnection conn = new SqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
String queryString = "DELETE FROM dbo.SecurityAccess WHERE Username = ' @Username ";
cmd.CommandText = queryString;
cmd.Parameters.AddWithValue("@Username", Username);
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud) 我现在已经阅读了很多有关 SQL 注入并试图阻止它的内容。我读过几篇关于如何以及为何使用的文章
Command.Parameters.Add()
Run Code Online (Sandbox Code Playgroud)
但我仍在寻找它如何以及为何防止 SQL 注入的答案。
MSDN 没有太多这方面的信息。
这是我如何使用它的示例:
SqlCommand myCommand = new SqlCommand("SELECT * FROM table WHERE name = @name ", myConnection);
myCommand.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = "MaMu2";
Run Code Online (Sandbox Code Playgroud)
我的代码对于 SQL 注入是否安全,还是我错了?
编辑:主要问题是:它内部如何工作?