我们想让一些用户有权从数据库中读取他们想要的内容,所以我们感兴趣 - 是否有任何只支持SELECT,WHERE和JOIN运算符的SQL方言?
我们希望像这样使用它:
class MyModelWithSQLRule(models.Model):
sql_rule = models.TextField()
def what_data_i_will_get(self):
"""
Here we must get exception with attempt of query like
DELETE * FROM users_users; SELECT id FROM users_users;
"""
parsed_sql_rule = select_only_parser(self.sql_rule)
return Users.objects.raw(parsed_sql_rule)
这与数据库引擎无关。我希望语言,在SQL的子系列中,但没有像DELETE
这样的危险词。
答案 0 :(得分:4)
根据你所说的,答案是否定。
你可以做的是为你的数据库设置2个连接字符串,1在数据库级别设置为只读,另一个可以是读/写连接字符串,然后你只需要构建一个数据库会话上下文适当的连接字符串。这使您在应用程序级别获得了一定程度的安全性,但最终仍然依赖于数据库,因为错误将从那里抛出。
答案 1 :(得分:1)
大多数SQL实现都允许您使用权限控制访问权限,通常使用GRANT
,DENY
和REVOKE
答案 2 :(得分:1)
如果您不希望数据库执行授权,我认为您必须使用SQL将问题转移到编程语言。我知道没有可以使用的SQL方言只允许非修改查询。
你只是解析你的表达式,看它是否使用任何禁用的关键字,如DELETE,UPDATE,INSERT等。解析(很大一部分)SQL在Python中非常可行,我建议你研究一下相反。 虽然我仍然认为制作一个只读用户并通过单独的连接传递所有查询会更简洁,更容易。
编辑:
也许您可以使用交易但从不提交交易?这对你有用吗?
答案 3 :(得分:1)
最简单的方法,如果你需要支持的是django - 就是编写自己的数据库适配器来过滤你的查询。
这将允许您创建自己的“sql方言”。