一尘不染

内联列表以在python MySQLDB IN子句中使用

mysql

我知道如何将列表映射到字符串:

foostring = ",".join( map(str, list_of_ids) )

而且我知道我可以使用以下命令将该字符串放入IN子句中:

cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))

我需要使用MySQLDB安全地完成同一件事(避免SQL注入)。在上面的示例中,由于foostring没有作为执行参数传递,因此它很容易受到攻击。我还必须在mysql库之外引用和转义。

(有一个相关的SO问题,但是那里列出的答案对MySQLDB不起作用或容易受到SQL注入的影响。)


阅读 326

收藏
2020-05-17

共1个答案

一尘不染

list_of_ids直接使用:

format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                tuple(list_of_ids))

这样,您就不必引用自己的报价,并避免各种SQL注入。

请注意,数据(list_of_ids)作为参数直接进入mysql的驱动程序(不在查询文本中),因此没有注入。您可以在字符串中保留所需的任何字符,而无需删除或引用字符。

2020-05-17