用c#中的正则表达式替换连接字符串中的密码
本文关键字:字符串 密码 连接 正则表达式 替换 | 更新日期: 2023-09-27 18:16:49
我试图在c#中创建一个正则表达式,它将替换连接字符串的密码,以便当我在页面上显示它时不显示。连接字符串密码位于字符串的某处,如PWD=password;
到目前为止,我有:
Regex.Replace(connStr, "PWD=.*;", "PWD=********");
这可以找到模式的开始,但问题是通配符(.*)也包括;因此,模式永远不会终止,字符串的其余部分也会被替换。除了a,我还能说什么呢?在我的正则表达式中?
谢谢。
您不需要为此使用RegEx - . net有内置的SqlConnectionStringBuilder类,您可以使用它从连接字符串中获取值并更改它们。
示例代码:
string conString = "Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;";
var builder = new SqlConnectionStringBuilder(conString);
builder.Password = "********";
Console.WriteLine(builder.ToString());
可以使用非贪婪量词:
PWD=.*?;
或排除;
s:
PWD=[^;]*;
这是我使用的正则表达式
(?<=Password=).+?(?=(;|'|"|$))
正面向后看,找到密码的开头,积极向前看,寻找结束的密码和一个不贪婪的匹配表达式。"检测令牌"(Password=;'"$)在不同的场景中可能会有所不同。
用例:https://regex101.com/
c#实现using System.Text.RegularExpressions;
private static Regex _regex = new Regex("(?<=Password=).+?(?=(;|'|'"|$))");
//...
var decryptPwdMatch = _regex.Match("some connectionstring for example");
//...
我们遇到了这个问题,一位同事想出了以下正则表达式:
"(?i)(?:^|.*;)pwd=('".*'"|.*?)(?:;|$)+?"
或
"(?i)(?:^|.*;)password=('".*'"|.*?)(?:;|$)+?"
如果里面有密码,而不是pwd。
密码与以下代码匹配:
var regex = new Regex(mask);
var password = string.Empty;
var match = regex.Match(connectionString);
if (match.Success && match.Groups.Count > 1)
{
password = match.Groups[1].Value;
}
建议的解决方案存在很多问题。这不是纯粹的Regex,而是处理大小写、空格和可选的尾随分隔符(,或;)
public static class StringExtensions
{
public static string MaskField(this string str, string field, string mask = "***")
{
var separators = ",;";
var sb = new StringBuilder();
foreach (var keyValue in Regex.Split(str, $"(?<=[{separators}])"))
{
var temp = keyValue;
var index = keyValue.IndexOf("=");
if (index > 0)
{
var key = keyValue.Substring(0, index);
if (string.Compare(key.Trim(), field.Trim(), true) == 0)
{
var end = separators.Contains(keyValue.Last()) ? keyValue.Last().ToString() : "";
temp = key + "=" + mask + end;
}
}
sb.Append(temp);
}
return sb.ToString();
}
}