注入安全“SELECT FROM table WHERE column IN list;”使用 python3 和 sqlite3

问题描述 投票:0回答:2

我想从 html 表单中获取用户输入,并通过将列与用户输入匹配来执行 SELECT,并且可以安全地注入。但我希望用户输入是逗号分隔的列表。例如,如果该列名为“name”并且 user_input 是“Alice,Bob,Carrol”,我想执行查询

SELECT FROM table WHERE name IN ("Alice","Bob","Carrol");

这意味着我有与这个问题相同的问题使用python sqlite3 - DB-API 2.0从sqlite表中选择其中rowid在列表中。 但我当然不想自己进行字符串连接以避免注入。同时,因为 user_input 中可能有任意数量的逗号,所以我不能这样做:

db.execute('SELECT FROM table WHERE name IN (?,?,?)', user_input_splited)


我寻找一种手动清理或转义输入的方法,以便能够执行类似的操作:

db.execute('SELECT FROM table WHERE name IN ?', user_input_sanitized)


但是我没有找到。这里最好的方法是什么?

sql python-3.x sqlite
2个回答
1
投票
编写自己的代码来获取用户的输入,

split()

用逗号输入,然后迭代该列表。当您接受每个值时,将其推入 
one 数组,并将文字 "?"
 推入另一个。

当然,现在验证您是否至少有一个可接受的值。

现在,通过包含

join(", ", $qmarks_array)

 来构建 SQL 语句,以自动构建一个看起来像 
?, ?, ? ...
 并带有适当数量问号的字符串。
(如果只有一个元素,则不会插入任何逗号) .) 然后,以这种方式构建 SQL 语句后,提供另一个数组作为执行该查询的函数的输入。

通过这种方式,您可以将每个值作为参数提供,您应该始终这样做,

并且您允许参数的数量发生变化。


0
投票
sqlite 中的问题是,您必须在查询中始终给出正确数量的问号。如果您有一个包含 3 个项目的列表或元组,则必须询问 (?,?,?) 项目。如果您只要求一个(?),您会收到如下错误: sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,并且提供了 2 个。 解决方案是找到列表中项目的数量,并准备一个带有正确数量的问号的字符串。 就像下面的代码一样:

list1=[1,2,3,4,5] question_marks=len(list1)*'?,' selecting="select * from products where product_id in ("+question_marks[:-1]+")" curr.execute(selecting,list1) product_list=curr.fetchall()
    
© www.soinside.com 2019 - 2024. All rights reserved.