您好,我正在使用一个数据集,在该数据集中,我有一个表适配器。在我的表适配器中,我使用存储过程作为查询。如果我使用我的表适配器使用下面几行代码插入表单数据,那么它是否可以安全地防止SQL注入?谢谢。
UserDataSetTableAdapters.UserInformationTableAdapter myFactory = new TestProject.UserDataSetTableAdapters.UserInformationTableAdapter();
myFactory.spTest_InsertUserInformation(id, frmAddress);发布于 2009-02-27 18:52:47
如果不发布存储过程代码,就无法真正回答您的问题,但您可能可以自己回答。
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;;唉哟。
因此,回答您的问题:如果您的存储过程没有根据它的参数动态地生成SQL并对它们进行EXEC,那么您应该是安全的。
注意:当然,这依赖于.NET数据提供程序使用参数调用过程,而不是生成动态SQL语句。大多数人这样做是正确的,但如果你使用的是第三方提供商,你应该在假设你是安全的之前仔细检查一下。
发布于 2009-02-27 18:48:40
简单回答:是:)
select 1:即使您没有在适配器上使用存储过程和带有参数的已定义查询,也可以安全地防止注入,即select f1、f2 where f3 = @myparameter ...这将使用已准备好的查询。
发布于 2009-02-27 18:51:43
使用SQL Prolier跟踪进行验证。如果底层应用程序接口是安全的,您将看到参数化的T-SQL命令,类似于sp_executesql。
https://stackoverflow.com/questions/596057
复制相似问题