作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我应该如何在 Python 中为 SQLite3 进行真正的转义?
如果我用谷歌搜索(或搜索 stackoverflow),就会有很多问题,每次回复都是这样的:
dbcursor.execute("SELECT * FROM `foo` WHERE `bar` like ?", ["foobar"])
这有助于防止 SQL 注入(inject),如果我只用“=”进行比较就足够了,但它当然不会分割通配符。
如果我这样做
cursor.execute(u"UPDATE `cookies` set `count`=? WHERE `nickname` ilike ?", (cookies, name))
某些用户可以提供“%”作为昵称,并将所有 cookie 条目替换为一行。我可以自己过滤它(呃......我可能会忘记那些鲜为人知的通配符之一),我可以在昵称和昵称上使用小写并将“ilike”替换为“=”,但我真正想做的是类似的东西:
foo = sqlescape(nick)+"%"
cursor.execute(u"UPDATE `cookies` set `count`=? WHERE `nickname` ilike ?", (cookies, foo))
最佳答案
?
参数旨在避免 SQL 字符串(以及其他有问题的数据类型,如 float 和 blob)的格式问题。
LIKE/GLOB 通配符在不同层面上起作用;它们始终是字符串本身的一部分。SQL 允许对它们进行转义,但没有默认的转义字符;你必须选择一些 ESCAPE clause :
escaped_foo = my_like_escape(foo, "\\")
c.execute("UPDATE cookies SET count = ? WHERE nickname LIKE ? ESCAPE '\',
(cookies, escaped_foo))
(并且您必须为 %
和 _
(LIKE) 或 *
编写自己的 my_like_escape
函数和 ?
(GLOB)。)
关于Python/SQLite3 在 WHERE 子句中转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23342591/
我是一名优秀的程序员,十分优秀!