1

我正在设置一个新的 WebAPI 服务器(ASP NET),我们使用 HTTPS 并检查通过消息头传递的有效密码。

服务器端,我可以检查每个包是否通过 HTTPS 传递,以及它是否包含正确的标头和密码信息。

我的问题是:我们在 API 客户端上使用 refit,将密码作为标题插入到每个包中。客户端是否可以传递标头或未加密的单个消息?

这是代码:

连接和初始化

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);
    }
}

我是否有可能在未加密的情况下嗅探密码?我可以强制改装以仅通过 HTTPS 连接进行通信/发送包吗?

4

1 回答 1

0

这只是我对作为改装问题提出的相同问题的回答的副本:

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 或读取配置文件。

于 2019-06-17T00:10:04.083 回答