【发布时间】:2018-08-15 22:59:18
【问题描述】:
我正在使用 PyMySQL,在编写查询时,我需要转义某些用户提供的标识符(表名等)。例如,这里有一个不好的例子来说明我的意思:
sql = "SELECT * FROM {}".format(table_name)
cursor.execute(sql)
在这种情况下,table_name 是用户提供的,因此上述代码显然容易受到 SQL 注入攻击。
我首先尝试做这样的事情:
sql = "SELECT * FROM %s"
cursor.execute(sql, (table_name,))
似乎上面的代码在转义标识符时不起作用,它只适用于值。这并不奇怪,因为我在其他语言的其他 MySQL 库中看到了类似的行为。
我使用过其他库,例如 Node.js 中的 mysql,它们具有转义标识符的功能。我在PyMySQL documentation 中看不到任何表明类似功能的东西。我发现这个StackOverflow question 问了一个类似的问题,但答案类似于“你不应该这样做”。好吧,我确实需要这样做! ;)
在 Python 中使用 MySQL 时,我有哪些转义标识符的选项?谢谢!
【问题讨论】:
-
“这并不奇怪,因为我在其他语言的其他 MySQL 库中也看到过类似的行为” 然后由框架模拟,MySQL 原生准备协议只允许准备值而不是数据库,表或列名。
标签: python mysql sql-injection pymysql