c# - AddWithValue sql 注入(inject)安全吗?为什么?

标签 c# sql

<分区>

我希望这是问的正确位置,parameters.addwithvalue 是如何工作的?我在想一种防止 SQL 注入(inject)的方法?我在 Stackoverflow 上看了很多,很多人说“//反对 sql 注入(inject)”。我一直在盲目使用它,但现在我必须交一篇关于我的任务的论文,我需要解释为什么它是保护。我一直试图在 MSDN 上找到一些东西,找到了这个:

SQL injection但它使用了 parameters.add。然后我读到他们将 .Add 替换为 .AddWithValue,这是真的吗?有官方负责吗?

所以基本上,有人能更好地搜索一些可以防止 SQL 注入(inject)的官方文件吗?或者可以告诉我它是如何工作的吗?

我不是想让你做我的工作,我只是找不到我自己。

我是这样使用它的:

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();
}

最佳答案

从 SQL 注入(inject)的角度来看,使用参数通常是安全的(取决于您在 SQL 中对这些参数执行的操作...)。你的例子是安全的。如何添加参数从 SQL Ibjection 的角度来看没有区别,但从 ADO.Net 和 SQL 性能的角度来看却有很大的不同。 AddWithValue 是一种反模式,因为与参数类型和大小相关的性能问题。在您的示例中,@UserName 将是 NVARCHAR 类型的参数,这可能会使 WHERE Username=@UserName 谓词无法使用(不会在用户名上使用索引)。执行结果将是可怕的。

数据类型转换的一个潜在解决方案是使用显式 Add 方法而不是 AddWithValue,后者将数据类型作为第二个参数。有关此的更多详细信息 here .

有关更多详细信息,我建议您阅读 How Data Access Code Affects Database Performance .

关于c# - AddWithValue sql 注入(inject)安全吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263536/

相关文章:

c# - 将方法转换为 C# 源代码

c# - 如何使用 MSBuild NuGet 将 .csproj 文件加载到 .NET Core 3.0 中

sql - 添加全选到下拉列表

c# - 将 N 个 Excel 工作簿中的第 X 个工作表复制到新工作簿中 - 使用哪种语言?

c# - 通用类词典

sql - 在 Rails 中按虚拟属性排序

mysql - 将表与数据库中的 BOOLEAN 进行比较

mysql - 内连接和外连接的顺序重要吗?

c# - 使用从存储过程创建的未分配的局部变量(对象)

sql - Oracle With, Case When 语句缺少关键字