如何在ASP.NET中间件中返回ECONNREFUSED以隐藏API?
问题描述
我搭建了一个接收第三方Webhook的小型Web服务器,目前处于测试阶段且会记录所有请求。但发现来自搜索引擎、IP爬虫等的随机请求远多于自身业务请求。我写了一段简单中间件来处理这类请求:
app.Use(async (context, next) => { await next(); // Do not respond to random fkn bot and search engine garbage.. just be silent! if (context.Response.StatusCode != 200) { context.Abort(); } });
测试时发现:服务器运行状态下访问404端点,中间件返回socket hang up;服务器未运行时则返回ECONNREFUSED——这才是我希望在端点不存在时返回的结果。我想让服务器对外表现得像不存在一样保持静默,但context.Abort()返回的socket hang up会明确暴露服务存在,请问能否强制返回ECONNREFUSED(哪怕有少量处理延迟)?
解决方案
无法直接返回ECONNREFUSED。这个错误属于TCP协议层面,只有当目标端口没有任何进程监听时才会触发。你的服务器已经在监听端口,TCP连接已经完成握手,此时不可能再返回该错误。
要实现“让服务器看起来不存在”的效果,可以尝试以下方案:
- 提前终止未完成的TCP连接:把请求判断逻辑放在
await next()之前,一旦识别出非业务请求,立刻调用context.Abort()。此时TCP连接还未完全建立,客户端会收到connection reset类错误,比socket hang up更接近“服务不存在”的表现。 - 通过防火墙/反向代理拦截:在服务器前端部署Nginx或防火墙规则,直接拦截非业务请求的IP、路径或特征,让这些请求根本无法到达你的Web服务器。此时客户端会收到
ECONNREFUSED或超时错误,完全隐藏服务的存在。 - 静默超时处理:对于非法请求,不做任何响应也不关闭连接,让客户端等待直到超时。这种方式客户端会得到
timeout错误,同样能达到隐藏服务的效果,但要注意配置服务器的连接超时参数,避免资源占用过高。
内容的提问来源于stack exchange,提问作者Piotr Kula
相关产品推荐
相关产品推荐

