什么';这是“什么?”;“最佳”;“创建动态sql的方法”;“在列表中”;Python中字符串数组(或元组)中的子句?
我正在从Python(使用MySQLDb)运行一个动态MySQL查询,其中包括一个包含字符串值的“in list”子句。执行此操作的函数将获取一个值数组。如果有帮助的话,我可以将该数组制作成元组或任何其他类型的集合 插入此列表的“最佳”方式是什么?请记住,需要单引号和逗号等。以下是一种丑陋但安全的手动方法:什么';这是“什么?”;“最佳”;“创建动态sql的方法”;“在列表中”;Python中字符串数组(或元组)中的子句?,python,mysql,arrays,list,Python,Mysql,Arrays,List,我正在从Python(使用MySQLDb)运行一个动态MySQL查询,其中包括一个包含字符串值的“in list”子句。执行此操作的函数将获取一个值数组。如果有帮助的话,我可以将该数组制作成元组或任何其他类型的集合 插入此列表的“最佳”方式是什么?请记住,需要单引号和逗号等。以下是一种丑陋但安全的手动方法: inList = "" for stringValue in someArray: if inList != "" : inList += "," inList += "'%
inList = ""
for stringValue in someArray:
if inList != "" : inList += ","
inList += "'%s'" % stringValue
querystr = "SELECT * FROM some_tbl WHERE some_column IN( %s );" % (inList)
或者,这里有另一个选择。它较短,但依赖于数组到字符串的表示形式在将来保持完全相同:
inList = str(someArray).replace("[", "").replace("]", "")
querystr = "SELECT * FROM some_tbl WHERE some_column IN( %s );" % (inList)
编辑
我认为我写这篇文章时,Python术语是错误的。我应该说“列表”而不是“数组” 要使这种动态查询安全,确实没有什么好方法。您应该切换到参数化查询,在这种情况下,解决方案是:
placeholder = '%s'
param_subs = ','.join((placeholder,) * len(param_list))
sql = 'SELECT col1, col2, . . . FROM Table WHERE Column IN ( %s );' % param_subs
cursor.execute(sql, param_list)
(这假设您使用的是MySQL Connector,不幸的是,它使用了
%s
作为占位符。其他Python库倾向于使用?
作为占位符。)这到底是如何安全的?这是一个完全开放的sql注入漏洞。请解释。这难道不意味着有人可以随心所欲地定义数组吗?人们通常如何构建动态SQL语句?这不是构建动态SQL的问题,而是用一种不安全的方式来构建它。“安全”的意思是“可靠的功能”,BTW。嗯,考虑做一个名字列表:<代码> MaleO'BRIN < /Cord>,然后变成<代码>(MaleO'BiRein)< /Cord>中的名称。哎呀。语法错误,查询失败,“完全可靠,老兄”。这看起来是个不错的方法。需要明确的是,“安全”指的是防止坏字符,还是sql注入(正如Mark B所指出的),还是其他什么?我很遗憾在我的问题中使用了“安全”这一术语……我指的是两者,因为两者都来自同一个问题——在编写代码时,我们无法知道未来将作为参数提供的可能的值范围。另外,itertools.repeat
可以用来代替(占位符,)*len(…)
。