Skip to content

Commit 10b6d10

Browse files
CSHARP-2749: Driver should hide credentials in exception message.
1 parent ebf2d57 commit 10b6d10

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/MongoDB.Driver.Core/Core/Configuration/ConnectionString.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -778,16 +778,17 @@ private void Parse()
778778
var invalidPercentPattern = @"%$|%.$|%[^0-9a-fA-F]|%[0-9a-fA-F][^0-9a-fA-F]";
779779
if (Regex.IsMatch(_originalConnectionString, invalidPercentPattern))
780780
{
781-
var message = string.Format("The connection string '{0}' contains an invalid '%' escape sequence.",
782-
_originalConnectionString);
781+
var protectedConnectionString = protectConnectionString(_originalConnectionString);
782+
var message = $"The connection string '{protectedConnectionString}' contains an invalid '%' escape sequence.";
783783
throw new MongoConfigurationException(message);
784784
}
785785
}
786786

787787
var match = Regex.Match(_originalConnectionString, pattern);
788788
if (!match.Success)
789789
{
790-
var message = string.Format("The connection string '{0}' is not valid.", _originalConnectionString);
790+
var protectedConnectionString = protectConnectionString(_originalConnectionString);
791+
var message = $"The connection string '{protectedConnectionString}' is not valid.";
791792
throw new MongoConfigurationException(message);
792793
}
793794

@@ -801,6 +802,12 @@ private void Parse()
801802
{
802803
throw new MongoConfigurationException("This is an invalid w and journal pair.");
803804
}
805+
806+
string protectConnectionString(string connectionString)
807+
{
808+
var protectedString = Regex.Replace(connectionString, @"(?<=://)[^/]*(?=@)", "<hidden>");
809+
return protectedString;
810+
}
804811
}
805812

806813
private void ParseOption(string name, string value)

tests/MongoDB.Driver.Core.Tests/Core/Configuration/ConnectionStringTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,20 @@ public void When_compressor_is_specified_with_unsupported_value_the_value_should
466466
subject.Compressors.Should().BeEmpty();
467467
}
468468

469+
[Theory]
470+
[InlineData("mongodb://nam!@#$%^&*())e:password@localhost", "mongodb://<hidden>@localhost")]
471+
[InlineData("://nam!@#$%^&*())e:password@loc", "://<hidden>@loc")]
472+
[InlineData("://nam!@#$%^&*())e@loc", "://<hidden>@loc")]
473+
[InlineData("mongodb://nameloc@", "mongodb://<hidden>@")]
474+
[InlineData("mongodb+srv://nameloc@", "mongodb+srv://<hidden>@")]
475+
[InlineData("ongodb://username:password@localhost/?replicaSet=@x", "ongodb://<hidden>@localhost/?replicaSet=@x")]
476+
public void When_connectionstring_invalid_security_data_should_be_protected(string connectionString, string protectedConnectionString)
477+
{
478+
var exception = Record.Exception(() => new ConnectionString(connectionString));
479+
var e = exception.Should().BeOfType<MongoConfigurationException>().Subject;
480+
e.Message.Should().StartWith($"The connection string '{protectedConnectionString}'");
481+
}
482+
469483
[Theory]
470484
[InlineData("mongodb://localhost?connect=automatic", ClusterConnectionMode.Automatic)]
471485
[InlineData("mongodb://localhost?connect=direct", ClusterConnectionMode.Direct)]

0 commit comments

Comments
 (0)