2011-07-23 12 views
2

このコードはSQLインジェクションから安全ですか?どうして?このコードはSQLインジェクションから安全ですか? (そして理由)

public void AddPlayer(string username) 
    { 
     var query = "INSERT INTO dbo.Player(Username, RegisterDate) VALUES(@Username, @RegisterDate)"; 
     using (var connection = new SqlConnection(connectionString)) 
     using (var command = new SqlCommand(query, connection)) 
     { 
      command.Parameters.AddWithValue("@Username", username); 
      command.Parameters.AddWithValue("@RegisterDate", DateTime.Now); 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 
    } 

    public DateTime GetRegisterDate(string username) 
    { 
     var query = "SELECT RegisterDate FROM dbo.Player WHERE Username = @Username"; 
     using (var connection = new SqlConnection(connectionString)) 
     using (var command = new SqlCommand(query, connection)) 
     { 
      command.Parameters.AddWithValue("@Username", username); 
      command.Connection.Open(); 
      return (DateTime)command.ExecuteScalar(); 
     } 
    } 

EDIT:ストアドプロシージャを使用して射出セーフ同等のコードをを書かれていませんか?もしそうなら、ストアドプロシージャはどんなものでしょうか?

答えて

9

はい、安全です。

パラメータを使用するためです。

あなたは
baseQueryText + " WHERE Username =" + TextBox.Text;

ようなクエリは、[編集]をReguarding作成するときには、SQLインジェクションのリスクを実行します。あなたはストアドプロシージャを使用すると、彼らはあまりにも安全であるように、あなたは常にパラメータを使用します。特別な努力は必要ありませんが、依然として着信データをフィルタリングできます。

+0

+1。脆弱なストアドプロシージャを構築することは可能ですが、まだ安全だと言ったようなパラメータを使用することは可能です。@asmo:既存のコードをストアドプロシージャに多かれ少なかれコピーできるはずです。 – Eric

+0

皆さん、ありがとうございました! – asmo

6

はい。パラメータ化されたクエリを使用していますが、これは一般にSQLインジェクションから安全だと考えられています。

とにかく入力をフィルタリングすることを検討してください。

+0

あなた*** ***はまだフィルタリングしたいです。結局のところ、 ' 'のクエリは、UIに送り返されたときにプレイヤーを見つけることはまずありません(ここではウェブと仮定します)... – Richard

+0

右ですが、SQLインジェクションではなくスクリプトインジェクションです。そしてそれを処理する適切な方法は、ビューのHtmlEncodingです。それは、UserNameを制限することに傷つきません。 –

4

はい、すべての非静的データはバインドされたパラメータを使用してフィードされています。

関連する問題