【问题标题】:Escaping single and double quotes for mysql in python在python中为mysql转义单引号和双引号
【发布时间】:2016-04-09 05:11:11
【问题描述】:

我在 python 2.7 中使用 mysql.connector python 库

我有一个 unicode 字符串,它可能包含也可能不包含单引号和双引号。 以下是我为逃生功能尝试的事情:

def escape(string):
#string.MySQL.escape_string()
#string = string.decode('string_escape')
#string = string.encode('unicode-escape').replace("'", "''")
#string = string.encode('unicode-escape').replace('"', '\"')
#string = string.encode('unicode-escape').replace("'", u"\u2019")
#string = string.encode('unicode-escape').replace('''"''', u"\u201D")
#string = string.encode('unicode-escape').replace('''''', u"\u201D")
return string

似乎没有任何效果。我尝试使用 this 函数但仍然给出 mysql 语法错误。

我需要 mysql.connector 库中的一些东西,它可以在不破坏 unicode 和 mysql 查询的情况下转义单引号和双引号。

这是我正在使用的 SQL 查询示例:

"""SELECT * FROM messages WHERE msg_id = '{msg_id}'""".format(**db_dict)

如果需要更多详细信息,请告诉我

编辑:示例 SQL 查询已更新

【问题讨论】:

    标签: python mysql unicode


    【解决方案1】:

    MySQLdb 官方声明使用format 参数样式,但它也支持pyformat 样式*,所以如果你想使用来自字典的参数,你可以使用:

    db_dict = {'msg_id': "1'2'3", ...}
    cursor.execute("SELECT * FROM messages WHERE msg_id = %(msg_id)s", db_dict)
    

    使用字符串操作创建sql查询只会导致sql注入漏洞,所以千万不要这样做。


    *... 大多数在屏幕后面使用 python 字符串格式的 db 连接器都是这样做的,它们将 format 或 pyformat 之一指定为 paramstyle,但实际上两者都支持。 dbapi2 不允许在此处指定两个值,但也不禁止支持多个 parmstyle。如果您编写的代码可能使用未知的 dbapi2 连接器,那么您可以查询受支持的参数样式就足够了,能够了解所有内容会很好,但这不是必需的。

    【讨论】:

      【解决方案2】:

      cursor.execute('SELECT * FROM messages WHERE msg_id = %s', (db_dict['msg_id'],)) 是您要在此处运行的内容。 python 的数据库接口不支持标准字符串转义,并且根据@bobince 的评论,这是一个安全漏洞。

      【讨论】:

      • """SELECT * FROM messages WHERE msg_id = '{msg_id}'""".format(**db_dict) 是我尝试过的,其中db_dict 是包含msg_id 键的字典
      • 永远不要使用.format 将值放入 SQL 查询中。这是一个 SQL 注入安全漏洞。而是使用参数化查询,方法是将数据在单独的第二个参数中传递给execute(),如@hd1 的示例中所示。
      • 我没有转义查询,而是在传递给查询之前转义了每个字符串。另外,根据建议,我已停止使用format 进行查询处理。
      • 但是您没有转义字符串,不应该使用format 进行查询,这是我回答您问题的重点!
      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多