gpt4 book ai didi

python - SQL 注入(inject)保护是否内置于 SQLAlchemy 的 ORM 或核心中?

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:21 37 4
gpt4 key购买 nike

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

我的代码如下:

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 中接受的答案的评论让我怀疑:

you can still use execute() or other literal data that will NOT be escaped by SQLAlchemy.

那么,在我的代码中使用了 execute(),上面的引用是否意味着我的代码不安全?一般而言:是否只能通过 SQLAlchemy ORM 层来防止 SQL 注入(inject),就像您最终将启动 execute() 的核心层一样?

最佳答案

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

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

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

错误的方式(Sql 可注入(inject)):

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

好方法(不可注入(inject) SQL):

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

关于python - SQL 注入(inject)保护是否内置于 SQLAlchemy 的 ORM 或核心中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48870227/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com