小编tan*_*ius的帖子

Pandas 中的 SQL 注入;将列表绑定到 SQLAlchemy 中的参数

我有这个 SQL 查询:

sql = "select * from table where date in {dl}"
Run Code Online (Sandbox Code Playgroud)

其中 dl 是日期元组。我可以string.format(dl=...)通过read_sql_query在 Pandas 中使用 then 来执行查询,但我读到这可能会导致 SQL 注入,因此不安全。

但是,SQLAlchemy 中似乎没有一个好的替代方案。您似乎无法使用 将列表传递给参数text(),并且首先将列表转换为字符串会导致错误。我看到你可以遍历列表并一个一个地传递参数,但是为什么有人想要这样做呢?

清理变量(删除引号、分号等)是否有助于降低 SQL 注入的风险?无法使用原始 SQL 字符串听起来很糟糕。

python sqlalchemy pandas

4
推荐指数
1
解决办法
3116
查看次数

在flask-sqlachemy下的Pandas read_sql数据库引擎

我正在Flask中编写一个Web应用程序,我正在使用pandas从MySQL数据库中检索数据.以下用于工作,使用我从另一篇文章中读到的内容:

db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(config['default'])
db.init_app(app)
conn = db.engine.connect().connection
Run Code Online (Sandbox Code Playgroud)

然后在视图函数中(在相同的.py文件中):

@app.route('/report', methods=['GET', 'POST'])
def report():
    form = ReportForm()
...
    sql = '''SELECT * FROM availability ...'''
    df = psql.read_sql(sql, conn)
...

    return render_template('report.html', form=form, df=df)
Run Code Online (Sandbox Code Playgroud)

此网页显示基于所选日期间隔的表格(来自表单).我通过x-editable在网页上添加了此表的内联编辑,我看到更改已发布到数据库,但如果我再次提交表单,则表只会在更改之前加载旧数据.我只是在重新打开网页后看到了这些变化,这很奇怪.

在read_sql工作之前移动'conn'行:

sql = '''SELECT * FROM availability ...'''
conn = db.engine.connect().connection
df = psql.read_sql(sql, conn)
Run Code Online (Sandbox Code Playgroud)

但这并不好,因为我必须为每个查询重复此操作(并且每个视图都有一些查询).有没有办法我只是在开始时声明这个连接对象一次并将其结束?SQLAlchemy的ORM可以工作,但我更喜欢在这种情况下编写原始SQL.

编辑:

joris的建议适用于一个查询,但现在我遇到了另一个错误:

File "C:\Users\KF\flask-test\hello.py", line 107, in report
df = pd.read_sql_query(sql.format(vd='20140727', sd=sd, ed=ed), db.engine)
File "C:\Anaconda\envs\lightson\lib\site-packages\pandas\io\sql.py", line 363, in read_sql_query
parse_dates=parse_dates)
File "C:\Anaconda\envs\lightson\lib\site-packages\pandas\io\sql.py", line 823, …
Run Code Online (Sandbox Code Playgroud)

python pandas flask-sqlalchemy

0
推荐指数
1
解决办法
2418
查看次数

标签 统计

pandas ×2

python ×2

flask-sqlalchemy ×1

sqlalchemy ×1