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;
}

这在通常情况下会很好,因为用户通常只需要几次尝试就可以记住他们的密码。但是,我担心这可能会被恶意用户滥用并导致调用堆栈溢出。

如果它可以用来导致堆栈溢出,我可以采取什么措施来防止它被滥用?

4

3 回答 3

2

您应该限制连续尝试输入密码的次数,以防止暴力攻击。单独考虑代码,反映递归深度的附加参数OnChangePassword可能就足够了,如果超过某个限制,则会抛出错误消息。

我不会将堆栈溢出视为主要问题。实际上,只有当代码受到某种暴力破解密码的尝试时,才会发生这种情况。

话虽如此,攻击向量可能是故意剥夺系统的资源,例如可用堆栈空间(例如,通过等效的 dos 攻击),然后尝试通过在顶部请求另一个处理任务来引发堆栈溢出 - 一个任务可能是您的密码检查器(当我写下来时,场景感觉相当深奥)。

于 2013-07-24T14:56:05.030 回答
0

递归例程通常有一些退出递归的方法,正如@collapsar 所说,为了安全起见,你应该有有限的重试次数。

在考虑安全性时,堆栈溢出并不是唯一的问题。如果您内联代码并且不将其放入具有明显名称(例如 OnChangePassword)的函数中,那也会更好。某人在您的可执行文件中搜索包含“密码”的符号然后绕过密码的预期验证并不难。

或者,攻击者可能只是在处理 GetInput() 的函数周围寻找代码,以查找您的代码在哪里检查并将其与密码进行比较,因此您可能想考虑以不同的方式处理它,但这可以留给另一个所以问题。

于 2013-07-24T15:02:03.713 回答
0

您可以WM_COMMAND使用PostMessage()为 生成点击事件来发布消息ChangePassword。这样就不需要OnChangePassword递归调用了。

于 2013-07-24T15:12:52.690 回答