SQLite 查询限制

SQLite query restrictions

我正在构建一个小界面,我希望用户能够在其中写出他们的 entire 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

Python的sqlite3 execute()方法只会执行一条SQL语句,所以如果你保证所有语句都以SELECT关键字开头,你是合理地保护免受像 SELECT 1; DROP TABLE USERS 这样的愚蠢的东西。但是你应该检查 sqlite 的 SQL 语法以确保没有办法将数据定义或数据修改语句作为子查询嵌入。

我个人的意见是,如果 "regex scares you a little bit",您还不如将您的计算机放在一个盒子里,然后将其邮寄到 。让不受信任的用户编写 SQL 代码是在玩火,你需要知道自己在做什么,否则你会被炸死。

我可以针对您的问题建议不同的方法。您可以将对数据库的访问限制为只读。这样即使用户尝试执行 delete/update 查询,他们也不会损坏您的数据。

Here 是 Python 关于如何打开只读连接的答案:

db = sqlite3.connect('file:/path/to/database?mode=ro', uri=True)
  1. 以只读方式打开数据库,以防止任何更改。
  2. 许多语句(例如 PRAGMA 或 ATTACH)可能很危险。使用 authorizer callback (C docs) 仅允许 SELECT。
  3. 查询可以运行很长时间,或者生成大量数据。使用 progress handler 中止 运行 时间过长的查询。