2013-07-24 72 views
0

雖然寫我的應用程序的一部分,需要用戶輸入他們的當前密碼,我想知道,如果它是危險的像做以下(在功能OnChangePassword()用戶應用程序中的遞歸重試是否危險?

if(strCurrPassword != inputPassword.GetInput()) 
{ 
    if(MessageBox(_T("Incorrect password entered, you must enter your current password"), _T("Incorrect Password"), MB_RETRYCANCEL | MB_ICONWARNING) == IDRETRY) 
     OnChangePassword(); 

    return; 
} 

這將是罰款通常情況下,當用戶將一般只是之前他需要一些嘗試/她想起了自己的密碼,但我擔心這可能會被惡意用戶濫用和用來使一個調用堆棧溢出。

如果它可能會導致堆棧溢出,我可以採取哪些措施來防止它被濫用?

+1

好吧,你可以添加一個參數來計算try(例如'OnChangePassword(unsigned int numTries)'並在一定次數的嘗試後中止遞歸,或者不使用遞歸,而是一個循環。 – Hulk

回答

2

無論如何,您應該限制連續嘗試輸入密碼的次數,以防蠻力攻擊。考慮到代碼是孤立的,反映遞歸深度的OnChangePassword的附加參數可能就足夠了,如果它超過某個限制,則會拋出錯誤消息。

我不會認爲堆棧溢出是主要問題。實際上只有當代碼暴露在破解密碼的暴力破解時纔會發生。已經說了這一點,攻擊向量可能是故意剝奪諸如可用堆棧空間之類的資源系統(例如,通過等效的dos攻擊),然後試圖通過請求頂部的另一個處理任務來引發堆棧溢出 - 一個可能是你的密碼檢查器的任務(當我寫下來時,情況感覺相當深奧)。

0

遞歸例程通常有一些退出遞歸的方法,並且@collapsar指出,爲了安全起見,您應該有有限次數的重試。

在考慮安全性時,堆棧溢出不是唯一的問題。如果你內聯代碼並且不把它放在一個明顯名字的函數中,比如OnChangePassword,它也會更好。對於某人在您的可執行文件中搜索包含「密碼」的符號並不會太難,然後繞過預期的密碼驗證。

或者,攻擊者可能只是尋找處理GetInput()函數的代碼來找到代碼檢查的位置並將其與密碼進行比較,所以也許您想考慮以不同的方式處理它,但這可以留給另一個SO問題。

0

您可以使用PostMessage()發佈WM_COMMAND消息來生成ChangePassword的點擊事件。這樣就不需要遞歸調用OnChangePassword