将列名转义为查询参数

Posted

技术标签:

【中文标题】将列名转义为查询参数【英文标题】:escaping column name as query parameter 【发布时间】:2017-11-03 08:05:06 【问题描述】:

我正在重做一个查询以防止 SQL 注入,但不知道如何转义列名。

此代码不起作用(示例 1):

cursor.execute(
"UPDATE ttt SET status = 'Good' FROM table ttt WHERE %s = %s';",
('param1', 'param2',))

sql_server_connection.commit()

这将起作用(示例 2):

cursor.execute(
"UPDATE ttt SET status = 'Good' FROM table ttt WHERE param1 = %s';",
('param2',))

我需要将 2 个参数传递给我的查询并以安全的方式执行(以防止 SQL 注入)。

我可以通过传递简单的字符串使其工作,但这不是安全的方法。

如何使用单个 cursor.execute 命令转义列名和值?

【问题讨论】:

【参考方案1】:

在参数化查询中,参数只能用于提供列 values,而不是列 names。因此,您需要使用字符串操作来插入列名,然后使用参数来指定值。例如,使用 Python3:

column_name = 'param1'
column_value = 'param2'
cursor.execute(f"UPDATE ttt SET status = 'Good' WHERE [column_name] = %s", (column_value,))

在 Python2 中

column_name = 'param1'
column_value = 'param2'
sql = "UPDATE ttt SET status = 'Good' WHERE [] = %s".format(column_name)
cursor.execute(sql, (column_value,))

【讨论】:

python 2.7 不支持“F”前缀。有解决办法吗? 谢谢。你能在这里解释一下什么是方括号的作用吗? [ ] @NirVana - 方括号是 T-SQL 分隔可能包含空格或“有趣字符”的表/列名称的标准方法。 ... WHERE tax rate = ... 不起作用,但 ... WHERE [tax rate] = ... 会。 这并没有回答如何正确转义列名的问题,只是如何插入它们。

以上是关于将列名转义为查询参数的主要内容,如果未能解决你的问题,请参考以下文章

转义 SQL 参数

防止使用参数查询不工作的转义撇号

列名中的特殊字符

在一个查询中使用 MySqlCommand 将多条记录插入 MySQL C# (MySQLConnector) & command 转义引号的参数

安全地转义表名/列名

如何转义 php mysqli 查询? [复制]