TableAdapters SQL注入

时间:2009-02-27 18:43:18

标签: .net dataset sql-injection

您好我正在使用数据集,在该数据集中我有一个表适配器。在我的表适配器中,我使用存储过程作为查询。如果我使用以下行使用我的表适配器插入表单数据,是否可以安全地防止SQL注入?感谢。

UserDataSetTableAdapters.UserInformationTableAdapter myFactory = new TestProject.UserDataSetTableAdapters.UserInformationTableAdapter();
            myFactory.spTest_InsertUserInformation(id, frmAddress);

4 个答案:

答案 0 :(得分:4)

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


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语句。大多数人都这样做是正确的,但是如果你正在使用第三方提供商,你应该在假设你安全之前仔细检查一下。

答案 1 :(得分:1)

简短回答:是的:)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果你在proc本身使用动态SQL,它使用EXEC(@SQL)而不是sp_executesql 参数那么你就不安全了,否则就是