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