我有一个C#应用程序充当HTTP服务器,假设可以在example1.com,example2.com等处访问。
服务器在启动时没有此信息。相反,它会查看"主机"每个HTTP请求中的字段,以了解其已知名称"并填充一个列表,即(' example1.com',' example2.com',' localhost')
如果服务器收到带有无效主机字段的错误或恶意HTTP请求,它仍会添加错误的主机名。
我想检查进入我服务器的HTTP请求的主机字段,看它们是否与当前机器相对应。没有任何额外的网络请求,是否可以这样做?
答案 0 :(得分:1)
该应用需要测试它是否真的example.com
。我没有看到任何其他(可靠的)解决方案。您不一定要依赖DNS查找,因为webapp可能有私人地址。
您可以为这些测试设置特殊端点。我想象的流程是这样的:
www.example.com/blah.html
www.example.com
,以确保它确实是www.example.com
,它会生成并存储一个大的随机数,比如说123456
和一个索引,说5
。www.example.com/verify_hostname
发送质询,将索引作为参数传递(即www.example.com/verify_hostname?index=5
)。123456
响应。123456
的回复后,服务器现在知道它真的可以通过www.example.com
访问,至少目前是这样。当然,这种解决方案的其他变体也是可能的。
请注意,此方法利用了应用程序的线程具有共享内存来存储随机数和索引的事实。如果webapp部署在群集中,则需要替换此简单身份验证方案。一种方法是使用shared secret和challenge-response,或其他一些加密解决方案。
另一件事 - 在我提出的解决方案中,存储随机数和索引的线程与验证它们的线程之间存在固有的竞争条件。在验证线程尝试读取它们之前,您需要确保存储所选的随机数和索引。各种eventual consistency集合不足以保证它,因此它们可能会不时失败。