虽然我现在正在使用的特定数据不会由用户生成,并且会在我通常的验证例程中在其生命周期内进行清理,但我想学习如何进行基本的 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/