Установка / API / HTTPS Connection: добавление пароля в заголовок - это безопасно? - PullRequest
1 голос
/ 31 мая 2019

Я настраиваю новый сервер WebAPI (ASP NET), мы используем HTTPS и проверяем действительный пароль, который передается через заголовок сообщения.

На стороне сервера, я могу проверить, есликаждый пакет доставляется через HTTPS, и если он содержит правильный заголовок с информацией о пароле.

Мой вопрос: мы используем refit на клиенте API, вставляя пароль в качестве заголовка в каждый пакет.Может ли клиент передать заголовок или единственное сообщение в незашифрованном виде?

Вот код:

Соединение и инициализация

var httpClient = new HttpClient(new AuthenticatedHttpClientHandler())
{
    BaseAddress = new Uri("https://10.103.208.16:45456/")
}; 


var nsAPI = RestService.For<Interface1>(httpClient);

Вызов метода:

var sugars = await nsAPI.GetMakeUps(); 

HttpHandler, который вставляет пароль

class AuthenticatedHttpClientHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("pw", "MY_SECRET_PW");
        return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
}

Есть ли у меня риск, что пароль может быть перехвачен в незашифрованном виде?Могу ли я принудительно установить refit для связи / отправки пакетов только через HTTPS-соединения?

1 Ответ

0 голосов
/ 17 июня 2019

Это просто копия моего ответа на тот же вопрос, который был задан в качестве вопроса о восстановлении :

Refit использует стандарт .NET HttpClient (вы явно используете его в своем примере), поэтому он так же безопасен, как если бы вы использовали HttpClient напрямую.

В вашем примере вы устанавливаете базовый адрес для HTTPS URI, и это все, что Refit будет когда-либо использовать для инициации запросов.

Однако, если ваш сервер перенаправлен на HTTP URI (что очень маловероятно), а HttpClient настроен на автоматическое отслеживание перенаправлений (что может быть по умолчанию), тогда последующий запрос может быть перенаправлен на этот небезопасный URL. Если бы это было так, ваш обработчик отправил бы пароль по небезопасному запросу.

Это довольно маловероятная ситуация, , но в любом случае это легко исправить - просто проверьте схему URL-адреса, прежде чем прикреплять свой пароль :

class AuthenticatedHttpClientHandler : HttpClientHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if(string.Equals(request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
            request.Headers.Add("pw", "MY_SECRET_PW");
        return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
}

Таким образом, если вы каким-то образом завершите выдачу HTTP-запроса вместо HTTPS, вы не отправите с ним свой пароль.

Если вы беспокоитесь о том, что ваш пароль может быть перехвачен в запросе HTTPS, это действительно возможно только в том случае, если компьютер, на котором работает клиент, был взломан и доверяет кому-то, что не должен. Но если это так, есть более простые способы получить ваш пароль, например, например, путем декомпиляции DLL или чтения конфигурационных файлов.

...