1

私はc#でwebmethodをやっています。デバッグ時、

(chk.Equals(oldpass))

クエリは、左側と右側の両方に同じ値を示します。

それでも、ifの中に入るのではなく、return文を示すelse部分に実行が移ります。フォール。私のコードです。

[WebMethod (Description="for change in password")]
public string update(string authenid,string oldpass,string newpass)
{
     SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Workspace\\visual studio workspace\\Tmrepo\\App_Data\\tmrepo.mdf;Integrated Security=True;User Instance=True");

    try
    {
        conn.Open();

  string chk = "select pwd from client where authenid = '"+ @authenid +"' ";
        if(chk.Equals(oldpass))
        {
            string update = "update client set pwd=@newpass where pwd=@oldpass and authenid=@authenid";
            SqlCommand cmd = new SqlCommand(update, conn);
            cmd.Connection = conn;
            cmd.Parameters.AddWithValue("@authenid", authenid);
            cmd.Parameters.AddWithValue("@oldpass", oldpass);
            cmd.Parameters.AddWithValue("@newpass", newpass);
            cmd.ExecuteNonQuery();

        }

        else
        {
            return "invalid oldpass";
        }
 conn.Close();
        return newpass;
    }
    catch (Exception ex)
    {
        return ex.ToString();
    }

}

このコードに何か問題がありますか? 私は ac# 初心者です。ありがとう。

4

3 に答える 3

5

あなたはコマンドを実行していません: あなたの古いパスワード chk は: "select pwd from client where authenid = '"+ @authenid +"' ";, これはありそうもないパスワードです. たとえば、ExecuteScalar を調べます。

追加の考え:

  • SQLをパラメータ化します。ID を連結しないでください。からの値で名前が"select pwd from client where authenid = @authenid";付けられたパラメーターを追加する場所である必要があります。これは、2 番目の ADO.NET クエリで正しく取得できます。authenidauthenid
  • パスワードはソルト化してハッシュ化する必要があります。直接保存しないでください。パスワードを抽出および/または復号化できないようにする必要があります

(外部編集)

更新: null 値を返す"select pwd from client where authenid = '"+ @authenid +"' ";ため、コードを実行します。"select pwd from client where authenid = '@authenid' ";

update2 : cmd.ExecuteScalar();動作させました。そして取り除くcmd.ExecuteNonQuery();

于 2013-02-15T07:34:40.037 に答える
4

あなたのコードselect pwd from client where authenid = some_valueは oldpass の値と比較していますが、これは false になります!

固定コード ロジック:

        string oldpass = "somehing";

        string authenid = "pass_to_test";
        string sql = string.Format("select pwd from client where authenid = '{0}' ", authenid);
        string chk = null;
        SqlCommand cmd = new SqlCommand(update, conn);

        var reader = cmd.ExecuteReader();
        if (reader.Read())
        {
            // has record with username
            chk = reader.GetString(0);
            if (chk.Equals(oldpass))
            {
                string update = "update client set pwd=@newpass where pwd=@oldpass and authenid=@authenid";

                cmd.CommandText = update;
                cmd.Connection = conn;
                cmd.Parameters.AddWithValue("@authenid", authenid);
                cmd.Parameters.AddWithValue("@oldpass", oldpass);
                cmd.Parameters.AddWithValue("@newpass", newpass);
                cmd.ExecuteNonQuery();

            }

            else
            {
                return "invalid oldpass";
            }

        }
        else
        {
            // not a valid username
        }
        reader.Close();
        reader.Dispose();
于 2013-02-15T07:31:46.230 に答える
1

やっと解決!!!データセットを使用しました。完全に正しいコードの 2 番目の方法は次のとおりです。

string chk = "select pwd from client where authenid = @authenid";
        SqlCommand cmd1 = new SqlCommand(chk , conn);
        cmd1.Parameters.AddWithValue("@authenid", authenid);
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd1);
        da.Fill(ds);
        int cnt = ds.Tables[0].Rows.Count;
        if (cnt > 0)
        {
            if (ds.Tables[0].Rows[0]["pwd"].ToString().Equals(oldpass))
            {
                string update = "update client set pwd=@newpass where pwd=@oldpass and authenid=@authenid";
                SqlCommand cmd = new SqlCommand(update, conn);
                cmd.Connection = conn;
                cmd.Parameters.AddWithValue("@authenid", authenid);
                cmd.Parameters.AddWithValue("@oldpass", oldpass);
                cmd.Parameters.AddWithValue("@newpass", newpass);
                cmd.ExecuteNonQuery();
            }            
        }

私のような他の初心者に役立つことを願っています!!

于 2013-02-15T09:03:09.010 に答える