Refit / API / HTTPS 连接:在 header 上添加密码 - 这样安全吗?
Refit / API / HTTPS Connection: adding password on header - Is this safe?
我正在设置一个新的 WebAPI 服务器 (ASP NET),我们正在使用 HTTPS 并检查通过消息 [=33= 传递的有效密码].
服务器端,我可以检查是否每个包都是通过 HTTPS 传递的,以及它是否包含正确的 header 和密码信息。
我的问题是:我们在 API 客户端上使用 refit,在每个包上插入密码作为 header。客户端能否传递 header 或未加密的单个消息?
代码如下:
连接和初始化
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 连接通信/发送包吗?
这只是我的副本 answer to the identical question raised as a Refit issue:
Refit 使用标准 .NET HttpClient
(您在示例中明确使用了一个),因此它与直接使用 HttpClient
一样安全。
在您的示例中,您将基地址设置为 HTTPS URI,这就是 Refit 将永远用来发起 请求的所有内容。
但是,如果您的服务器重定向到 HTTP URI(这种可能性很小)并且 HttpClient
配置为 auto-follow 重定向(这可能是默认设置),则可能后续请求重定向到这个不安全的 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 或读取配置文件。
我正在设置一个新的 WebAPI 服务器 (ASP NET),我们正在使用 HTTPS 并检查通过消息 [=33= 传递的有效密码].
服务器端,我可以检查是否每个包都是通过 HTTPS 传递的,以及它是否包含正确的 header 和密码信息。
我的问题是:我们在 API 客户端上使用 refit,在每个包上插入密码作为 header。客户端能否传递 header 或未加密的单个消息?
代码如下:
连接和初始化
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 连接通信/发送包吗?
这只是我的副本 answer to the identical question raised as a Refit issue:
Refit 使用标准 .NET HttpClient
(您在示例中明确使用了一个),因此它与直接使用 HttpClient
一样安全。
在您的示例中,您将基地址设置为 HTTPS URI,这就是 Refit 将永远用来发起 请求的所有内容。
但是,如果您的服务器重定向到 HTTP URI(这种可能性很小)并且 HttpClient
配置为 auto-follow 重定向(这可能是默认设置),则可能后续请求重定向到这个不安全的 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 或读取配置文件。