我正在构建一个小接口,我希望用户能够写出整个 sql语句,然后查看返回的数据。但是,我不希望用户能够做任何有趣的事情,即delete from user_table;
。实际上,我希望用户能够做的唯一事情就是运行select
语句。我知道SQLite没有特定的用户,所以我在想我将要做的事情,是否有一套拒绝某些查询的规则。也许正则表达式字符串或其他东西(正则表达式吓到我一点点)。关于如何实现这一目标的任何想法?
def input_is_safe(input):
input = input.lower()
if "select" not in input:
return False
#more stuff
return True
答案 0 :(得分:3)
我可以为您的问题提出不同的解决方法。您可以将对数据库的访问限制为只读。这样,即使用户尝试执行删除/更新查询,他们也无法破坏您的数据。
Here是Python关于如何打开只读连接的答案:
db = sqlite3.connect('file:/path/to/database?mode=ro', uri=True)
答案 1 :(得分:0)
Python的sqlite3 execute()
方法只会执行一个SQL语句,因此如果您确保所有语句都以SELECT
关键字开头,那么您可以合理地保护您免受{{{{{{{{{ 1}}。但是你应该检查sqlite的SQL语法,以确保无法将数据定义或数据修改语句嵌入为子查询。
我个人的观点是,如果"正则表达式让你有点害怕,你可以将你的计算机放在一个盒子里,然后把它邮寄到<黑客的陈规定型国家>。让不受信任的用户编写SQL代码正在玩火,你需要知道你正在做什么或者你会被炒。
答案 2 :(得分:0)