如何在SQL Server连接字符串中隐藏用户标识/密码?

时间:2014-04-02 18:24:23

标签: c# .net sql-server security connection-string

在重新发明轮子之前,有没有一种标准方法可以在SQL Server连接字符串中隐藏至少一个密码?

(用C#编写)

我有一个高度多线程的应用程序,它知道多个数据库,因此为了帮助进行故障排除和调试,可以记录连接字符串的各个位置。我无法控制使用此产品的客户使用什么连接字符串,因此在其中找到密码并不常见。我知道这一点,因为人们打开DEBUG级别的日志记录并向我们发送日志文件以及问题报告也很常见,这些日志包含他们的数据库密码(因此我们的支持票证系统包含密码)。

我意识到最好的做法是不要将密码放在连接字符串中,但那部分是我无法控制的(除非我们当然更改了我们的应用程序,所以如果你给它一个带有未加密密码的连接字符串,它就会拒绝运行。那对我来说似乎有点过分了。)

真的希望我要记录的是:

Server=myServerAddress;Database=myDataBase;User Id=****;Password=*****;

(如果用户ID /名称是否是敏感信息,或者/或者对日志有用还是没有用的话,我会在空中播出 - 对该欢迎的评论。)

我可以构建一个简单的正则表达式(例如/Password=[^;]+/),但在此之前,我只想查看是否还有其他情况我没有考虑,特别是如果已经这样做了。

2 个答案:

答案 0 :(得分:5)

好的,这个答案真的属于@mellamokb,但这就是我使用的:

    /// <summary>
    /// Accepts a SQL Connection string, and censors it by *ing out the password.
    /// </summary>
    /// <param name="connectionString"></param>
    /// <returns></returns>
    public static string CensorConnectionString(string connectionString)
    {
        var builder = new DbConnectionStringBuilder() {ConnectionString = connectionString};
        if (builder.ContainsKey("password"))
        {
            builder["password"] = "*****";
        }
        return builder.ToString();
    }

情侣笔记:

  • 它似乎保留了属性的顺序。
  • 我认为我实际上并没有发现任何输出与输入不同的情况(当然除了密码),但我仍然不会依赖于此。就我的目的而言,我并不关心,因为它是调试信息,看着这个的人可以弄清楚正在使用什么数据库,这就是目标。
  • 我故意用5 *的密码审查密码:我不想泄漏有关密码长度的信息。

答案 1 :(得分:-1)

中,您可以做的一件事是在键/值字符串中拆分连接字符串:

var keyValues = connectionString.Split(';');

然后浏览每个字符串并再次拆分:

var listToKeep = new List<string>();

foreach (var keyValue in keyValues)
{
    var key = keyValue.Split('=')[0].Trim();

    if (key != "Password" && key != "Pwd") listToKeep.Add(keyValue);
}

现在,您可以通过重新加入其他字段来重新创建没有密码的连接字符串:

var safeConnectionStringForLog = string.Join(";", listToKeep.ToArray());

正如mellamokb在评论中建议的那样,您可能希望使用SqlConnectionStringBuilder来解析连接字符串,删除密码并获取新字符串。当然,您的连接字符串可能没有使用完全相同的顺序完全相同的参数。