Python的最佳做法,并确保连接到MySQL并执行查询
在mysql上运行查询最安全的方法是什么,我知道与MySQL和SQL注入有关的危险。
然而,我不知道我应该如何运行我的查询,以防止注入其他用户(Web客户端)可以操纵的variables。 我曾经写过自己的转义函数,但显然这是“未完成”。
我应该如何使用它来查询并通过python安全地插入MySQL数据库,而不冒冒险的注入?
为了避免注入,使用%s
代替每个variables,然后通过列表或元组作为execute
的第二个parameter passing值。 以下是文档中的一个示例 :
c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,))
请注意,这是使用逗号 ,而不是% (这将是一个直接的stringreplace,而不是转义)。 不要这样做 :
c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""" % (max_price,))
另外,如果参数是string,则不需要位置持有者( '%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
模块级variables来查看您的客户端库支持哪些:
>>> clientlibrary.paramstyle 'pyformat'
以上任何一个选项都应该做正确的事情来处理你可能不安全的数据。 正如布鲁诺所指出的,请不要尝试自己插入参数。 常用的客户端库在正确处理数据方面要比我们这些凡人永远都要好得多。