2017-08-31 90 views
0

我有用於登錄到我的系統的這段代碼。有這個功能,我可以隨時更改我的密碼。但事實是,我不知道一旦我的密碼已被更改什麼在此代碼更改,這樣我可以在日誌中使用它。如果您更改密碼,如何使用密碼?

private void Button_Click(object sender, RoutedEventArgs e) 
{ 

    if((usrnm.Text == "Administrator") && (password.Text == "administrator")) 
    { 
     MainWindow main = new MainWindow(); 
     main.Show(); 
     this.Hide(); 
    } 
    else 
    { 
     MessageBox.Show("Username or Password is Incorrect."); 
    } 
} 

而且也,每次我改變了它,它說, 「密碼已更改」,但在數據庫中不會更改。

private void btn_save_Click(object sender, RoutedEventArgs e) 
{ 

    if (opw.Text == "administrator") 
    { 
     if (npw.Text == cpw.Text) 
     { 
      OpenDbase("Update USER set Password '" + this.npw.Text + "'"); 
      DataTable dtable = new DataTable(); 
      MessageBox.Show("Password has been changed."); 
     } 
     else 
     { 
      MessageBox.Show("Npw and Cpw mismatched."); 
     } 
    } 
    else 
    { 
     MessageBox.Show("Opw was Incorrect."); 
    } 
} 
+1

首先給我清楚的細節,你正在使用的數據庫和所有。在上面的代碼中,您正在使用的DataTable的用途是什麼。並且「OpenDbase」方法不是由您提供的。提供完整的代碼或至少提供必要的代碼 – Gopi

+0

這是實際的代碼,還是這是一個剪切和粘貼錯誤?我認爲你的更改密碼處理程序更新了數據庫中的密碼,但是我認爲你的登錄處理程序是這樣的:'if((usrnm.Text ==「Administrator」)&&(password.Text ==「administrator 「))'無論密碼更改爲什麼,您都會檢查密碼是否爲'administrator'。 –

+0

該代碼有兩個問題開始:在登錄時,它不檢查當前密碼,但始終檢查相同的密碼。您需要將密碼與數據庫中的密碼進行比較。對於更改密碼的舊密碼檢查也是如此。第二:請永遠不要在任何地方存儲文字密碼!如果您將它們存儲在任何地方,請將其散列否則,一旦數據被盜,您的客戶可能會遇到麻煩。 – CShark

回答

0

與您的登錄代碼有關的問題是,它總是將登錄密碼與固定字符串「administrator」進行比較,而不考慮用戶更改密碼。在比較任何內容之前,您需要獲取當前用戶的密碼。這又意味着您的數據庫需要具有密碼的默認值。

如果你想支持多用戶,類似的規定將工作

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if(CheckPassword(usrnm.Text, password.Text)) 
    { 
     MainWindow main = new MainWindow(); 
     main.Show(); 
     this.Hide(); 
    } 
    else 
    { 
     MessageBox.Show("Username or Password is Incorrect."); 
    } 
} 

private void btn_save_Click(object sender, RoutedEventArgs e) 
{  
    if (CheckPassword(<usrnm.Text?>, opw.Text)) 
    { 
     if (npw.Text == cpw.Text) 
     { 
      var salt = //Generate random string for salt 
      OpenDbase("Update USER set Salt '" + salt + "'"); 
      OpenDbase("Update USER set Password '" + Hash(this.npw.Text, salt) + "'"); 
      DataTable dtable = new DataTable(); 
      MessageBox.Show("Password has been changed."); 
     } 
     else 
     { 
      MessageBox.Show("Npw and Cpw mismatched."); 
     } 
    } 
    else 
    { 
     MessageBox.Show("Opw was Incorrect."); 
    } 
} 

private bool CheckPassword(string user, string password){ 
    // Get Password hash & salt out of database 
    var passwd = OpenDbase("SELECT Password FROM <???> WHERE USER=user"); 
    var salt = OpenDbase("SELECT Salt FROM <???> WHERE USER=user"); 

    if(/*No results found, i.e. user not in db*/){ 
     return false; 
    } else { 
     return passwd == Hash(password, salt); 
    } 
} 

private string Hash(string text, string salt){ 
    // Apply e.g. SHA256 to the string and return the result 
} 

的代碼僅僅是僞,肉要自己添加。您的代碼有兩個其他問題:

  1. 切勿將明文密碼存儲在任何地方。用鹽散列。我已經在正確的位置編寫了一個虛擬哈希函數。閱讀它!它會防止惡意竊賊在竊取客戶數據時擁有所有密碼。單獨的哈希將使您的密碼不可讀,鹽分將阻止使用包含預先計算的哈希值的所謂彩虹表進行輕鬆搜索。另外,千萬不要自己編寫散列函數。使用框架已經給你的東西。再次,閱讀哈希&醃製,一些更多的信息是在評論。如果它是一個私人項目,它不是重要,但仍然...請...
  2. 而你應該絕對參數化你的查詢。猜猜如果有人寫下「abc」,DROP USERS;「作爲他的新密碼?對,它搞亂你的數據庫。你不想那樣。使用參數化查詢(如果可用),他們會爲您處理有問題的值。

/!\另外一個重要的事項要注意; 不關心這個東西可以親自動手,你的公司和你在一些嚴重的法律糾紛

編輯:基礎上,評論一些修改,所以一些意見不會犯太大的意義了...感謝帕納約蒂斯Kanavos

+2

First ,sql注入的真正解決方案是使用參數化查詢,消毒只是一種無法正常工作的破解,在這裏會有什麼清理空間?特殊字符如';',''''和'-'?此外,密碼像'';刪除桌面密碼; --'對於任何腳本小孩來說都是完全安全的,它會以某種方式竊取密碼 –

+2

其次,哈希是不夠的。您需要醃製,密碼強大的哈希算法*和*幾千次重複。至少。計算像MD5這樣的弱哈希速度非常快,可以使用強力查找與哈希對應的密碼。 –

+1

最後,*不要*編寫自己的哈希,尤其是密碼。 .NET已經有了[Rfc2898DeriveBytes](https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes(v = vs.110).aspx)類,它允許您創建一個散列適用於密碼,指定散列迭代次數。默認的迭代次數是1000次。Troy Hunt在[OWASP .NET開發人員十佳排名第10部分:不安全的加密存儲](https://www.troyhunt.com/owasp-top-10-for-net-開發人員部分7 /) –

0

(password.Text == "administrator")

這總是與管理員

檢查(password.Text=="Data",你的存儲在Db的相關用戶「)

你必須這樣做。