9

2个问题实际上:

我知道我必须尽可能多地使用存储过程,但我想知道以下内容。

答:我可以从 SELECT 语句(例如 (Select * from MyTable) )中获得 SQL 注入攻击吗?

B: 另外,当我在 ASP.NET 中使用 SQLDataSource 时,我会受到 SQL 注入攻击吗?

4

7 回答 7

19

回答你的问题。

答:是的,您可以从任何带参数的查询中获得 SQL 注入攻击(如果您不使用平台提供的方法并通过 SQL 调用执行此操作,甚至调用存储过程)。

我被要求提供一个示例,说明即使使用存储过程也可以进行注入。我见过开发的应用程序确实使用存储过程,但是以这种方式:

// C# - DON'T DO THIS!
String regionName = assignedSomewhereElse();
SQLCommand sqlCmd = DatabaseConnection.CreateCommand();
SQLCommand sqlCmd.CommandText =
    String.Format("EXECUTE sp_InsertNewRegion '{0}'", regionName);

sqlCmd.ExecuteNonQuery();

显然,这不是调用存储过程的方式。您应该使用平台的抽象或参数化查询。


B: SQLDataSource是您的数据库的抽象层。它将为您创建 SQL 查询并自动清理它们以防止注入。

为了避免注入,要么:

  • 清理您的输入
  • 使用您的平台提供的抽象层。
  • 使用参数化查询。
于 2009-07-08T17:19:51.420 回答
6

在大多数情况下,您可以在不使用参数化查询的任何时候受到 SQL 注入攻击。

如果你的例子,

 SELECT * from MyTable

没有任何用户输入的数据,所以应该没问题。但是,类似:

 SELECT * from MyTable WHERE name='x'

x作为参数)那么就有可能有人在他们的名字中注入了一些 SQL。

B:ASP.NET 使用参数化查询,因为它基于您以编程方式提供的参数构建查询。

于 2009-07-08T17:17:35.200 回答
3

当您赋予用户操纵查询的能力时,就会发生注入黑客攻击,并且使用参数化查询,大多数(如果不是全部)威胁都会被消除,因为特殊字符会被转义以仅使您想要执行的查询

示例:
搜索框:[ ] [ GO ]

select * from myTable where keywords like '%$searchTerm%'

然后黑客插入一个'; 终止查询并可以编写他们想要的任何其他查询。

于 2009-07-08T17:21:47.517 回答
2

回应您的评论 - “我必须做什么?”

对于初学者,您可以验证文本框或任何将用于允许输入的控件。如果您正在寻找数字,请确保他们只输入数字,如果他们正在输入单词,请确保没有标点符号可用。除非绝对需要,否则去掉 -- 和 ' 之类的字符。您可以使用 ajax 和/或 javascript 来完成所有这些工作。此外,这是一篇关于防止注射的有趣文章。参数化查询也是一个不错的选择

于 2009-07-09T13:27:10.833 回答
1

如果您没有使用参数化查询,而是连接,您可以为任何类型的 SELECT、UPDATE、DELETE 或 INSERT 语句获取 sql 注入

于 2009-07-08T17:18:19.300 回答
1

SQL 注入需要将 SQL 字符串与一些用户控制的参数结合起来,因此如果 Select 语句是常量,则它对注入免疫。另一方面,如果您要添加“WHERE user_id =” + userIdString,则可以进行注入。

避免注入不需要存储过程,也不应该指望清理输入。相反,只需绑定到参数而不是操作字符串。

看看:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

于 2009-07-08T17:20:48.983 回答
1

每当您允许用户将输入数据提供给动态 sql 查询时,您就有被注入的风险。并且 sqldatasource 并不能保护您免受注入。插入、删除、删除等仍然会发生。

于 2009-07-08T17:56:43.483 回答