虽然我现在使用的特定数据不是用户生成的,并且在我通常的验证例程中将在其生命的一英寸内进行消毒,但我想学习如何进行基本的INSERT,SELECT等. SQL查询同时保护自己免受SQL注入攻击,仅供将来参考.我宁愿学习如何通过参数化查询以"正确"的方式做事.
消毒总是很好,但我对可怜的黑客的可怜智慧进行了调整.手动逃避意味着我可能忽略了一些事情,因为黑名单不像白名单那样强大.为了进一步说明,我并不是说使用(%s)
符号作为参数来传递可能已命名的字符串sqlstatement
.我认为我需要知道的一个神奇的词是"绑定".
我也希望避免Python标准库之外的任何内容.
有问题的应用程序需要Microsoft SQL 2005,如果这是相关的.我正在使用ActiveState Python和模块dbi和odbc.由于这是Someone Else的数据库,因此存储过程已经完成.
PEP 249(DB API 2.0)定义了5个参数,PyMSSQL使用了paramstyle == pyformat.但它看起来像字符串插值,它实际上是绑定.
注意绑定之间的区别:
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
"我也希望避免Python标准库以外的任何内容."
你在这里运气不好.Python内置的唯一RDBMS驱动程序是SQLite.