【问题标题】:Sanitizing user-provided SQL with Python?使用 Python 清理用户提供的 SQL?
【发布时间】:2010-01-04 04:10:09
【问题描述】:

我正在开发一个小型应用程序,该应用程序将帮助浏览vim-logging 生成的数据,并且我希望允许人们对数据集运行任意 SQL 查询。

我怎样才能安全地做到这一点?

例如,我想让某人输入SELECT file_type, count(*) FROM commands GROUP BY file_type,然后将结果发送回他们的网络浏览器。

【问题讨论】:

    标签: python sql


    【解决方案1】:

    这样做:

    cmd = "update people set name=%s where id=%s"
    curs.execute(cmd, (name, id))
    

    请注意,占位符语法取决于您使用的数据库。

    来源和更多信息在这里:

    http://bobby-tables.com/python.html

    【讨论】:

    • 抱歉,我的问题与安全执行 arbitrary SQL 相关,而不是“将任意值放入预定义查询”。
    【解决方案2】:

    在防止破坏的同时允许表现力是一项艰巨的工作。如果您让他们自己输入“SELECT ..”,则需要阻止他们输入“DELETE ..”。您可以要求语句以“SELECT”开头,但您还必须确保它在中间的某处不包含“; DELETE”。

    最安全的做法可能是使用只读用户凭据连接到数据库。

    【讨论】:

    • 确实如此……尽管使用类似sqlparse 的东西可能会有所帮助。 sqlparse 的困难在于我对我的 sql-foo 没有足够的信心来确保没有我遗漏的极端情况。
    • SQL解析好难! sqlparse 是不完整的,可能很容易被非标准构造所欺骗,例如 MySQL 的错误字符串文字转义和 cmets。
    • 啊,是的 - 我想我一直在假设某种“严格”模式......但正如你所说,这可能是一个白日梦。
    【解决方案3】:

    在MySQL中,你可以创建一个limited user(创建新用户并授予有限访问权限),它只能访问特定的表。

    【讨论】:

    • 虽然这在您可以管理的范围内尽可能安全,但不受信任的用户仍然可以(意外或故意)创建查询,例如大规模交叉连接,这实际上可能是拒绝服务攻击!
    • 确实如此,但更容易缓解 - 只需设置超时并只允许几个并发查询即可。
    【解决方案4】:

    考虑使用 SQLAlchemy。虽然 SQLAlchemy 可以说是有史以来最伟大的对象关系映射器,但您当然不需要使用任何 ORM 东西来利用所有已完成的出色 Python/SQL 工作。

    正如介绍性文档所暗示的:

    最重要的是,SQLAlchemy 不仅仅是一个 ORM。它的数据抽象层允许以与平台无关的方式构造和操作 SQL 表达式,并提供易于使用和超快的结果对象,以及表创建和模式反射实用程序。在导入 orm 包之前,不涉及任何对象关系映射。或者使用 SQLAlchemy 自己编写!

    使用 SQLAlchemy 将“免费”为您提供输入卫生,并让您使用标准 Python 逻辑来分析语句的安全性,而无需进行任何混乱的文本解析/模式匹配。

    【讨论】:

    • 我不完全确定我是否理解您的建议...您能否举例说明如何使用 SA 来解决我的问题?
    • 当然,我们的想法是,如果您使用 SQLAlchemy 中的 SQL 表达式工具,那么您将与平台无关,并且完全不受 SQL 注入等事物的影响。这就是我如何解释你的问题“我怎样才能安全地做到这一点?”不是如何将 SQL 的范围限制为只读访问,而是如何避免意外输入,例如恶意或恶意的格式错误的 SQL 语句(在简单的“删除”语句之外)。
    • 也是接口的问题。如果您希望用户能够“只输入 SQL”,那么唯一真正安全的将是 RDBMS 提供的权限模型。但是,如果您可以随意实现您的查询系统,您可以使用抽象层来消除一些繁琐的 SQL 生成,并用更多的 Pythonic 编程代替它。
    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2021-12-07
    • 2011-01-23
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多