2017-07-25 8 views
0

こんにちはフォーク、 最初に私はCSharpを初めて使っていると言いたいので、MySQLとの接続を作成する方法が間違っていることを知らなかったのですそのため私はPrepared Statementでそれを変更しなければなりませんでした。親切にしてください!MySQLでCSHARP準備文が動作しない

これは私がそれを動作させようとしている方法です。

[HttpPost] 
    public ActionResult ValidatesLogin (User eUser) 
    { 
     var Email = eUser.Email; 
     var Password = eUser.Password; 
     try 
     { 
      MySqlCommand cmd = MySqlConn.cmd; 
       cmd = new MySqlCommand(" from User " + "WHERE [email protected] " + "AND [email protected]", 
        MySqlConn.conn); 
       cmd.Prepare(); 
       cmd.Parameters.AddWithValue("@email", username); 
       cmd.Parameters.AddWithValue("@password", password); 
       int result = (int)cmd.ExecuteReader(); 


      //encrypting the login user password 
      //the encrypter and decrypter must have same key which is 'kahat' below 
      var encryptpassword = EncryptHelper.EncryptString(eUser.Password, "kahat"); 

      // Returns true when username and password match: 
      if (result > 0) 
      { 
       System.Web.Security.FormsAuthentication.SetAuthCookie(eUser.Email, false); 
       return RedirectToAction("Index", "Index", new { area = "Index" }); 

      } 

      else 
      { 
       TempData["Message"] = "Login failed. Email or password supplied doesn't exist."; 
       return View("Index"); 
      } 
     } 
     catch (Exception ex) 
     { 
      return ThrowJsonError(ex); 
     } 
    } 

以下、このコードは非常にうまく機能し、私の実際の接続です。

[HttpPost] 
     public ActionResult Validate(User eUser) 
     { 
      try 
      { 
       //Pull email and password from login page 
       var Email = eUser.Email; 
       var Password = eUser.Password; 

       //Pull first email and password from database 
       var currentUser = this.rpGeneric.Find<User>(" from User WHERE Email=:email ", new string[] { "email" }, new object[] { Email }).FirstOrDefault(); 

       //encrypting the login user password 
       //the encrypter and decrypter must have same key which is 'kahat' below 
       var encryptpassword = EncryptHelper.EncryptString(eUser.Password, "kahat"); 
       //Comparing user password in login page and current password in db 
       if (currentUser != null && encryptpassword.Equals(currentUser.Password, StringComparison.Ordinal) && currentUser.EmailConfirmed == true) 
       { 
        System.Web.Security.FormsAuthentication.SetAuthCookie(eUser.Email, false); 
        return RedirectToAction("Index", "Index", new { area = "Index" }); 
       } 
       else 
       { 
        TempData["Message"] = "Login failed. Email or password supplied doesn't exist."; 
        return View("Index"); 
       } 
      } 

      catch (Exception ex) 
      { 
       return ThrowJsonError(ex); 
      } 
     } 
+0

の下に指摘したようにタイプミスがでない限り、あなたのクエリでSELECT句が欠落しているように、見えます!あなたの質問は、入力したユーザーを直接クエリと比較するため、これを行うことを示唆しています。 https://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database –

+0

**パスワードをプレーンテキスト**に保管しないでください。パスワードを暗号化しないでください。攻撃者がDBを取得すると、暗号化キーを取得します。ハッシュ関数を使うだけでは不十分で、単に塩を追加するだけでセキュリティを向上させることはほとんどありません。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 'ehash'、' PBKDF2'、 'Bcrypt'、' passlib.hash'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph

+0

ありがとうございます –

答えて

1

SQLクエリが不完全です。まあ

cmd = new MySqlCommand("select [*],[column, column...] from User " + "WHERE [email protected] " + "AND [email protected]", 
       MySqlConn.conn); 
+0

観測として、コマンド文字列を連結する必要もありません。 'select * from Email = @email and Password = @ password'はうまくいきます。 – Ortund

+0

あなたの答えはありがたいですが、なぜここのcmd:MySqlCommand cmd = MySqlConn.cmd;に下線が引かれているのか理解できません。オブジェクトにはcmdの定義と拡張メソッドが含まれていないと言われていますcmd acceptionオブジェクトの型の最初の引数 –

+0

私はあなたのポストで見ることができないので、あなたが参照しているコードはわかりません。あなたは存在しないものを参照しようとしています。 – Ortund

1

:あなたはそれが何をしたいのかMySQLを言っていない

cmd = new MySqlCommand(" from User " + "WHERE [email protected] " + "AND [email protected]", 
       MySqlConn.conn); 

は、あなたが「選択」句とあなたがテーブルから選択している列名を追加する必要がありますそれは、データベース内のプレーンテキストでパスワードを保存しないでください

cmd = new MySqlCommand(" from User " + "WHERE [email protected] " + " 
         ^... Here 
関連する問題