2024-05-14 16:26:25 发布
网友
在MySQL上运行查询最安全的方法是什么?我意识到MySQL和SQL注入所涉及的危险
但是,我不知道应该如何运行查询以防止注入其他用户(WebClient)可以操作的变量。我曾经写过我自己的转义函数,但显然这是“没有完成”
我应该使用什么以及如何使用它通过python在MySQL数据库上安全地查询和执行插入操作,而不冒MySQL注入的风险
如果您使用的是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:
execute
%s
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')周围使用单引号
'%s'
作为Bruno答案的扩展,您的MySQL客户端库可能支持指定命名参数的几种不同格式中的任何一种。在PEP 249 (DB-API)中,您可以编写如下查询:
>>> 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,))
>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})
通过查看paramstyle模块级变量,您可以看到客户端库支持哪些:
paramstyle
>>> clientlibrary.paramstyle 'pyformat'
对于处理可能不安全的数据,上述任何选项都应该是正确的。正如布鲁诺指出的,请不要试图自己插入参数。通常使用的客户端库在正确处理数据方面比我们凡人都要好得多
如果您使用的是mysqldb,那么可以使用内置的escape_string函数。像这样
我总是更喜欢使用数据库连接器的转义功能——它按预期工作,手动编写转义功能本身存在安全风险
为了避免注入,使用
execute
和%s
代替每个变量,然后通过列表或元组传递值作为execute
的第二个参数。下面是一个example from the documentation:请注意,这是使用逗号,而不是%(这将是直接字符串替换,而不是转义)不要这样做:
此外,如果驱动程序提供的参数是字符串,则不能在位置保持符(
'%s'
)周围使用单引号作为Bruno答案的扩展,您的MySQL客户端库可能支持指定命名参数的几种不同格式中的任何一种。在PEP 249 (DB-API)中,您可以编写如下查询:
“qmark”
“数字”
“命名”
“格式”
“pyformat”
通过查看
paramstyle
模块级变量,您可以看到客户端库支持哪些:对于处理可能不安全的数据,上述任何选项都应该是正确的。正如布鲁诺指出的,请不要试图自己插入参数。通常使用的客户端库在正确处理数据方面比我们凡人都要好得多
相关问题 更多 >
编程相关推荐