当前位置: 首页 > 知识库问答 >
问题:

防止外部请求expressjs

蔺敏达
2023-03-14

在使用morgan中间件记录日志时,我注意到服务器日志中出现了一些频繁且令人担忧的请求。

相关记录器代码

var app = express();
app.use(morgan(':remote-addr - [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'));

因此,日志的示例如下

::ffff:(redacted) - [Fri, 24 Jul 2015 04:16:32 GMT] "GET / HTTP/1.1" 200 29294 "-" "-"
::ffff:(redacted) - [Fri, 24 Jul 2015 04:17:30 GMT] "GET http://example.com/path.php HTTP/1.1" 200 34523 "-" "-"
::ffff:(redacted) - [Fri, 24 Jul 2015 04:17:36 GMT] "GET /path HTTP/1.1" 200 29294 "-" "-"

不幸的是,我不知道如何重现这样的错误。这是一个潜在的漏洞吗?原木锻造?我在哪里可以找到进一步的信息?

具体来说,这一行的url是“GET”http://example.com/path.php HTTP/1.1”,其中example.com不是我的域,我的服务器也没有设置为向example.com发出请求。通常这里只显示一个路径(例如,/example,/path,/)。此外,这些行通常作为来自外部IP的明显漏洞扫描的一部分出现,200的响应让我担心。日志是否指示出站请求?是否有人以某种方式使用我的服务器作为代理?

共有1个答案

申屠洛华
2023-03-14

此问题可以通过连接到服务器并发送TCP数据包以形成HTTP请求来重现。

假设服务器部署在本地,可以使用netcat在ubuntu中复制,并发送HTTP请求,如

netcat localhost 8080
GET http://example.com/path.php HTTP/1.1

由于这不是一个格式错误的HTTP请求,nodejs会正确地处理它,但结果是,通过nodejs传递的url不仅仅是一个路径,而且包含给定的任何协议和域。

这可能会使某些节点(或express)应用程序崩溃,这些应用程序只希望请求url(或在express中为originalUrl)类似于路径,正如express文档和这些stackoverflow答案1和2所暗示的那样。

至于为什么它返回200,这将是特定于应用程序的。

考虑到这一点,重要的是不要假设请求url,也不是在Express的情况下的请求原始url,是一个以'/'开头的路径,当它不以'/'开头时,它甚至可能不包含正确的协议或域。

至少在v4中,Express可以“修复”不以“/”开头的请求URL,但请求对象的原始URL部分不会更改。无论如何,仍然不应假定url以“/”开头。

在express中避免此类问题请求的一种简单方法是在中间件堆栈顶部附近放置一个中间件来处理这种情况。下面给出了一个例子。如果需要,将其置于记录器之前将防止记录这些错误。

app.use(function(req, res, next) {
    if(req.url[0] !== '/' || req.originalUrl[0] !== '/') {
        res.status(404).send('');
    } else {
        next();
    }
});
 类似资料:
  • 本文向大家介绍防止重复发送 Ajax 请求,包括了防止重复发送 Ajax 请求的使用技巧和注意事项,需要的朋友参考一下 要考虑并理解 success, complete, error, timeout 这些事件的区别,并注册正确的事件,一旦失误,功能将不再可用; 不可避免地比普通流程要要多注册一个 complete 事件; 恢复状态的代码很容易和不相干的代码混合在一起; 推荐用主动查询状态的方式(

  • 问题内容: 我想使用post来更新数据库,并且不希望人们手动进行,也就是说,只能通过客户端中的AJAX来实现。在这种情况下是否有一些众所周知的加密技巧? 假设我正在发出GET请求,以将新用户插入数据库中。有人可以通过发出假请求来填充我的数据库。 问题答案: 在这种情况下,无法避免伪造的请求,因为客户端浏览器已经具有发出请求所需的一切;恶意用户只需进行一些调试即可弄清楚如何向您的后端发出任意请求,甚

  • 我们正在从Android应用程序进行大量上传。我们希望强制这些用户使用WiFi,而不要使用手机,这样我们就不会浪费用户的手机数据计划。 目前,我们正在使用ConnectionManager检查连接状态,并确保他们已连接到WiFi。这种方法似乎已经停止在Android 7上工作,因为有时即使连接了WiFi,操作系统也会决定通过手机发送请求。 在iOS上,我们可以使用allowscellaracces

  • 问题内容: 我有一个运行Elasticsearch的e2 ubuntu实例,尽管它在本地运行良好,但无法使用Windows PC进行连接(错误是“无法连接到远程服务器”)。 我已经在相同的ubuntu实例上设置了Apache,并在同一台Windows计算机上工作,并且我可以毫无问题地ping该实例。我的Amazon安全组允许tcp从所有IP地址访问所有端口。 我认为这是一个ES配置问题,尽管我添加

  • 目前有一个场景,其中共享服务中的一个方法由多个组件使用。此方法对endpoint进行HTTP调用,该endpoint将始终具有相同的响应,并返回一个可观察值。是否可以与所有订阅者共享第一个响应以防止重复HTTP请求? 以下是上述方案的简化版本:

  • 在Xcode8/Swift3.0中注册推送通知? 是否有方法在appdelegate和func应用程序(_application:UIApplication,didFinishLaunchingWithOptions LaunchOptions:[NSObject:AnyObject]?)之外请求requestAuthorization(选项:[.Badge,.Alert,.Sound])->布尔