2012-06-08 14 views
6

私はPythonでsqlite DBにchar(80)値を設定するコードをいくつか持っています。PythonのSQLインジェクションからの保護

文字列は、テキスト入力フィールドからユーザーから直接取得され、JSON構造のPOSTメソッドでサーバーに返されます。

私は現在、SQL UPDATE操作を呼び出すメソッドに文字列を渡します。

これは機能しますが、私はそれがまったく安全ではないことを認識しています。

とにかくクライアント側が安全でないと予想しているため、サーバー側に何らかの保護が必要です。 UPDATE操作を再度SQLインジェクションで保護するために何ができるでしょうか?

SQLパーサを混乱させないようにテキストを "引用"する関数が私が探しているものです。私はそのような機能は存在すると思うが、それを見つけることはできない。

編集:ここでは は、char型のフィールド名のラベルを設定する私の現在のコードです:

def setLabel(self, userId, refId, label): 
    self._db.cursor().execute(""" 
     UPDATE items SET label = ? WHERE userId IS ? AND refId IS ?""", (label, userId, refId)) 
    self._db.commit() 
+0

は、Pythonのサポートパラメータ化クエリではないんです、"Joe"エスケープ? @Jeremy。 –

+0

はい...しかし、実際には、特定のデータベース用のPythonライブラリがサポートしているかどうか(どちらもAFAIK)です。 – Gerrat

+0

はい。だから私の質問は、私がSQLインジェクションからの保護を確実にするのに十分であることを尋ねるように私の質問を考慮する。 – chmike

答えて

7

con.execute("insert into person(firstname) values (?)", ("Joe",)) 

これはあなたが望むものを

con.execute("insert into person(firstname) values (?)", (firstname_from_client,)) 
+0

私は現在使用しているコードで質問を更新しました。私はあなたが示唆したようにそれをやった。私のコードがSQLインジェクションに対して安全であることを意味しますか? – chmike

+0

「エスケープする」とは、SQLインジェクションを防ぐことを意味します。私は例のためにあなたに答えを与えました。あなたの知識を共有し、私を助けてくれてありがとう。 – chmike

0

Noooo ...バインド変数を使用!それが彼らのためにあります。 this

このテクニックの別の名前はparameterized sqlです(「バインド変数」はOracleで特に使用されている名前かもしれません)。

+0

BIND変数とは?提案するURLは何ですか?答えを加えなさい。 – chmike

+0

確か...どのRDBMSを使用していますか? – Gerrat

+0

私は現在sqliteを使用しています。それはまだ私のWebアプリケーションの生産版ではありません。 – chmike

1

DB-APIの.execute()は、あなたのためにエスケープするためのパラメータ置換をサポートしています。 http://docs.python.org/library/sqlite3.html above 決してこれを行う - insecureドキュメントから

+0

参考にしていただきありがとうございます。私は今これをずっと前に読んで、それ以来、覚えています。私はそれがSQLインジェクションから私を守っていることを知らなかった。それは素晴らしいことです。私はそれを正しい方法でやった。あなたに答えを与えないと申し訳ありません。 Martijnはあなたよりもポイントが少なく、この質問に対する答えを探している私のような人にとっては便利な例を与えました。 – chmike

関連する問題