3

シングル ページ アプリケーション用に Tornado Web サーバーを実行しています。クライアントはサーバーに投稿しておりtornado.web.RequestHandler.get_argument()、入力を取得するために使用しています。

テストするとき、SQL インジェクションのバグを強制することはできないようです。get_argument()どういうわけか入力をエスケープしているように見えます。ログインフォーム (ユーザー名 + パスワード) から POST を実行するとき、単純な SQL インジェクションを強制するためにあらゆる種類のトリックを試しましたが、役に立ちませんでした。

EDIT2:

ハッ!ついに SQL インジェクションを実行することができました。入力の一部を :DI URL エスケープしたところ、インジェクトされた SQL ステートメントが DB モジュールまでずっと移動していることがわかりました。ログインフォームから生成したクエリはコミットされません。これは SELECT ステートメントであることが想定されているためです。そのため、実際にデータベースを変更することはできませんでした。

クエリがコミットされず、クエリ全体の出力 (挿入されたものを含む) が隠されている場合、どのような損害が発生する可能性がありますか?

たとえば、クエリが想定されているが、SELECT * FROM Users WHERE UserID='USERNAME' AND Password='PASSWORD';ユーザー名の入力に INSERT が挿入されている場合、最終的には次のようUSERNAMEになります。USERNAME'; INSERT INTO Users (UserID, Password) VALUES ('hacker', 'hacked'); --

SELECT * FROM Users WHERE UserID='USERNAME'; INSERT INTO Users (UserID, Password) VALUES ('hacker', 'hacked'); --' AND Password='PASSWORD';

私は一般的に SQL インジェクションの危険性を認識しており、この詳細について興味があります。また、パスワードをハッシュしてソルトする必要があることも認識しています。上記のコードは、例のために単純化したものです。

4

1 に答える 1

5

Tornado は、HTML の問題を回避するために、テンプレート内の文字列のみをエスケープします。次のようなことをしているだけならprint self.get_argument('ihack')、送信された生の文字列を取得できます。

インジェクション防止で MySQLdb を使用する必要があります。

 cursor.execute("SELECT * FROM user_info WHERE email = %s", email)

それよりも:

 cursor.execute("SELECT * FROM user_info WHERE email = %s" % email)   # BAD!

これにより、テンプレートが HTML を保護するのと同じように、SQL が保護されます。

于 2012-11-14T23:31:13.643 に答える