在重新发明轮子之前,有没有一种标准方法可以在SQL Server连接字符串中隐藏至少一个密码?
(用C#编写)
我有一个高度多线程的应用程序,它知道多个数据库,因此为了帮助进行故障排除和调试,可以记录连接字符串的各个位置。我无法控制使用此产品的客户使用什么连接字符串,因此在其中找到密码并不常见。我知道这一点,因为人们打开DEBUG级别的日志记录并向我们发送日志文件以及问题报告也很常见,这些日志包含他们的数据库密码(因此我们的支持票证系统包含密码)。
我意识到最好的做法是不要将密码放在连接字符串中,但那部分是我无法控制的(除非我们当然更改了我们的应用程序,所以如果你给它一个带有未加密密码的连接字符串,它就会拒绝运行。那对我来说似乎有点过分了。)
真的希望我要记录的是:
Server=myServerAddress;Database=myDataBase;User Id=****;Password=*****;
(如果用户ID /名称是否是敏感信息,或者/或者对日志有用还是没有用的话,我会在空中播出 - 对该欢迎的评论。)
我可以构建一个简单的正则表达式(例如/Password=[^;]+/
),但在此之前,我只想查看是否还有其他情况我没有考虑,特别是如果已经这样做了。
答案 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();
}
情侣笔记:
答案 1 :(得分:-1)
在c#中,您可以做的一件事是在键/值字符串中拆分连接字符串:
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
来解析连接字符串,删除密码并获取新字符串。当然,您的连接字符串可能没有使用完全相同的顺序完全相同的参数。