2

私が現在扱っている特定のデータはユーザーが生成したものではなく、通常の検証ルーチン中にその寿命の 1 インチ以内にサニタイズされますが、基本的な INSERT、SELECT などを実行する方法を学びたいと思います。今後の参考のために、SQL インジェクション攻撃から身を守りながら SQL クエリを実行します。パラメータ化されたクエリを使用して、「正しい」方法で物事を行う方法を学びたいと思います。

サニタイズは常に素晴らしいことですが、私は自分の哀れな知性と熟練したハッカーの知性とを戦わせています。ブラックリストはホワイトリストほど堅牢ではないため、手動でエスケープするということは、おそらく物事を見落としていることを意味します。(%s)さらに明確にするために、表記法を使用して、おそらく という名前の文字列を作成するためのパラメーターとして渡すという意味ではありませんsqlstatement。私が知っておくべき魔法の言葉の 1 つが「束縛」だと思います。

また、Python 標準ライブラリ以外のものは避けたいと思っています。

問題のアプリケーションには、関連する場合、Microsoft SQL 2005 が必要です。ActiveState Python とモジュール dbi および odbc を使用しています。これは他人のデータベースであるため、ストアド プロシージャは使用できません。

4

2 に答える 2

5

PEP 249 (DB API 2.0)は 5 つの paramstyle を定義し、PyMSSQLは paramstyle == pyformat を使用します。しかし、文字列補間のように見えますが、実際には bindingです。

バインディングの違いに注意してください:

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を見てください(ちなみに、mssql のデフォルトの「ドライバー」として pyodbc を使用しています)。

于 2009-03-16T16:37:49.550 に答える