用c#中的正则表达式替换连接字符串中的密码

本文关键字:字符串 密码 连接 正则表达式 替换 | 更新日期: 2023-09-27 18:16:49

我试图在c#中创建一个正则表达式,它将替换连接字符串的密码,以便当我在页面上显示它时不显示。连接字符串密码位于字符串的某处,如PWD=password;

到目前为止,我有:

Regex.Replace(connStr, "PWD=.*;", "PWD=********");

这可以找到模式的开始,但问题是通配符(.*)也包括;因此,模式永远不会终止,字符串的其余部分也会被替换。除了a,我还能说什么呢?在我的正则表达式中?

谢谢。

用c#中的正则表达式替换连接字符串中的密码

您不需要为此使用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();
    }
}