将列名转义为查询参数

时间:2017-11-03 08:05:06

标签: python parameters escaping sql-injection pymssql

我正在重做一个查询以防止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 个答案:

答案 0 :(得分:2)

在参数化查询中,参数只能用于提供列,而不能用于列名称。因此,您需要使用字符串操作来插入列名称,然后使用参数指定值。例如,使用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,))