【问题标题】:Filter SQL statement against malicious injection in Python在 Python 中过滤 SQL 语句以防止恶意注入
【发布时间】:2012-12-27 15:43:18
【问题描述】:

希望允许客户端应用程序对我们的数据库执行 SQL 查询。

查询将是对数据的请求,客户端永远不能修改数据。

有没有办法让客户端发送一条 SQL 语句,然后筛选恶意注入,然后通过数据库传递它?

我们正在针对 PostgreSQL 数据库使用 Python 的 SQLAlchemy 库。

谢谢!

【问题讨论】:

    标签: python postgresql sqlalchemy sql-injection


    【解决方案1】:

    比试图解释恶意查询更简单的选择是创建一个具有只读权限的 db 用户。然后,您的最终用户将使用该帐户运行 SELECT 查询。您无需担心恶意插入和删除,因为不允许“写入”查询。您还可以进一步修改权限,以不允许访问您不希望客户看到的数据等。

    请参阅SO question and answers,了解有关创建“只读”用户的一些信息。

    【讨论】:

    • 但这并不能防止恶意用户访问比他应该访问的更多的数据库。
    【解决方案2】:

    执行sql查询时使用prepared statement,使用sqlalchemy.sql.expression.text方法

    from sqlalchemy.sql.expression import text
    
    t = text("SELECT * FROM users WHERE id=:user_id")
    result = connection.execute(t, user_id=12)
    

    请参阅sqlalchemy docs 以了解text 方法的完整覆盖范围。

    但是保护您的应用程序免受用户定义的 sql 语句的影响确实很困难,即使 DBA 阻止创建和写入来自用户的角色。 考虑在开始之前阅读this blog post

    【讨论】:

    • 如果我理解正确的话,这不允许客户端指定自己的查询?
    • 如果您要允许用户创建他们自己的查询,那么您根本没有安全性。
    【解决方案3】:

    您始终可以在从属模式下使用仅接受读取连接的第二个数据库来改进您的安全系统。

    https://www.postgresql.org/docs/9.2/static/high-availability.html

    此策略允许您将数据库以读取模式扩展两、三或四倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2019-04-28
      • 2012-11-27
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多