2016-06-08 85 views
1

我打印的命令行參數,這樣密碼:如何隱藏在日誌

static void LogParameters(string[] args) 
{ 
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", args); 
} 

,它將打印-username=Scott -password=cafebabe -nofail。不過,我想打印爲:

-username=Scott -password=******* -nofail 

如何讓我的這種說法印有星號password=後會出現什麼?

+2

隔空通過命令行輸入密碼(不需要用戶輸入)是不安全的。它可能不會顯示在您的程序日誌中,但它會顯示內存,並且也會顯示在調用您的應用程序的腳本的日誌中。這對你來說可能也可能不是問題,但我想我會提到它,因爲你正在試圖讓你的應用程序更安全。 –

+0

它用於Windows服務設置。就像我們可以使用用戶名和密碼設置服務一樣(使用'services.msc'),這個應用程序會設置一個服務。無法透露更多。 – Ajay

+0

不用擔心不披露的東西,我不會撬。如果您的應用可以這樣做(以交互模式),則可能需要考慮提示用戶輸入帶有標準系統調用的密碼,並在用戶嘗試以無人蔘與模式傳遞密碼時發出警告。如果你可以讓你的程序運行你需要的用戶令牌,你也可以避免自己處理密碼。我已經跳過了一些窗口,特別是服務和設置程序,所以你會更好地裝備解決這個謎題,比我更好:) –

回答

3

我看到兩個明顯的方式來做到這一點:

  1. 迭代通過你的args數組,找到手動密碼參數和掩碼密碼
  2. 結合參數轉換爲字符串,並使用正則表達式
更換密碼

我寧願第一個,使用LINQ:

var argsForLogging = args 
    .Select(arg => arg.StartsWith("-password=") ? "-password=(entered)" : arg); 

Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging)); 

它可能看起來並不好,但它易於閱讀,並且沒有正則表達式:)

P.S.可以使代碼輸出不是(entered),但密碼中有字母的地方會有多個星號。但是,它仍然會披露非常敏感的信息。

更新: 如果參數格式不嚴格,那麼您需要考慮到這一點。
例如,如果它應該是不區分大小寫的,那麼你可能想用這個辦法:

var argsForLogging = args 
    .Select(arg => arg.Trim().StartsWith("-password=", true, CultureInfo.InvariantCulture) 
     ? "-password=(entered)" 
     : arg); 

Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging)); 
+0

非常棒。我可以不區分大小寫地執行'StartsWith'嗎? – Ajay

+0

謝謝。我猜'StringComparison.OrdinalIgnoreCase'會爲我工作! – Ajay

1

通常

String maskString = String.Empty; 
    String replaceString = "-password="; 
    foreach (var item in args) 
    { 
     if (item.IndexOf(replaceString) >= 0) 
     { 
      maskString += replaceString + "********* "; 
     } 
     else 
     { 
      maskString += item+" "; 
     } 
    } 
    Console.WriteLine("Command line parameters: {0}", maskString.TrimEnd()); 

或LINQ

var argsForLogging = args 
.Select(arg => arg.StartsWith("-password=") ? "-password=*********" : arg); 

Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging)); 
+0

爲什麼要有'replaceString'?爲什麼我不能有'-password = *******'? – Ajay

+0

replaceString是標記名稱。 –

1
static void LogParameters(string[] args) 
{ 
    string msg = string.Empty; 
    foreach(var item in args) 
    { 
     var subParts = item.Split(new[] { '=' }, 
         StringSplitOptions.RemoveEmptyEntries); 
     if (subParts[0] != "-password") 
      msg += item + " "; 
     else 
      msg += subParts[0] + "****** "; 
    } 
    Console.WriteLine("Command line parameters: {0}",msg.TrimEnd()); 
}