2017-10-09 79 views
1

我有一個使用HttpClient的異步方法:從HttpClient的更改爲Web客戶端,發送密碼以純文本

private static HttpClient client = new HttpClient(); //As pointed by @maccettura 
private async Task<string> GetResult(Uri url, string user, string pass) 
{ 

    var PassArray = new UTF8Encoding().GetBytes(user + ":" + pass); 

     client.BaseAddress = url; 

     client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(_passArray)); 

     string result; 

     using (HttpResponseMessage response = await client.GetAsync(url)) 
     using (HttpContent content = response.Content) 
     { 
      result = await content.ReadAsStringAsync(); 
     } 
     return result; 
    } 

,我不得不改變,以同步的WebClient

 private string GetResult(Uri url, string user, string pass) 
    { 
     using (var client = new WebClient()) 
     { 
      client.UseDefaultCredentials = true; 
      client.Credentials = new NetworkCredential(user, pass); 
      using (var stream = client.OpenRead(url)) 
      using (var streamReader = new StreamReader(stream, Encoding.UTF8, true)) 
      { 
       return streamReader.ReadToEnd(); 
      } 
     } 
    } 

我是不是通過犧牲安全性發送普通用戶名和密碼?如果是這樣,有沒有辦法提高安全性? (該網址是一個https地址)

+0

僅供參考,[您正在使用HttpClient錯誤](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)。 – maccettura

+0

@maccettura Oooo ...有趣。謝謝! – Yasskier

+0

這是使用HTTPS,而不是您使用的保護憑據的庫。無論如何,Base64編碼不是任何保護。 – Crowcoder

回答

0

是的,你是通過發送純文本用戶名和密碼妥協。可以使用網絡嗅探器來獲取您通過http發送的包並讀取它們。如果用戶名和密碼很簡單,那麼呃 - 哦。嗅探者通常在圖書館和咖啡店等公共場所嗅探。

+0

您的解決方案將是....? – Yasskier

+0

你是對的,但它與WebClient vs HttpClient無關。 – Crowcoder

+0

解決方法就是你提到的祕密和算法使用你的祕密進行加密,然後解密當你收到。 – sdfbhg

1

在這兩種情況下,您都以「純文本」發送憑證。在這兩種情況下,它們在發送之前都轉換爲base-64,但這不會使它更安全。唯一的區別是,在第二個(WebClient)案例中,Web客戶端將首先發出請求而沒有憑證。然後,它會得到401未經授權的響應,之後它將發出第二個請求,其標題與Authorization Basic <base64_here>標題完全相同,因此比立即應用該標題的效率要低。但是,兩種情況都發送完全相同的授權標頭。如前所述 - 如果您向https端點發出請求,則您的憑據應安全無虞,不受第三方攔截,如果您已使用加密通道,則無需實施自己的加密。