2

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

消毒总是好的,但我将我可怜的智力与经验丰富的黑客相提并论。手动转义意味着我可能忽略了一些事情,因为黑名单不如白名单强大。为了进一步澄清,我并不是说使用(%s)符号作为参数传递来构建可能名为sqlstatement. 我认为我需要知道的神奇词汇之一是“绑定”。

我也希望避免 Python 标准库之外的任何内容。

有问题的应用程序需要 Microsoft SQL 2005(如果相关)。我正在使用 ActiveState Python 以及模块 dbi 和 odbc。因为这是别人的数据库,所以存储过程已经出来了。

4

2 回答 2

5

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。

于 2009-03-16T15:55:32.460 回答
2

试试pyodbc

但是,如果您想让事情变得非常简单(加上大量强大的功能),请查看sqlalchemy(顺便说一下,它使用 pyodbc 作为 mssql 的默认“驱动程序”)

于 2009-03-16T16:37:49.550 回答