2016-06-26 5 views
0

INSERTの値をdb-syntaxに直接挿入することは、許容されない理由を完全に理解することができます。 SQLインジェクションを防止したい。それはまだ大きなは何としても、次のやっていない理由しかし、私は理解していない:パラメータを使用せずにC#

cmd.CommandText = "SELECT * FROM [Students] 
        WHERE StudentID = " + studentID + ";"; 

        int getID = (int)cmd.ExecuteScalar(); 

だけSELECTはINGのことで害は何ですか?私は実際には以下のパラメータのポイントを理解していない。私はそれに疑問を呈していない、私はちょうどパラメータが必要である理由と私が上のコードから得ることができる結果が以下のオプションを使用する代わりに知りたい。

var pStudentID = new SqlParameter("@studentID", SqlDbType.Int); 
       pStudentID.Value = studentID; 
       cmd.Parameters.Add(pStudentID); 
+1

[Little Bobby Tables](http://bobby-tables.com/)に会っていないようです。 – HABO

答えて

3

パラメータを使用する方が良い理由は2つあります。

  1. Sql注入 - 最初の例では、SQLインジェクション攻撃の影響を受けます。これは、studentIDがWebフォームから入力されている場合、「 - 」を使用して選択文字列をコメント化し、データベースに対して他のコマンドを発行することができるということです。

  2. 準備 - パラメータを使用する場合は、構文のプリコンパイルの一種であるsql文を準備できます。これは、大量の状況では少し上手くいくかもしれません。

編集:先日、このビデオはredditで公開されました。これは、SQLインジェクションの仕組みの素晴らしい例です。 sql injection

+0

ありがとうございました:)私は今からパラメータに固執します。 Btwあなたのredditリンクが動作しない、 "ページが見つかりません" – Nyprez

+0

リンクが修正されました。がんばろう。 –

1

この入力を想定します。

var studentID = "''; drop table users;--" 
cmd.CommandText = "SELECT * FROM [Students] 
        WHERE StudentID = " + studentID + ";"; 

これは、これは完全にテーブルのユーザーの削除]を選択し呼び出すならば。

パラメータは、正規の入力のみをクエリに追加することを承認するのに役立ちます。

+0

すばらしい例をありがとう:)実際に私はdbがどのようにパラメータなしで脆弱であるかを認識しました。 – Nyprez

関連する問題