2013-01-13 23 views
2

希望允许客户端应用程序对我们的数据库执行SQL查询。在Python中过滤针对恶意注入的SQL语句

查询将是数据请求,客户端应该永远不能修改数据。

有没有办法允许客户端发送SQL语句,然后屏蔽它进行恶意注入,然后通过数据库传递它?

我们针对PostgreSQL数据库使用Python的SQLAlchemy库。

谢谢!

回答

4

比试图解释恶意查询更容易的选择是创建一个具有只读权限的db用户。然后,您的最终用户将使用该帐户运行SELECT查询。您不必担心恶意插入和删除,因为“写入”查询将不被允许。您还可以进一步修改权限,以便不允许访问您不希望客户看到的数据等。

有关创建“只读”用户的一些信息,请参阅此SO question and answers

+0

但是这样做并不能阻止恶意用户访问更多的数据库,而不是他应该的。 – Mikael

1

使用准备好的语句时,执行SQL查询,使用sqlalchemy.sql.expression.text方法

from sqlalchemy.sql.expression import text 

t = text("SELECT * FROM users WHERE id=:user_id") 
result = connection.execute(t, user_id=12) 

sqlalchemy docstext方法的全覆盖。

但保护您的应用程序免受用户定义的sql语句的影响真的很难,即使DBA块创建和编写来自用户的角色。 考虑在开始前阅读this blog post

+0

如果我理解正确,这不允许客户指定他们自己的查询? –

+1

如果您打算允许用户创建自己的查询,则根本没有安全性。 –