作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道如何将列表映射到字符串:
foostring = ",".join( map(str, list_of_ids) )
我知道我可以使用以下命令将该字符串放入 IN 子句中:
cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))
我需要的是使用 MySQL 数据库安全地完成同样的事情(避免 SQL 注入(inject))。在上面的示例中,由于 foostring 没有作为参数传递给执行,因此它很容易受到攻击。我还必须在 MySQL 库之外进行引用和转义。
(有一个 related SO question ,但那里列出的答案要么不适用于 MySQL 数据库,要么容易受到 SQL 注入(inject)攻击。)
最佳答案
直接使用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 注入(inject)。
请注意,数据(list_of_ids
)作为参数(不在查询文本中)直接发送到 mysql 的驱动程序,因此没有注入(inject)。您可以在字符串中保留任何所需的字符,无需删除或引用字符。
关于python - 内爆列表以在 Python MySQL IN 子句中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59695751/
我是一名优秀的程序员,十分优秀!