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

Eti*_*nne 8 c# sql vb.net asp.net sql-injection

实际上有2个问题

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

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

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

And*_*ore 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();
Run Code Online (Sandbox Code Playgroud)

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


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

为了避免注射,要么:

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


Chr*_*son 5

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

如果你的例子,

 SELECT * from MyTable
Run Code Online (Sandbox Code Playgroud)

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

 SELECT * from MyTable WHERE name='x'
Run Code Online (Sandbox Code Playgroud)

(x作为参数)然后有人可能会在他们的名字中注入一些SQL.

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

  • 更确切地说,只要将不受信任的内容插入查询字符串并将其作为动态SQL执行,就可以获得SQL注入.您不能对表名,列名,SQL关键字,表达式等使用查询参数,因此即使使用参数,您仍然可以创建不安全的查询. (2认同)