实际上有两个问题:
我知道我必须尽可能多地使用存储过程,但我想知道以下内容。
答:我可以从SELECT语句中获取SQL注入攻击,例如(Select * from MyTable)吗?
B: 另外,当我在ASP.NET中使用SQLDataSource时,我可以获得SQL注入攻击吗?
答案 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不能保护您免受注射。插入,删除,丢弃等仍然会发生。