在MySQL上运行查询最安全的方式是什么?我知道MySQL和SQL注入所涉及的危险。
然而,我不知道我应该如何运行我的查询,以防止注入其他用户( can客户端)可以操作的变量。我曾经编写过自己的转义函数,但显然这是“未完成的”。
我应该使用什么,应该如何使用它在不冒MySQL注入风险的情况下通过python安全地在MySQL数据库上查询和执行插入操作?
发布于 2011-10-28 20:45:53
要避免注入,请使用带有%s的execute来代替每个变量,然后通过列表或元组将值作为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')两边使用单引号,因为驱动程序提供了单引号。
发布于 2011-10-28 21:22:34
作为Bruno答案的扩展,您的MySQL客户端库可能支持指定命名参数的几种不同格式中的任何一种。在PEP 249 (DB-API)中,您可以编写如下查询:
‘'qmark’
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = ?", (lumberjack,))‘'numeric’
>>> 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'对于处理可能不安全的数据,上面的任何选项都应该做正确的事情。正如Bruno所指出的,请不要试图自己插入参数。通常使用的客户端库在正确处理数据方面比我们普通人要好得多。
发布于 2018-07-04 03:10:29
如果您使用的是mysqldb,则可以使用内置的escape_string函数。就像这样。
sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
cursor.execute(sql)我总是更喜欢使用数据库连接器的转义功能-它按预期工作,自己手动编写转义函数是一种安全风险。
https://stackoverflow.com/questions/7929364
复制相似问题