2010-12-15 18 views
0

私はシステムのログインユニットをテストしていました。私のシステムは、このように設計されて -SQL、Microsoft SQl

ユーザーは、ユーザーID入力した場合 - 合格ABCDとパスワード、サーバは、これらのパラメータを受け取り、SQLコマンドを準備し、Microsoftデータベース -

select password from UserInformationTable where userid = 'abcd'; 

返された値にそれを発射します指定されたパスワードパスと比較され、結果がクライアントに送信されます。

私は成功し、次の方法を使用してシステムに分割 - ><abcd1 or drop table UserInformationTable -

ユーザーは、ユーザーIDを入力します。これがうまくいって、私の完全なUserInformationTableが落ちました。

このようなハッキングの問題をうまく処理する方法はありますか。 1つの方法は、ユーザーIDで 'または'部分文字列を検出することですが、これは非常に優雅ではありませんでした。私がノーを制限できる方法はありますか? SQLのステートメント内のクエリの?

おかげで、よろしく、 Radz

+1

実際にパラメータを使用しているのか、クエリの文字列を連結していますか?また、このMySQLまたはSQL Serverはどの言語を使用していますか? –

+1

SQLインジェクションを読む。そして、平文のパスワードを保存するのがなぜ悪いのかを読んでください。次に、今日のCodingHorror.comを読んで、認証のために第三者を活用することがどのように良いルートになるのかをお読みください。 – Joe

+0

SqlParameters [helplink](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx)を使用する必要があります。 – Raghuveer

答えて

0

これはfamous "Bobby Tables" cartoonにより示さSQLインジェクションの問題です。

Hereは、MS SQL用に修正する方法に関する情報です。特に@ Rookの答えを読んでください。

0

SQLクエリのパラメータを使用します。彼らは自動的にこれを防ぐ。 C#でこのような何か:

SqlCommand comm = new SqlCommand(conn); 
comm.CommandText = "SELECT * FROM foo WHERE bar = @id"; 
comm.CommandType = CommandType.Text; 

SqlParameter param = new SqlParameter("@id", DbType.Int64); 
param.Value = 3; // The actual value that replaces @id 

comm.Parameters.Add(param); 

// ... 

これは、C#に適用されるだけでなく、基本的にすべての近代的なDBシステムと言語はパラメータ化クエリ<をサポート - それをグーグル。

そして第二に、あなたの最初のクエリに変更することができます:

それからちょうどそれは、ユーザーが間違ったパスワードを入力し、0だ場合は、返されてしまった行数を数える

SELECT userid FROM users WHERE username = 'foo' AND password = 'bar' 

0

あなたには2つの問題があります。

  1. 他のユーザーの説明どおりにSQLインジェクション攻撃を受けることがあります。入力をサニタイズしたり、パラメータ化されたクエリを使用したりして、この問題を解決してください。

  2. プレーンテキストのパスワードを保存したり、送信しないでください。どうして?この記事をSlashdotでご覧ください。この問題の解決策は、一方向暗号化を使用してパスワードハッシュを作成してデータベースに格納することです。ユーザがログインしようとすると、自分が提供しているパスワードに同じ暗号化を使用し、データベースを検索して、同じユーザIDとパスワードハッシュを持つ行が存在するかどうかを確認します。

関連する問題