【发布时间】:2010-01-04 04:10:09
【问题描述】:
我正在开发一个小型应用程序,该应用程序将帮助浏览vim-logging 生成的数据,并且我希望允许人们对数据集运行任意 SQL 查询。
我怎样才能安全地做到这一点?
例如,我想让某人输入SELECT file_type, count(*) FROM commands GROUP BY file_type,然后将结果发送回他们的网络浏览器。
【问题讨论】:
我正在开发一个小型应用程序,该应用程序将帮助浏览vim-logging 生成的数据,并且我希望允许人们对数据集运行任意 SQL 查询。
我怎样才能安全地做到这一点?
例如,我想让某人输入SELECT file_type, count(*) FROM commands GROUP BY file_type,然后将结果发送回他们的网络浏览器。
【问题讨论】:
这样做:
cmd = "update people set name=%s where id=%s"
curs.execute(cmd, (name, id))
请注意,占位符语法取决于您使用的数据库。
来源和更多信息在这里:
【讨论】:
在防止破坏的同时允许表现力是一项艰巨的工作。如果您让他们自己输入“SELECT ..”,则需要阻止他们输入“DELETE ..”。您可以要求语句以“SELECT”开头,但您还必须确保它在中间的某处不包含“; DELETE”。
最安全的做法可能是使用只读用户凭据连接到数据库。
【讨论】:
在MySQL中,你可以创建一个limited user(创建新用户并授予有限访问权限),它只能访问特定的表。
【讨论】:
考虑使用 SQLAlchemy。虽然 SQLAlchemy 可以说是有史以来最伟大的对象关系映射器,但您当然不需要使用任何 ORM 东西来利用所有已完成的出色 Python/SQL 工作。
正如介绍性文档所暗示的:
最重要的是,SQLAlchemy 不仅仅是一个 ORM。它的数据抽象层允许以与平台无关的方式构造和操作 SQL 表达式,并提供易于使用和超快的结果对象,以及表创建和模式反射实用程序。在导入 orm 包之前,不涉及任何对象关系映射。或者使用 SQLAlchemy 自己编写!
使用 SQLAlchemy 将“免费”为您提供输入卫生,并让您使用标准 Python 逻辑来分析语句的安全性,而无需进行任何混乱的文本解析/模式匹配。
【讨论】: