SQL注入保护是否内置在SQLAlchemy的ORM或Core中?

San*_*tte 3 python security sql-injection sqlalchemy aiohttp

我正在开发aiohttp服务器应用程序,但我只看到它显然无法使用SQLAlchemy的ORM层。因此,我想知道:如果我的应用程序只能使用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)
Run Code Online (Sandbox Code Playgroud)

这个相关问题中可接受答案的评论使我感到怀疑:

您仍然可以使用execute()或SQLAlchemy不会转义的其他文字数据。

那么,execute()使用我的代码中的,上面的引用是否表示我的代码不安全?总的来说,是否只有在SQLAlchemy ORM层上才可以防止SQL注入,就像最终将要启动的Core层一样execute()

qua*_*yte 5

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

只要您不将手写sql语句与sqlalchemy一起使用,而是使用orm模型方法(model.Sensor.__table__.select())(即使您在示例中可以看到),即使会有用户提供的值,也可以防止Sql Injection。

最后,所有关于显式告诉sqlalchemy的内容都应该使用哪些列和表来选择数据和从中插入数据,以及将其与正在插入或选择的数据分开。切勿将数据字符串与查询字符串结合使用,并始终使用sqlalchemy orm模型对象来描述您的查询。

坏方法(Sql Injectable):

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

好方法(不是Sql Injectable):

Session.execute(model.users.__table__.select().where(model.users.name == request.GET['name']))
Run Code Online (Sandbox Code Playgroud)