防止外部请求表达

时间:2015-07-25 12:00:05

标签: node.js security express

使用expressjs和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 "-" "-"

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

这可能会使某些节点或表达的应用程序崩溃,这些应用程序只期望请求URL(或者在express,originalUrl的情况下)类似于路径,因为express documentation和这些stackoverflow应答{{3} }和one暗示。

至于它返回200的原因,它将是特定于应用程序的。

考虑到这一点,重要的是不要假设请求网址或快递的请求originalUrl是一个路径并以' /'开头,当它不是时从' /'开始它甚至可能不包含正确的协议或域。

Express至少可以在v4中修复"修复"请求不以' /'开头的网址,但请求对象的originalUrl部分不会更改。在任何情况下,仍然不应该假设网址以' /'开头。

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

app.use(function(req, res, next) {
    if(req.url[0] !== '/' || req.originalUrl[0] !== '/') {
        res.status(404).send('');
    } else {
        next();
    }
});