当前位置: 首页 > 面试题库 >

在ADO.NET中,在SQL查询中可以使用SQL参数的地方是否有限制?

周超英
2023-03-14
问题内容

这个问题仅出于教育目的,因为我目前尚未构建任何使用用户输入构建SQL查询的应用程序。

就是说,我知道在ADO.NET中您可以通过执行以下操作来防止SQL注入:

OleDbCommand command = new OleDbCommand("SELECT * FROM Table WHERE Account = @2", connection);
command.Parameters.AddWithValue("@2", "ABC");

但是,假设您的应用程序的设计方式使得用户可以实际输入表的名称,那么您可以执行以下操作吗?(我不在乎允许用户提供表名是否是一个坏主意,我只想知道是否可以执行以下操作……)

OleDbCommand command = new OleDbCommand("SELECT * FROM @1 WHERE Account = @2", connection);
command.Parameters.AddWithValue("@1", "Table");
command.Parameters.AddWithValue("@2", "ABC");

当我运行第二个代码时,我不断收到异常消息,说SQL查询不完整,我想知道问题是我尝试做的事情根本无法完成还是忽略了某些事情。


问题答案:

不可以,查询参数可以代替SQL语句中的 一个标量值
例如,单个字符串文字,日期文字或数字文字。

它不必在WHERE子句中。在SQL中可以有表达式的任何地方,都可以包含标量值,因此也可以包含参数。例如,在联接条件中,选择列表中或ORDER
BY或GROUP BY子句中。

不能 将查询参数用于:

  • 表标识符
  • 列标识符
  • SQL关键字
  • SQL表达式
  • 值列表(例如,在IN()谓词中)

如果需要使查询的这些部分中的任何部分都可由用户定义,则需要通过将应用程序变量内插或连接到字符串中来构建SQL查询字符串。这使得很难防御SQL注入。

在这种情况下,最好的防御方法是将可以安全插值到SQL字符串中的特定值 列入白名单
,例如,在代码中定义的一组表名。让用户从这些预先批准的值中选择一个表,但是不要在随后执行的SQL代码中逐字使用输入。

用户输入可以提供值,但绝不能提供代码。

您可能会发现我的演示文稿“ SQL注入神话和谬论”有帮助。我在该演示文稿中涵盖了白名单(我的示例使用PHP,但该想法适用于任何编程语言)。



 类似资料:
  • 我想实现一个有五个可选变量的搜索函数,并且在每个组合中,所以一个开关/案例不是一个可能的方法。所以我不能使用构建在Spring启动函数,因为它们不是动态的(如果我错了,请纠正我)。我知道crudrepository中有@查询注释,但是没有办法用可选参数编写查询?我试图用jpa编写我自己的数据库访问,没有Spring启动CrudRepository的帮助。我在手册中读到这应该可以工作: 但问题是,我

  • 问题内容: 这个问题已经在这里有了答案 : 9年前关闭。 可能重复: SQL Server查询的最大大小?IN子句?有没有更好的方法 我用Google搜索了一会儿,找不到SQL Server中巨大的查询字符串是否有一定的硬性限制。我的意思是,如果我建立一个1亿个字符的查询,该查询将运行还是服务器将其丢弃太长时间? SQL Server中的SQL查询可以有多长时间(以字符或标记或类似的形式)是否有限

  • 问题内容: 我需要在Spring Data Repository中使用原始SQL,这可能吗?我看到的所有内容始终都是基于实体的。 问题答案: @Query批注允许通过将nativeQuery标志设置为true来执行本地查询。 引用Spring Data JPA 参考文档。 另外,请参阅本节以了解如何使用命名的本机查询。

  • 我有一个API调用,它需要从MySQL数据库中提取一些信息,以便完成请求。问题是,NodeJS不会等待查询响应,我已经尝试用承诺来解决这个问题。下面是我的代码: 这个函数将返回Promise对象,这将触发SQL语法错误,因为这不是预期的数据库输入。我做错了什么?任何建议都非常感谢。

  • 问题内容: 我正在尝试测试将参数传递给sql.DB.Query方法的行为(使用database / sql包和github.com/lib/pq上的PostgreSQL驱动程序)。处理原始查询字符串以查看如何插入参数后,是否有任何方法可以获取原始查询字符串?例如,我正在考虑编写一个准备好的查询,然后检查结果语句。有任何想法吗?谢谢! 问题答案: 它看起来不像在查询本身中插入参数。它发送查询,然后等

  • 问题内容: 有没有一种方法可以给Oracle 11g中的子查询一个别名,例如: 否则,有一种方法可以基于client_ref_id加入两个子查询。我意识到有一个自我连接,但是在我正在自我连接上运行的数据库上可能要花5分钟才能完成(我正在运行的实际查询中有一些额外的逻辑,但是我确定了自我连接是什么引起问题)。各个子查询仅需花费几秒钟即可完成。自联接查询看起来像: 问题答案: 您可以使用Oracle的