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

实际上有2个问题

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

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

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

回答你的问题。

答:是的,您可以从任何带参数的查询获取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查询并自动清理它们以防止注入。

为了避免注射,要么:

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

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

如果你的例子,

  SELECT * from MyTable 

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

  SELECT * from MyTable WHERE name='x' 

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

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

我建议享受这个xkcd漫画,关于sql注入的好教训

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

对于初学者,您可以validation文本框或将用于允许输入的任何控件。 如果你正在寻找一个数字,请确保他们只输入数字,如果他们输入一个单词,请确保没有可用的标点符号。 除非绝对需要,否则取出像 – 和’这样的字符。 您可以使用ajax和/或javascript完成所有这些操作。 此外, 这是一篇关于注射防护的有趣文章。 参数化查询也是一个很好的选择

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

例:
搜索框:[] [GO]

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

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

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

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

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

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

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