python - 是否有可能使用 Python 标准库(比如 2.5 版)执行参数化的 MS-SQL 查询?

标签 python sql binding parameters sql-injection

虽然我现在正在使用的特定数据不会由用户生成,并且会在我通常的验证例程中在其生命周期内进行清理,但我想学习如何进行基本的 INSERT、SELECT等SQL查询,同时保护自己免受SQL注入(inject)攻击,仅供以后引用。我宁愿学习如何通过参数化查询以“正确”的方式做事。

净化总是好的,但我将我可怜的智慧与经验丰富的黑客相提并论。手动转义意味着我可能忽略了一些事情,因为黑名单不如白名单那么强大。为了进一步说明,我并不是说使用 (%s) 表示法作为参数传递以构建可能名为 sqlstatement 的字符串。我认为我需要知道的神奇词汇之一是“绑定(bind)”。

我也希望避免使用 Python 标准库之外的任何东西。

所讨论的应用程序需要 Microsoft SQL 2005(如果相关)。我正在使用 ActiveState Python 和模块 dbi 和 odbc。由于这是其他人的数据库,因此存储过程不可用。

最佳答案

PEP 249 (DB API 2.0)定义 5 个参数样式,PyMSSQL使用 paramstyle == pyformat。但是虽然它看起来像字符串插值,但它实际上是绑定(bind)的

注意绑定(bind)之间的区别:

cur.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')

和插值(这是应该做的):

cur.execute('SELECT * FROM persons WHERE salesrep=%s' % 'John Doe')

另见 http://wiki.python.org/moin/DbApiFaq


"I am also hoping to avoid anything outside of the Python Standard Library."

你在这里运气不好。 Python 中唯一内置的 RDBMS 驱动程序是 SQLite。

关于python - 是否有可能使用 Python 标准库(比如 2.5 版)执行参数化的 MS-SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/650979/

相关文章:

python - 在同一页上打印两次的文本

java - RMI 两次绑定(bind)相同的对象但呈现不同的接口(interface)

c# - 这两种声明 self 绑定(bind)的方式有什么区别?

强制绑定(bind)

mysql - 如何从一列中获取不同的值及其在另一列中的所有对应值

php - 避免在具有非唯一列的 mySQL 表中重复条目

python - 在python中从PDF中提取图像而不重新采样?

python - 无法在 Python 中执行 Postgres 查询

python - 尝试在 Pytorch 中加载自定义数据集

sql - 选择每月注册的用户数