首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:连接到MySQL并执行查询的最佳实践和最安全的方法

Python:连接到MySQL并执行查询的最佳实践和最安全的方法
EN

Stack Overflow用户
提问于 2011-10-28 20:38:48
回答 3查看 46K关注 0票数 70

在MySQL上运行查询最安全的方式是什么?我知道MySQL和SQL注入所涉及的危险。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-28 20:45:53

要避免注入,请使用带有%sexecute来代替每个变量,然后通过列表或元组将值作为execute的第二个参数传递。这是一个example from the documentation

代码语言:javascript
复制
c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

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

代码语言:javascript
复制
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""" % (max_price,))

此外,如果参数是字符串,则不能在位置符('%s')两边使用单引号,因为驱动程序提供了单引号。

票数 94
EN

Stack Overflow用户

发布于 2011-10-28 21:22:34

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

‘'qmark’

代码语言:javascript
复制
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = ?", (lumberjack,))

‘'numeric’

代码语言:javascript
复制
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :1", (lumberjack,))

‘命名’

代码语言:javascript
复制
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :jack", {'jack': lumberjack})

‘格式’

代码语言:javascript
复制
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %s", (lumberjack,))

‘'pyformat’

代码语言:javascript
复制
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})

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

代码语言:javascript
复制
>>> clientlibrary.paramstyle
'pyformat'

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

票数 81
EN

Stack Overflow用户

发布于 2018-07-04 03:10:29

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

代码语言:javascript
复制
sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
cursor.execute(sql)

我总是更喜欢使用数据库连接器的转义功能-它按预期工作,自己手动编写转义函数是一种安全风险。

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7929364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档