参数化的sql查询和安全性

时间:2012-07-26 18:21:35

标签: python sql sqlite sql-injection

我正在创建一个Web服务,它应该为探索数据集提供很大的灵活性。现在,为了在SQL中执行此操作,我发现手动创建查询比使用参数更容易(如下面的'select')。这将使生成sql查询的位置变得更加容易(参见下面的where变量的元组)并根据例如:http://docs.python.org/library/sqlite3.html;更不安全。

我的问题是,有没有办法让这个安全?换句话说,有没有一种安全的方法来执行“手动”构建的查询?

我在想的是,如果我确保正在运行的查询以“SELECT”开头,那么我应该受到保护,不受可能改变数据的查询的影响。这是一个好主意吗?还有更好的方法吗?或参数化查询是保持SQL注入安全的唯一方法吗?

select = ['a','b']
where = [('a','=',1),('b','=',2)]
def retrieve(self,table,select,where='',groupBy=''):
   select = ','.join(select)
   sql = 'SELECT '+select+' FROM '+table
   self.cur.execute(sql)
   return self.cur.fetchall()

1 个答案:

答案 0 :(得分:4)

没有。那不是个好主意。 OWASP top 10 (Injection is in the first place)是信息和最佳实践的良好来源。

作为旁注,您可能希望使用SQL Alchemy,非常强大且广泛使用。它会给你(我猜)你正在寻找的所有灵活性。