1

我对 Checkmarx 的一个问题感到震惊。

我的应用程序是用 C# 编码在 WPF 中构建的。下面是 PasswordBox 的 XAML

<PasswordBox x:Name="pwdPassword"
Controls:PasswordBoxHelper.CapsLockWarningToolTip="True" 
Controls:PasswordBoxHelper.CapsLockIcon="CAPSLOCK IS ON"
Controls:TextBoxHelper.Watermark="Password" 
HorizontalContentAlignment="Left" 
Controls:TextBoxHelper.ClearTextButton="True" HorizontalAlignment="Left" 
Margin="121,144,0,0" VerticalAlignment="Top" Width="253"/>

这用于根据 Active Directory 检查用户,我正在使用以下代码进行身份验证

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DomainName"))
 {
bool isValid = pc.ValidateCredentials(txtUsername.Text, ADMIN.ConvertToUnsecureString(pwdPassword.SecurePassword), ContextOptions.Negotiate);
pwdPassword=null;

if (isValid)
 {
 //Open the application
}
else
{
//Display message and quit.
}

该应用程序运行良好,但是当我使用 Checkmarx 扫描它时,我得到了下面的 Heap_Inspection 问题。

> \Test1\MainWindow.xaml 的第 19 行的方法 VerticalAlignment="Top"/> 定义了 pwdPassword,它被指定包含用户密码。然而,虽然明文密码后来被分配给 pwdPassword,但这个变量永远不会从内存中清除。

完成后,我已将 pwdPassword 设置为 null,但出现错误。我还使用了下面的 finally 块来收集垃圾

finally
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

有人可以帮助我如何从内存中清除它。

非常感激。

----------********************* 进一步的进展 ****************-- ------------

我进行了以下更改,并假设普通密码未保存到变量但尚未成功

using System.Security;
using System.Windows;
namespace Stack
{
    public static class PasswordBoxMVVMAttachedProperties
    {
        public static SecureString GetEncryptedPassword(DependencyObject obj)
        {
            return (SecureString)obj.GetValue(EncryptedPasswordProperty);
        }
        public static void SetEncryptedPassword(DependencyObject obj, SecureString value)
        {
            obj.SetValue(EncryptedPasswordProperty, value);
        }
        // Using a DependencyProperty as the backing store for EncryptedPassword. This enables animation, styling, binding, etc... 
        public static readonly DependencyProperty EncryptedPasswordProperty =
            DependencyProperty.RegisterAttached("EncryptedPassword", typeof(SecureString), typeof(PasswordBoxMVVMAttachedProperties));
    }
}

Xaml 已更改为

<PasswordBox x:Name="pwdPassword" local:PasswordBoxMVVMAttachedProperties.EncryptedPassword="{Binding PasswordSecureString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Controls:PasswordBoxHelper.CapsLockWarningToolTip="True" Controls:PasswordBoxHelper.CapsLockIcon="CAPSLOCK IS ON" Controls:TextBoxHelper.Watermark="Password" HorizontalContentAlignment="Left" Controls:TextBoxHelper.ClearTextButton="True" HorizontalAlignment="Left" Margin="121,144,0,0" VerticalAlignment="Top" Width="253" PasswordChanged="pwdPassword_PasswordChanged"/>

PasswordChanged 后面的代码如下

private void pwdPassword_PasswordChanged(object sender, RoutedEventArgs e)
{
     pwdPassword = sender as PasswordBox;
Stack.PasswordBoxMVVMAttachedProperties.SetEncryptedPassword(pwdPassword, pwdPassword.SecurePassword);
    }

登录按钮有以下代码

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))
     {
bool isValid = pc.ValidateCredentials(txtUsername.Text,
ADMIN.ConvertToUnsecureString(Stack.PasswordBoxMVVMAttachedProperties.GetEncryptedPassword(pwdPassword)), ContextOptions.Negotiate);
              //              pwdPassword = null;
if (isValid == true)
{
//Open Application
}
else
{
//Quit Application
}
}

尽管如此,我得到了同样的错误。有人可以仔细检查并帮助我找到我遗漏的任何东西,如果我在的话。

任何帮助都感激不尽。

最新更新:2017 年 7 月 12 日

我已将问题归零为根本原因。

我创建了一个只有 PasswordBox 的 WPF(后面没有代码),并针对 CheckMarx 进行了扫描,得到了同样的错误(请找到附图。) Checkmarx 截图

4

0 回答 0