2个问题实际上:
我知道我必须尽可能多地使用存储过程,但我想知道以下内容。
答:我可以从 SELECT 语句(例如 (Select * from MyTable) )中获得 SQL 注入攻击吗?
B: 另外,当我在 ASP.NET 中使用 SQLDataSource 时,我会受到 SQL 注入攻击吗?
2个问题实际上:
我知道我必须尽可能多地使用存储过程,但我想知道以下内容。
答:我可以从 SELECT 语句(例如 (Select * from MyTable) )中获得 SQL 注入攻击吗?
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 使用参数化查询,因为它基于您以编程方式提供的参数构建查询。
当您赋予用户操纵查询的能力时,就会发生注入黑客攻击,并且使用参数化查询,大多数(如果不是全部)威胁都会被消除,因为特殊字符会被转义以仅使您想要执行的查询
示例:
搜索框:[ ] [ GO ]
select * from myTable where keywords like '%$searchTerm%'
然后黑客插入一个'; 终止查询并可以编写他们想要的任何其他查询。
回应您的评论 - “我必须做什么?”
对于初学者,您可以验证文本框或任何将用于允许输入的控件。如果您正在寻找数字,请确保他们只输入数字,如果他们正在输入单词,请确保没有标点符号可用。除非绝对需要,否则去掉 -- 和 ' 之类的字符。您可以使用 ajax 和/或 javascript 来完成所有这些工作。此外,这是一篇关于防止注射的有趣文章。参数化查询也是一个不错的选择
如果您没有使用参数化查询,而是连接,您可以为任何类型的 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 并不能保护您免受注入。插入、删除、删除等仍然会发生。