2

我有一个包含登录名、数据库和密码的字符串。

string str = "user Id=abc, database=DDD, Password=mypasswd"  

我希望能够用不同的值替换数据库值“DDD”。

我尝试使用 string.Replace,但我不知道现有数据库将是什么。

有谁知道一个简单的解决方案?

4

7 回答 7

11

以下是 MSDN 唯一推荐的防止连接字符串注入攻击的方法

http://msdn.microsoft.com/en-us/library/ms254947.aspx

// cs stores previous connection string which came from config

System.Data.SqlClient.SqlConnectionStringBuilder builder = 
    new System.Data.SqlClient.SqlConnectionStringBuilder(cs);
builder.InitialCatalog = "NEWDB";

// you get your database name replaced properly...
cs = builder.ToString();

根据数据库或数据库驱动程序的类型,您必须使用不同的类,对于 MySql,它应该是 MySqlConnectionStringBuilder,属性名称可能是 Database。

于 2013-04-24T17:55:24.047 回答
5

一种替代方法是使用正则表达式,这将为您替换:

using System.Text.RegularExpressions;

string cStr = "user Id=abc, database=DDD, Password=mypasswd";
Console.WriteLine(cStr);

Regex r = new Regex("(?<=database=)(.+?)(?=,)");
cStr = r.Replace(cStr, "NewDatabaseName");

Console.WriteLine(cStr);

注意:这是经过编译、运行和验证的,scriptcs因此它相当可放入您的解决方案中。

于 2013-04-24T17:54:14.337 回答
4

使用String.Format怎么样?

string username = "abc";
string database = "myDB";
string password = "my_pw";

string str = String.Format("user Id={0}, database={1}, Password={2}",
                           username, database, password);

然后,您可以从配置文件中加载这些值(甚至整个连接字符串)。

于 2013-04-24T17:48:39.303 回答
2

正则表达式也是一种选择:

string str = "user Id=abc, database=DDD, Password=mypasswd",
    newDatabase = "newDb";

Console.WriteLine( Regex.Replace( str, @"(?<=database=)(.*?)(?=,)", m => newDatabase ) );
于 2013-04-24T17:54:03.467 回答
1

在逗号分隔符处拆分字符串,然后取结果数组的第二个索引,在等号分隔符处拆分,替换第二个元素,然后重新组合所有

string str = "user Id=abc, database=DDD, Password=mypasswd";
string[] parts = str.Split(',');
string[] dbparts = parts[1].Split('=');
dbparts[1] = "new_database_name";

parts[1] = string.Join("=", dbparts);
string final = string.Join(", ", parts);

而且,好吧,进行一些错误检查会更安全。

于 2013-04-24T17:48:08.617 回答
0

与上述相同,但如果您对 LINQ 感兴趣

string str = "user Id=abc, database=DDD, Password=mypasswd";

var q = from part in str.Split(new[] {','})
                let trimedPart= part.Trim()
                let replacedPart  =trimedPart.StartsWith("database=")?trimedPart.Replace("DDD","newValue"):trimedPart
                select replacedPart;

        var newConStr = q.Aggregate((current, next) => current + "," + next);
于 2013-04-24T18:01:58.633 回答
0

这些解决方案都很棒,但是一条长而令人困惑的线路不是有一定的优雅吗?

"user Id=abc, database=DDD, Password=mypasswd".Substring(0, "user Id=abc, database=DDD, Password=mypasswd".IndexOf("database=")) + "database=" + "[YOUR VALUE HERE]" + ", " + "user Id=abc, database=DDD, Password=mypasswd".Substring("user Id=abc, database=DDD, Password=mypasswd".IndexOf("Password="))

输出:user Id=abc, database=[YOUR VALUE HERE], Password=mypasswd

于 2013-04-24T18:09:59.250 回答