2016-04-15 19 views
0

エラーが表示され、無効な列名が必要です。 mustufainはまず、あなたはそれがSQLインジェクション攻撃のようなものに対して脆弱にあなたを残すことができますし、それは(あなたのクエリが間違っていると問題が発生する可能性がありますようにクエリを構築するために文字列連結を使用すべきではないUserName.Text.toString()asp.netのクエリでエラーが発生しました。

string query = "select userid from register where username = " + UserName.Text.ToString() + " and " + "password = " + Password.Text.ToString(); 

SqlCommand cmd1 = new SqlCommand(query,connection); 
connection.Open(); 
SqlDataReader rd1 = cmd1.ExecuteReader(); 
while(rd1.Read()) 
{ 
    Session["checkuserid"] = rd1["userid"]; 
} 
connection.Close(); 
+3

まず、ASP.NETは、クエリを実行しません:このサイトでパスワードのハッシュを作成して、クリアテキスト例えば

するのではなく、そのハッシュを保存する方法を説明し、多くの質問と回答があります。それはADO.NETです。第2に、連結によってSQL文を構成しないでください。パラメータ化されたクエリを使用します。この場合、ユーザーが入力した内容はわかりません。 '1; drop table users; - '? –

+1

何が起こるかを知るためには "Bobby Tables"のgoogleだけです。 –

+1

SqlConnection、SqlCommand、およびSqlDataReaderは[IDisposable]を実装しています(https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110) .aspx)。 'finally'ブロック内でdisposeを呼び出すか、[usingステートメント](https://msdn.microsoft.com/en-us/library/yh598w02.aspx)でラップして確実に処理する必要があります適切にこれを今行わないと、後で問題に遭遇し、問題を追跡するのが難しくなります。 – mason

答えて

3

の値であり、あなたのパラメータの周りに目盛り)不足しているとして:

// This would attempt to state username = mustufain instead of 
// username = 'mustufain' (and SQL doesn't know what mustufain is) 
var query = "select userid from register where username = '" + UserName.Text + "' and " + "password = '" + Password.Text + "'"; 

をパラメータ化を使用して、より良いアプローチは間違った構文を回避し、あなたにどんな嫌な注射に対する保護を提供しています以下、次のようになります。

// Open your connection 
using(var connection = new SqlConnection("{your connection string}")) 
{ 
    // Build your query 
    var query = "SELECT TOP 1 userid FROM register WHERE username = @username AND password = @password"; 
    // Build a command (to execute your query) 
    using(var command = new SqlCommand(query, connection)) 
    { 
      // Open your connection 
      connection.Open(); 
      // Add your parameters 
      command.Parameters.AddWithValue("@username",UserName.Text); 
      command.Parameters.AddWithValue("@password",Password.Text); 
      // Execute your query 
      var user = Convert.ToString(command.ExecuteScalar()); 
      // If a user was found, then set it 
      if(!String.IsNullOrEmpty(user)) 
      { 
       Session["checkuserid"] = user; 
      } 
      else 
      { 
       // No user was found, consider alerting the user 
      } 
    } 
} 

最後に、クレデンシャルをどのように保存するのかを再検討したい場合があります(クリアテキスト)。 ASP.NETには、このプロセスを処理するのに役立つさまざまなプロバイダが用意されているので、自分で処理する必要はありません。

3

文字列を連結してSQLクエリを作成しようとしていますが、通常どおりエラーが発生します。特定の場合には、文字列の値を一重引用符で囲むことを忘れてしまいます。しかし、このクエリを実行するための唯一の正しい方法は、データベースに平文でパスワードを保存することは非常に悪い習慣と強力なセキュリティ上のリスクであることを

string query = @"select userid from register 
       where username = @name and password = @pwd"; 
using(SqlCommand cmd1 = new SqlCommand(query,connection)) 
{ 
    connection.Open(); 
    cmd1.Parameters.Add("@name", SqlDbType.NVarChar).Value = UserName.Text; 
    cmd1.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = Password.Text; 
    using(SqlDataReader rd1 = cmd1.ExecuteReader()) 
    { 
     .... 
    } 
} 

お知らせもパラメータ化クエリによるものです。 Best way to store passwords in a database

関連する問題