Jes*_*ose 3 python postgresql sqlalchemy
这不起作用–更新无效:
command = "select content from blog where slug = 'meow'; update account_balance set balance=200 where id=1; select 1 from blog;"
content = db.engine.scalar(command)
Run Code Online (Sandbox Code Playgroud)
切换语句将执行更新并成功选择:
command = "update account_balance set balance=200 where id=1; select content from blog where slug = 'meow';"
content = db.engine.scalar(command)
Run Code Online (Sandbox Code Playgroud)
为什么第一个不起作用?它可以在Pgadmin中工作。我用Flask-Sqlalchemy启用了自动提交。
我正在举办有关SQL注入的研讨会,所以请不要重写解决方案!
SQLAlchemy自动提交的工作方式是检查发出的语句,试图检测数据是否被修改:
...,SQLAlchemy实现了自己的“自动提交”功能,该功能在所有后端完全一致地工作。这是通过检测代表数据更改操作的语句(即INSERT,UPDATE,DELETE)以及数据定义语言(DDL)语句(如CREATE TABLE,ALTER TABLE),然后在没有事务进行的情况下自动发出COMMIT来实现的。该检测基于
autocommit=True语句上是否存在执行选项。如果该语句是纯文本语句,并且未设置标志,则使用正则表达式来检测INSERT,UPDATE,DELETE以及用于特定后端的各种其他命令
由于在SQLAlchemy级别不支持多个结果集,因此在第一个示例中,检测仅省略了发出COMMIT,因为第一个语句是SELECT,而在第二个示例中,则是UPDATE。没有尝试从多个语句中检测数据修改语句。
如果你看一下PGExecutionContext.should_autocommit_text(),你会发现它确实正则表达式匹配反对AUTOCOMMIT_REGEXP。换句话说,它仅在文本开头匹配。
| 归档时间: |
|
| 查看次数: |
1000 次 |
| 最近记录: |