【问题标题】:Is SQL injection protection built into SQLAlchemy's ORM or Core?SQL 注入保护是否内置在 SQLAlchemy 的 ORM 或 Core 中?
【发布时间】:2018-07-29 22:16:06
【问题描述】:

我正在开发一个aiohttp server 应用程序,我刚刚看到了apparently it isn't able to use SQLAlchemy's ORM layer。所以,我想知道:如果我的应用程序只能使用 SQLAlchemy 的核心,它是否仍然可以防止 SQL 注入攻击?

我的代码如下:

async def add_sensor(db_engine, name):
    async with db_engine.acquire() as connection:
        query = model.Sensor.__table__.insert().values(name=name)
        await connection.execute(query)

this related question 中接受的答案的评论让我怀疑:

您仍然可以使用 execute() 或其他不会被 被 SQLAlchemy 转义。

那么,我的代码中使用了execute(),上面的引用是否意味着我的代码不安全?总的来说:只有 SQLAlchemy ORM 层才能防止 SQL 注入,就像你最终会启动 execute() 的核心层一样?

【问题讨论】:

  • ORM 层公开了一些接受文字 SQL 的相同方法,例如 order_by(),因此如有疑问,请查看文档(允许用户选择排序是相当普遍的事情)。跨度>

标签: python security sqlalchemy sql-injection aiohttp


【解决方案1】:

在您上面的示例中,我没有看到提供给数据库查询的任何变量。由于没有用户提供的输入,因此也无法进行 Sql 注入。

即使存在用户提供的值,只要您不使用带有 sqlalchemy 的手写 sql 语句而是使用 orm 模型方法 (model.Sensor.__table__.select()),如您的示例中所示,您可以安全地防止 Sql 注入。

最后,这一切都是为了明确地告诉 sqlalchemy 应该使用哪些列和表来选择和插入数据,并将其与正在插入或选择的数据分开。切勿将数据字符串与查询字符串结合使用,始终使用 sqlalchemy orm 模型对象来描述您的查询。

坏方法(Sql Injectable):

Session.execute("select * form users where name = %s" % request.GET['name'])

好方法(不是 Sql Injectable):

Session.execute(model.users.__table__.select().where(model.users.name == request.GET['name']))

【讨论】:

  • 你说得对,我应该放一个 modified 表数据的代码示例 - 我更新了我的问题。我不能使用 ORM 层,但是我从您的代码示例中看到了您的意思,这些方法也存在于核心层中。这意味着我的实现对 SQL 注入是安全的,并且使用核心层就可以了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2014-10-17
  • 2016-08-18
  • 2015-08-20
  • 2017-05-23
  • 2012-10-24
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多