Python:连接MySQL和执行查询的最佳实践和最安全的方式

2024-05-14 16:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

在MySQL上运行查询最安全的方法是什么?我意识到MySQL和SQL注入所涉及的危险

但是,我不知道应该如何运行查询以防止注入其他用户(WebClient)可以操作的变量。我曾经写过我自己的转义函数,但显然这是“没有完成”

我应该使用什么以及如何使用它通过python在MySQL数据库上安全地查询和执行插入操作,而不冒MySQL注入的风险


Tags: 方法函数用户数据库sqlmysql风险意识
3条回答

如果您使用的是mysqldb,那么可以使用内置的escape_string函数。像这样

sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
cursor.execute(sql)

我总是更喜欢使用数据库连接器的转义功能——它按预期工作,手动编写转义功能本身存在安全风险

为了避免注入,使用execute%s代替每个变量,然后通过列表或元组传递值作为execute的第二个参数。下面是一个example from the documentation

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

请注意,这是使用逗号,而不是%(这将是直接字符串替换,而不是转义)不要这样做

c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""" % (max_price,))

此外,如果驱动程序提供的参数是字符串,则不能在位置保持符('%s')周围使用单引号

作为Bruno答案的扩展,您的MySQL客户端库可能支持指定命名参数的几种不同格式中的任何一种。在PEP 249 (DB-API)中,您可以编写如下查询:

“qmark”

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = ?", (lumberjack,))

“数字”

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :1", (lumberjack,))

“命名”

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :jack", {'jack': lumberjack})

“格式”

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %s", (lumberjack,))

“pyformat”

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})

通过查看paramstyle模块级变量,您可以看到客户端库支持哪些:

>>> clientlibrary.paramstyle
'pyformat'

对于处理可能不安全的数据,上述任何选项都应该是正确的。正如布鲁诺指出的,请不要试图自己插入参数。通常使用的客户端库在正确处理数据方面比我们凡人都要好得多

相关问题 更多 >

    热门问题