gpt4 book ai didi

Python 与包含转义字符的字符串的绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 01:34:36 26 4
gpt4 key购买 nike

我的代码如下:

select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
parameters = "'"+"','".join(['\\','--','where'])+"'"
cursor.execute(select_query, parameters)
print str(cursor._executed)

我要执行的查询是:

SELECT DISTINCT name FROM people WHERE name in ('\','--','where')

我将这个参数作为最后的手段 - 它仍然没有完全达到我想要的效果。 Python转义字符,打印返回:

SELECT DISTINCT name FROM people WHERE name in ('\'\\\',\'--\',\'where\'')

最佳答案

问题是您的parameters是一个字符串,其中包含MySQLdb将尝试转义的字符。

您可以自己插入查询字符串...

select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
parameters = "'"+"','".join(['\\','--','where'])+"'"
cursor.execute(select_query % parameters)
print str(cursor._executed)

...但这很容易受到 SQL 注入(inject)的攻击,并且在您的情况下不起作用,因为它会产生...

SELECT DISTINCT name FROM people WHERE name in ('\','--','where')

...这不是一个有效的查询,正如您从 SO 的语法突出显示中看到的那样。

这样做更安全......

parameters = ['\\','--','where']
placeholders = ','.join(['%s'] * len(parameters))
select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)" % placeholders
cursor.execute(select_query, parameters)
print str(cursor._executed)

...这将产生一个类似于...的查询

SELECT DISTINCT name FROM people WHERE name in ('\\','--','where')

...我认为这是您真正想要的。

<小时/>

更新

I was hoping not to do something like: placeholders = ','.join(['%s'] * len(parameters)) This is why I posted here - isn't there a better solution?

嗯,我不确定这是否“更好”,但您可以使用MySQLdb特定的Connection.escape_string()方法,或底层_mysql模块的 escape_string() 函数...

>>> import _mysql
>>> select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
>>> parameters = "'"+"','".join(map(_mysql.escape_string, ['\\','--','where']))+"'"
>>> print select_query % parameters
SELECT DISTINCT name FROM people WHERE name in ('\\','--','where')

...但是 PEP249 中没有提到 Connection.escape_string() ,因此您将失去跨数据库兼容性。

关于Python 与包含转义字符的字符串的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com