0

有人可以向我推荐一些最适合我要求的python DBAL库。我想直接写我的 sql 语句,大部分逻辑都在 db 存储过程(postgresql)中,所以我只需要调用 db 过程,将参数传递给它们并获取结果。该库应该帮助我引用(防止 sql 注入)。我玩过 sqlalchemy,但我认为直接将 sql 语句写入 engine.execute 方法时没有引用助手。

谢谢

4

2 回答 2

3

您应该对 sqlalchemy 进行更深入的了解;它在引用占位符方面做得很好:

>>> engine = sqlalchemy.create_engine("sqlite:///:memory:")
>>> engine.execute("select ?", 5).fetchall()
[(5,)]
>>> engine.execute("select ?", "; drop table users; --").fetchall()
[(u'; drop table users; --',)]
于 2011-08-09T19:21:41.637 回答
0

如果您正确使用 psycopg2(通过 DB-API),它将自动引用以防止 SQL 注入。(python 方式是错误的;您必须将参数作为参数传递给查询命令本身。)

错误的:

cur.execute('select * from table where last="%s" and first="%s"'
     % (last, first))

对:

cur.execute('select * from table where last=%s and first=%s',
     (last, first))

注意:您不使用 %,也不要在值周围加上引号。

MySQLdb 和 sqlite3 的语法略有不同。(例如,sqlite 使用 ? 而不是 %s。)

此外,对于 psycopg2,即使您正在处理数字或其他类型,也始终使用 %s。

于 2015-01-29T23:08:48.990 回答