7

我做了以下...

private static IDbConnectionProvider CreateSqlConnectionProvider(DbConfig dbConfig)
{
    return new QcDbConnectionProvider(() =>
        {
            SqlConnectionStringBuilder csBuilder = new SqlConnectionStringBuilder();

            if (!string.IsNullOrEmpty(dbConfig.DataSource)) 
                csBuilder.DataSource = dbConfig.DataSource;

            if (!string.IsNullOrEmpty(dbConfig.Database))
                csBuilder.InitialCatalog = dbConfig.Database;

            .
            .
            .
            .

            return new SqlConnection(csBuilder.ConnectionString);
        });
}

客户端正在使用 VERACODE 工具进行代码分析,并且 VERACODE 在

return new SqlConnection(csBuilder.ConnectionString);

此外,dbConfig正在初始化,如下所示......

DbConfig configDbConfig = new DbConfig
{
    Database = codeFile.ConfigurationDb,
    DataSource = codeFile.DataSource,
    IntegratedSecurity = sqlCredentials.UseWindowsAuthentication ? 1 : 0,
    UserId = sqlCredentials.UseWindowsAuthentication ? null : sqlCredentials.SqlUserName,
    ClearTextPassword = sqlCredentials.UseWindowsAuthentication ? null : sqlCredentials.SqlUserPassword
};

为了修复这个缺陷,我还需要做什么?同样根据此链接,我正在使用创建连接字符串的SqlConnectionStringBuilder安全字符串创建连接字符串。

提前致谢...

4

2 回答 2

7

不受信任的初始化问题的描述是:

应用程序不应信任已在其信任边界之外初始化的变量。不受信任的初始化是指应用程序允许对系统设置或变量进行外部控制的情况,这可能会中断服务或导致应用程序以意想不到的方式运行。例如,如果应用程序使用环境中的值,假设数据不能被篡改,它可能会以危险的方式使用该数据。

在您的情况下,您正在dbConfig从文件中读取数据:

 if (TryReadCodeFile(configurationProfileFile...)) {
     DbConfig configDbConfig = new DbConfig...
}

请注意,您收到的警告还应带有行号(以限制错误代码)。您发布的代码中的几乎所有内容都可能产生此问题(我不知道从何sqlCredentials而来,但如果它们是明文形式,它甚至可能是另一个安全问题来源 - 或者在您的应用程序中可以访问要解密的代码)。

从引用的段落:“......应用程序允许对系统设置或变量进行外部控制,这可能会破坏服务......”。这是这个问题的核心:如果您的应用程序使用外部数据而没有直接控制它们,那么可以通过修改该数据来更改其行为。这些外部数据是什么?清单并非详尽无遗:

  • 环境变量(例如解析到另一个文件或程序的路径),因为用户可能会更改它们。原始文件没有被触及,但您阅读了其他内容。
  • 路径(用于加载代码或数据),因为用户可能会重定向到其他内容(同样未触及原始文件,但您阅读了其他内容)。
  • 支持文件,因为用户可以更改它们(在您的情况下,例如,指向另一个服务器和/或目录)。
  • 配置文件,因为用户可以更改它们(同上)。
  • 数据库,因为其他用户也可以访问它们并且它们可能会被更改(但它们可能受到保护)。

恶意用户如何使用它?想象一下,每个用户都连接到不同的目录(根据他们的组织规则)。这不能更改,它是在安装过程中配置的。如果他们可以访问您的配置文件,他们可能会将目录更改为其他内容。他们还可以将数据库主机名更改为可以嗅探数据的隧道(如果他们可以物理访问其他人的机器)。

另请注意,他们还说“......假设数据不能被篡改,它可能会以危险的方式使用该数据”。这意味着,例如,如果您的应用程序在 Web 服务器上运行并且物理访问是安全的,那么您可能会认为该数据是安全的。

请注意,您的应用程序将是安全的,因为您的整个系统中的安全性较低。请注意,要使应用程序安全(我知道,这个术语非常模糊)加密密码是不够的。

如果支持文件可能被操纵,那么您可以做的最好的事情是使用公钥/私钥加密对其进行加密。一个不太理想的解决方案是计算 CRC 或散列(例如),您将在使用配置文件之前应用它们(它们能够更改它们,但您的应用程序会检测到这个问题)。

总结一下:您可以忽略这个问题,但您必须向您的客户证明您所依赖的数据不能被篡改。您可以合理地证明是否至少满足以下条件之一:

1) 除了您的应用程序之外,其他任何人都无法访问支持文件所在的系统。您的应用程序安全性不能高于系统安全性。

2)您的支持文件在每台机器上都是有效的(以避免在不同机器之间复制),并且它们以任何人都无法(有意或无意)更改的方式加密。3)您的支持文件在每台机器上都是有效的,并且它们以您的应用程序可以检测到外部更改的方式进行哈希处理。

4) 不管用户对你的配置文件做什么,应用程序本身不能改变它的行为(例如它是一个单一的安装,只有一个数据库和一个目录存在)。

于 2015-06-15T11:49:29.707 回答
0

连接字符串最重要的是它们的存储方式。如果它们以明文形式存储,则会带来安全风险。因此,建议以加密格式存储它们并在应用程序中解密并使用它。

于 2019-09-08T07:26:01.000 回答