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)
- 以只读方式打开数据库,以防止任何更改。
- 许多语句(例如 PRAGMA 或 ATTACH)可能很危险。使用 authorizer callback (C docs) 仅允许 SELECT。
- 查询可以运行很长时间,或者生成大量数据。使用 progress handler 中止 运行 时间过长的查询。
我正在构建一个小界面,我希望用户能够在其中写出他们的 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",您还不如将您的计算机放在一个盒子里,然后将其邮寄到
我可以针对您的问题建议不同的方法。您可以将对数据库的访问限制为只读。这样即使用户尝试执行 delete/update 查询,他们也不会损坏您的数据。
Here 是 Python 关于如何打开只读连接的答案:
db = sqlite3.connect('file:/path/to/database?mode=ro', uri=True)
- 以只读方式打开数据库,以防止任何更改。
- 许多语句(例如 PRAGMA 或 ATTACH)可能很危险。使用 authorizer callback (C docs) 仅允许 SELECT。
- 查询可以运行很长时间,或者生成大量数据。使用 progress handler 中止 运行 时间过长的查询。