1

Visual Studio 2010を使用して、mysqlデータベースでWebサービスを実行しています。

パスワードをチェックしてパスワード(現在のパスワード)を返す関数を作成しました。webmethodでは、関数を呼び出して、変更前の古いパスワードが等しいことを確認してから、mysqlコマンドを呼び出します。しかし、ユーザー/パスをデータベースから直接ダブルチェックしてコピーアンドペーストしても、Webメソッドの呼び出しは無効になります。誰かが私がどこで間違っていたのか見てください?または私が提供する必要がある他の情報はありますか。手伝ってくれてありがとう!

EDIT1:それは関数do_check_passwordの問題であるはずです。do_check_passwordを含むifループをブロックしてみましたが、正常に変更できます。

関数のコード

private string do_check_password(string username)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["mysql"].ToString();
            MySqlCommand dCmd = new MySqlCommand();
            using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
            {
                mysqlCon.Open();
                dCmd.CommandText = "select password from tbl_login WHERE username = ?username ";
                dCmd.CommandType = CommandType.Text;
                dCmd.Parameters.Add(new MySqlParameter("?username", username));
                dCmd.Connection = mysqlCon;
                dCmd.ExecuteNonQuery();
                mysqlCon.Close();
                MySqlDataAdapter da = new MySqlDataAdapter(dCmd);
                DataTable dt = new DataTable();
                da.Fill(dt);

                string currentPassword = dt.Rows[0].ToString();
                return currentPassword;
            }

        }

[WebMethod]

    public string editUserPassword(string username, string oldPassword, string newPassword)
        {

               try
                {

                    string connectionString = ConfigurationManager.ConnectionStrings["mysql"].ToString();
                    MySqlCommand dCmd = new MySqlCommand();
                    using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
                    {
                        if(do_check_password(username) == oldPassword)              
                            {
                                mysqlCon.Open();
                                dCmd.CommandText = "UPDATE tbl_login SET password=?password WHERE username=?username";
                                dCmd.CommandType = CommandType.Text;
                                dCmd.Parameters.Add(new MySqlParameter("?username", username));
                                dCmd.Parameters.Add(new MySqlParameter("?password", newPassword));    
                                dCmd.Connection = mysqlCon;
                                dCmd.ExecuteNonQuery();
                                mysqlCon.Close(); 
                            }
                            else

                            {
                                return string.Format( "invalid password");
                            }
                  }
                     return string.Format("password changed");
                  }
                catch (Exception ex)
                {
                    return string.Format(ex.Message);
                }

}
4

4 に答える 4

1

do_check_passwordには、次の行があります。

dCmd.ExecuteNonQuery();

それはすべきではありません

dCmd.ExecuteReader();

ただし、アドバイスとして、これらのパスワードをクリアテキストで保存しないでください。一方向ハッシュを使用して、パスワードをソルトで暗号化します。

于 2012-06-19T04:13:17.223 に答える
1

do_check_password(string username)関数に次の行は必要ありません

dCmd.ExecuteNonQuery();

そしてClose()接続after fill the dataset...

あなたの方法はそのようでなければなりません

private string do_check_password(string username)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["mysql"].ToString();
            MySqlCommand dCmd = new MySqlCommand();
            using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
            {
                mysqlCon.Open();
                dCmd.CommandText = "select password from tbl_login WHERE username = ?username ";
                dCmd.CommandType = CommandType.Text;
                dCmd.Parameters.Add(new MySqlParameter("?username", username));
                dCmd.Connection = mysqlCon;
                //dCmd.ExecuteNonQuery(); no need here

                MySqlDataAdapter da = new MySqlDataAdapter(dCmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                mysqlCon.Close();
                string currentPassword = dt.Rows[0].ToString();
                return currentPassword;
            }

        }
于 2012-06-19T04:50:49.020 に答える
1

do_check_password で、 dCmd.ExecuteNonQueryで始まる行を次のように置き換えることができます。

string currentPassword = (string)dCmd.ExecuteScalar();
mysqlConn.Close();
return currentPassword;

*コマンドが実行されたら、接続を閉じる必要があることに注意してください。dCmd.ExecuteNonQuery は実際には必要ないため、MySqlDataAdapter の使用も控えることができます。それでも問題が解決しない場合は、次のようにパラメーターの型とサイズを明示的に指定してみてください。

dCmd.Parameters.Add(new MySqlParameter("?username", MySqlDbType.VarChar, 30, username));
于 2012-06-19T04:50:59.377 に答える
0

メソッドを文字列から BOOL に変更したところ、驚くほどうまくいきました。おそらく、データ構文部分で何かが間違っていたのでしょう。これは、誰かが文字列を使用しようとして失敗し、ブール値に変換したい場合の私のコードです

 private bool do_check_password(string username, string oldPassword)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["mysql"].ToString();
            MySqlCommand dCmd = new MySqlCommand();
            using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
            {
                mysqlCon.Open();
                dCmd.CommandText = "select password from tbl_login WHERE username = ?username and password=?oldPassword";
                dCmd.Parameters.Add(new MySqlParameter("?username", username));
                dCmd.Parameters.Add(new MySqlParameter("?oldPassword", oldPassword));
                dCmd.CommandType = CommandType.Text;
                dCmd.Connection = mysqlCon;
                dCmd.ExecuteNonQuery();
                mysqlCon.Close();
                MySqlDataAdapter da = new MySqlDataAdapter(dCmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                if (dt.Rows.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }


                //string currentPassword = dt.Rows[0].ToString();
                //return currentPassword;
            }

        } 

【ウェブメソッド】

    public string editUserPassword(string username, string oldPassword, string newPassword)
        {

               try
                {

                    string connectionString = ConfigurationManager.ConnectionStrings["mysql"].ToString();
                    MySqlCommand dCmd = new MySqlCommand();
                    using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
                    {
                        if(do_check_password(username, oldPassword) == true )              
                            {
                                mysqlCon.Open();
                                dCmd.CommandText = "UPDATE tbl_login SET password=?password WHERE username=?username";
                                dCmd.CommandType = CommandType.Text;
                                dCmd.Parameters.Add(new MySqlParameter("?username", username));
                                dCmd.Parameters.Add(new MySqlParameter("?password", newPassword));    
                                dCmd.Connection = mysqlCon;
                                dCmd.ExecuteNonQuery();
                                mysqlCon.Close(); 
                            }
                            else

                            {
                                return string.Format( "invalid password");
                           }
                  }
                     return string.Format("password changed");
                  }
                catch (Exception ex)
                {
                    return string.Format(ex.Message);
                }

}
于 2012-06-19T08:38:35.333 に答える