【发布时间】:2010-11-18 18:52:25
【问题描述】:
我觉得问这个有点傻,因为我似乎是世界上唯一一个不明白的人,但不管怎样,还是这样吧。我将使用 Python 作为示例。当我使用原始 SQL 查询(我通常使用 ORM)时,我使用参数化,就像这个使用 SQLite 的示例:
方法一:
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 注入,如 this Wikipedia article 中所述。我的问题很简单:方法 A 与方法 B 有何不同?为什么方法 A 的最终结果与方法 B 不一样?我假设 cursor.execute() 方法(Python 的 DB-API 规范的一部分)负责正确地转义和对输入进行类型检查,但这从未在任何地方明确说明。这就是在这种情况下的所有参数化吗?对我来说,当我们说“参数化”时,这意味着“字符串替换”,比如 %-formatting。不对吗?
【问题讨论】:
-
我会将它与存储过程一起使用,但单独使用它是一个好问题。读了一点后我发现是因为下面说的 Calsbeek。参数化查询将“wayne;drop table users”作为整个用户名来查找,而不是将其视为进一步的指令集。此页面上的最后一条评论告诉我:taylorza.blogspot.com/2009/04/…
标签: sql security sql-injection