SQLite查询限制

时间:2016-12-12 21:35:00

标签: python sql sqlite sql-injection

我正在构建一个小接口,我希望用户能够写出整个 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

3 个答案:

答案 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)

  1. 以只读方式打开数据库,以防止任何更改。
  2. 许多陈述,例如PRAGMA或ATTACH,都可能是危险的。使用authorizer callbackC docs)仅允许SELECT。
  3. 查询可以运行很长时间,也可以生成大量数据。使用progress handler来中止运行时间过长的查询。