我可以从SELECT语句中获得SQL注入攻击吗?

时间:2009-07-08 17:15:02

标签: c# asp.net sql vb.net sql-injection

实际上有两个问题:

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

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

B: 另外,当我在ASP.NET中使用SQLDataSource时,我可以获得SQL注入攻击吗?

8 个答案:

答案 0 :(得分: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查询并自动清理它们以防止注入。

为了避免注射,要么:

  • 清理您的输入
  • 使用您平台提供的抽象层。
  • 使用参数化查询。

答案 1 :(得分:5)

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

如果你的例子,

 SELECT * from MyTable

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

 SELECT * from MyTable WHERE name='x'

x是一个参数)然后有人可能会在他们的名字中注入一些SQL。

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

答案 2 :(得分:4)

我建议欣赏这个xkcd漫画,这是一个关于sql注入的好教训

答案 3 :(得分:3)

当您为用户提供操作查询的能力时会发生注入黑客攻击,并且当参数化查询中大多数(如果不是全部)威胁被中和时,因为特殊字符被转义为仅使您想要的查询可执行

例:
搜索框:[] [GO]

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

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

答案 4 :(得分:2)

回应你的评论 - “我该怎么办?”

对于初学者,您可以验证文本框或将用于允许输入的任何控件。如果你正在寻找一个数字,请确保他们只输入数字,如果他们输入一个单词,请确保没有可用的标点符号。取出像 - 和'之类的字符,除非绝对需要。您可以使用ajax和/或javascript完成所有这些操作。另外,Here is an interesting Article on protection from injection.parameterized queries are a great option

答案 5 :(得分:1)

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

答案 6 :(得分:1)

SQL注入要求SQL字符串与一些用户控制的参数组合,因此如果Select语句是常量,则它不受注入的影响。另一方面,如果您要添加“WHERE user_id =”+ userIdString,则可以进行注入。

避免注射不需要存储过程,您不应指望对输入进行消毒。相反,只需绑定参数而不是操纵字符串。

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

答案 7 :(得分:1)

每当您允许用户将输入数据提供给动态SQL查询时,您就有可能被注入。 sqldatasource不能保护您免受注射。插入,删除,丢弃等仍然会发生。