使用参数来防止用户输入的搜索值

时间:2015-07-15 18:25:24

标签: python pandasql

使用pandassqlite3后端,我可以使用param安全地提供用户提供的搜索值,ala:

In [66]: df = pd.DataFrame({"x":range(10), "y":range(10)})
# db is an existing pandas sqlite3 connection
In [67]: df.to_sql('df', rb.db)
In [68]: pd.read_sql_query("""SELECT y FROM df WHERE x = ?""", rb.db, params=(4,))
   y
0  4

问:有没有办法直接在DataFrame上将其转储到sqlite后端(无论是内存还是文件支持)?

类似于:

pandasql.sqldf("SELECT y FROM df WHERE x = ?", params=(4,), globals())

(显然不起作用)。列出的pandasql.sqldf参数不包含任何明显的内容,因此我猜测我必须(a)创建一个临时的sqlite3内存缓存并对其进行查询,或者(b)冒险SQL注入或手动打击它。后者会使用类似的东西:

pandasql.sqldf("SELECT y FROM df WHERE x = {0}".format(*[ '"' + x + '"' for x in ['4'] ]), globals())

现在我正在动态创建“where”变量列表,所以虽然它在这里WHERE x = ?,但它通常是变量的多个变量和/或多次点击,例如WHERE x like ? OR y like ? OR z > ?。创建这个字符串是直截了当的,并且创建比较值列表同样“完成”;这是使用用户提供的搜索值很麻烦。

29501895不同的问题;因为我关注SQL注入,使用局部变量并不能解决问题。

0 个答案:

没有答案