Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AddWithValue sql注入安全吗?为什么?_C#_Sql - Fatal编程技术网

C# AddWithValue sql注入安全吗?为什么?

C# AddWithValue sql注入安全吗?为什么?,c#,sql,C#,Sql,我希望这是一个合适的地方,问parameters.addwithvalue如何工作?我在考虑如何防止SQL注入?我一直在关注Stackoverflow,很多人说“//反对sql注入”。我一直在盲目地使用它,但现在我必须提交一份关于我的作业的论文,我需要解释为什么它是保护。我一直在努力在MSDN上找到一些东西,找到了这个: 但是它使用参数。添加。然后我读到他们用.AddWithValue替换.Add,这是真的吗?那么,有没有关于这件事的官员 所以基本上,有谁能更好地搜索一些防止SQL注入的官方文件

我希望这是一个合适的地方,问
parameters.addwithvalue
如何工作?我在考虑如何防止SQL注入?我一直在关注Stackoverflow,很多人说“//反对sql注入”。我一直在盲目地使用它,但现在我必须提交一份关于我的作业的论文,我需要解释为什么它是保护。我一直在努力在MSDN上找到一些东西,找到了这个:

但是它使用
参数。添加
。然后我读到他们用
.AddWithValue
替换
.Add
,这是真的吗?那么,有没有关于这件事的官员

所以基本上,有谁能更好地搜索一些防止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();
}

如果不将参数化查询与上述命令一起使用,则该命令如下所示:

string queryString="DELETE FROM dbo.SecurityAccess WHERE Username = '"+txtUserName.Text+"'";
在上面的命令中,用户在文本框中输入的任何内容都将分配用户名(例如:
txtUserName

如果用户想要注入一些行为(添加删除/更新或他想做的任何事情),他可以在文本框中输入以下内容(
txtUserName

=>
“'';从用户中删除*”

然后,具有给定
username
值的上述命令如下所示:

string queryString="DELETE FROM dbo.SecurityAccess WHERE Username = '';delete * from users";

最后,上面的命令将删除
users
表中的所有记录。

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

数据类型转换的一个潜在解决方案是使用显式的
Add
方法,而不是将数据类型作为第二个参数的
AddWithValue
。关于这方面的更多细节


有关更多详细信息,请阅读。

简而言之,参数允许对数据进行类型安全和长度检查。启用对SQL注入的防御,它们不会完全禁止SQL注入—您仍然需要检查输入

关于类似的话题

解释参数如何100%不阻止SQL注入

SQL注入示例(摘自:)

考虑当用户在SSN文本框中键入以下字符串时会发生什么情况,该文本框需要nnn nnnn形式的社会保险号。 ' ; 删除数据库酒吧--

应用程序使用输入执行以下动态SQL语句或存储过程,该语句或存储过程在内部执行类似的SQL语句

// Use dynamic SQL
SqlDataAdapter myCommand = new SqlDataAdapter(
          "SELECT au_lname, au_fname FROM authors WHERE au_id = '" + 
          SSN.Text + "'", myConnection);

// Use stored procedures
SqlDataAdapter myCommand = new SqlDataAdapter(
                                "LoginStoredProcedure '" + 
                                 SSN.Text + "'", myConnection);
开发人员的意图是,当代码运行时,它插入用户的输入并生成一个SQL语句

SELECT au_lname, au_fname FROM authors WHERE au_id = '172-32-9999'
但是,代码会插入用户的恶意输入并生成以下查询

从au_id=''的作者中选择au_lname、au_fname;删除数据库发布--
'

避免注入攻击的常用方法。

•约束和清理输入数据。通过验证类型、长度、格式和范围,检查已知良好数据

•使用类型安全SQL参数进行数据访问。您可以将这些参数用于存储过程或动态构造的SQL命令字符串。参数集合(如SqlParameterCollection)提供类型检查和长度验证。如果使用参数集合,则输入将被视为文字值,SQL Server不会将其视为可执行代码。使用参数集合的另一个好处是可以强制执行类型和长度检查。超出范围的值将触发异常。这是纵深防御的一个很好的例子

•使用在数据库中具有受限权限的帐户。理想情况下,您应该只向数据库中选定的存储过程授予执行权限,而不提供直接的表访问


•避免披露数据库错误信息。如果出现数据库错误,请确保不要向用户透露详细的错误消息。

感谢您的注意,我会在那里查看一下,因为我知道这一点,我更想知道为什么会这样?我的意思是,对我来说,我只是用一个值来更改一个标记,这对安全来说毫无意义?@MatiasP:你可以看看