Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 表适配器SQL注入_.net_Dataset_Sql Injection - Fatal编程技术网

.net 表适配器SQL注入

.net 表适配器SQL注入,.net,dataset,sql-injection,.net,Dataset,Sql Injection,嗨,我正在使用一个数据集,在该数据集中我有一个表适配器。在我的表适配器中,我使用存储过程作为查询。如果使用我的表适配器使用以下几行插入表单数据,那么它对SQL注入安全吗?谢谢 UserDataSetTableAdapters.UserInformationTableAdapter myFactory = new TestProject.UserDataSetTableAdapters.UserInformationTableAdapter(); myFactory.spT

嗨,我正在使用一个数据集,在该数据集中我有一个表适配器。在我的表适配器中,我使用存储过程作为查询。如果使用我的表适配器使用以下几行插入表单数据,那么它对SQL注入安全吗?谢谢

UserDataSetTableAdapters.UserInformationTableAdapter myFactory = new TestProject.UserDataSetTableAdapters.UserInformationTableAdapter();
            myFactory.spTest_InsertUserInformation(id, frmAddress);
简短回答:是:)


更新1:即使您没有在适配器上使用带有参数的存储过程和定义查询,也可以安全地防止sql注入,即选择f1、f2,其中f3=@myparameter。。。这将使用准备好的查询。

使用SQL Prolier跟踪进行验证。如果底层API是安全的,您将看到参数化的T-SQL命令,类似于sp_executesql。

如果不发布存储过程代码,就无法真正回答您的问题,但您可能可以自己回答


SQL注入攻击源于用户输入的数据在动态生成和执行的SQL查询中晃动。使用存储过程通常通过将参数作为参数传递来避免此问题,因此不会动态生成SQL。过程会自动封装,不会成为原始SQL查询文本的一部分

以以下为例:

SELECT *
FROM myTable
WHERE myId = @ID;
作为参数,您可以安全地将
@ID
设置为“21;DROP TABLE myTable;”。它将为您转义,整个字符串将与myId进行比较。但是,如果动态生成SQL查询,如

string query = "SELECT *\nFROM myTable\nWHERE myId = " + userEnteredText + ";";
现在您将获得以下信息:

SELECT *
FROM myTable
WHERE myId = 21; DROP TABLE myTable;;
哎哟


所以,为了回答您的问题:如果您的存储过程没有根据其参数和
EXEC
参数动态生成SQL,那么您应该是安全的


注意:当然,这依赖于.NET数据提供程序使用参数调用过程,而不是生成动态SQL语句。大多数操作都是正确的,但如果您使用的是第三方提供商,则在假设您是安全的之前,您应该仔细检查这一点。

如果您在使用EXEC(@SQL)而不是带有参数的sp_executesql的进程中使用动态SQL,则您是不安全的,否则就是安全的