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

SQL查询参数化如何工作?

景鹏飞
2023-03-14
问题内容

我问这个问题有点傻,因为我似乎是世界上唯一一个不了解这个问题的人,但是无论如何,这都是可行的。我将以Python为例。当我使用原始SQL查询(通常使用ORM)时,我会使用参数化,例如使用SQLite的以下示例:

方法A:

username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)

我知道这可行,我知道这是通常推荐的方式。SQL注入易受攻击的方式可以执行以下操作:

方法B:

username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)

到目前为止,我可以告诉我了解SQL注入,如本Wikipedia文章中所述。我的问题很简单:方法A与方法B有什么真正的不同?为什么方法A的最终结果与方法B不同?我假设该cursor.execute()方法(Python的DB-
API规范的一部分)负责正确地对输入进行转义和类型检查,但这从未在任何地方明确声明。在这种情况下,所有这些参数化就是吗?对我来说,当我们说“参数化”时,所有的意思就是“字符串替换”,例如%格式。那不对吗?


问题答案:

参数化查询实际上并不执行字符串替换。如果使用字符串替换,则SQL引擎实际上会看到类似以下的查询

SELECT * FROM mytable WHERE user='wayne'

如果使用?参数,则SQL引擎会看到如下查询

SELECT * FROM mytable WHERE user=<some value>

这意味着,即使在看到字符串“ wayne”之前,它也可以完全解析查询并大致了解查询的功能。它将“
wayne”粘贴到它自己的查询表示中,而不是描述查询的SQL字符串中。因此,SQL注入是不可能的,因为我们已经通过了该过程的SQL阶段。

(以上是概括性的,但或多或​​少传达了这个想法。)



 类似资料:
  • 我想在Select&Create table语句中向查询提供运行时值。参数化Athena SQL查询的方法有哪些?我尝试了从Presto中使用和语句,但它在Athena控制台中不起作用。我们需要任何像Python这样的外部脚本来调用它吗?

  • 问题内容: 我有一个存储在列表中的关键字列表。 要从表中获取记录,请使用以下查询: 您可能已经注意到,我的查询容易受到sql注入的攻击,因此我想通过SqlCommand()使用参数。我已经尝试了以下方法,但仍然无法正常工作: 我在哪里犯错,或者应该怎么做? 问题答案: 您在这里做错了几件事: 您为所有参数赋予相同的名称。那行不通。参数需要唯一的名称。 您为每个项目创建一个新的SqlCommand。

  • 问题内容: 通过我可以参数化这样的查询; 但是问题在于,如果a为None,则查询应如下所示; 因此,当查询可以为None或字符串时,查询应如何? 问题答案: 解决方案是使用ISO / ANSI标准-安全比较: 并非所有数据库都支持此功能,因此您还可以使用: 如果您不愿意两次传递参数,则可以在子句中包含它:

  • 问题内容: 我一直在试图弄清楚为什么以下代码未在我的ResultSet中生成任何数据: 另一方面,以下各项可以正常运行: SCHOOL的数据类型为CHAR(9字节)。除了setString,我还尝试了: 我完全留意接下来要研究什么;Eclipse调试器说,即使在setString或setCharacterStream之后,SQL查询也不会更改。我不确定这是因为设置参数不起作用,还是调试器根本无法在

  • 我正在尝试查询一组多边形(在运行时传入)中的任何一个是否与存储在数据库中“enclosing_polygons”字段中的一组多边形相交,这是一个 MultiPolygonField。 下面是查询的示例: 这个查询可以很好地处理硬编码的值,但是当我试图参数化它时,Postgres似乎不能识别?当我试图填充多边形点时,将它们作为参数。 当我设置前两个参数(针对field1和field2)时,这些JDB

  • 问题内容: 我的DataAcess类中具有以下功能,但未显示任何结果。 我的代码如下: 我也尝试过: 但是它可以很好地运行而无需像这样进行参数设置: 如何使用 @ProductName 参数化编写此代码? 问题答案: 你应该用 代替 为什么?因为在查询中,您的参数在引号内。在报价,SQL会将其识别为一个 字符串字面量 和 从来没有 看到它作为一个参数。