如果没有为发布请求中的“数据”事件创build事件处理程序,会发生什么情况?

如果你看这个问题的Casey Chu(回答Nov30'10)的答案: 你如何提取Node.js中的POST数据?

您将看到他正在响应“数据”事件,构build请求的主体。 在这里重现代码:

var qs = require('querystring'); function (request, response) { if (request.method == 'POST') { var body = ''; request.on('data', function (data) { body += data; // Too much POST data, kill the connection! if (body.length > 1e6) request.connection.destroy(); }); request.on('end', function () { var post = qs.parse(body); // use post['blah'], etc. }); } } 

假设我不关心POST请求,因此从不检查请求是POST还是创build“数据”事件处理程序,有没有可能通过发送非常大的请求来阻止我的线程? 例如,而不是上面的代码,如果我只是做了:

 function hearStory(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Cool story bro!"); response.end(); } 

那么真的很大的POST请求会发生什么? 服务器是否忽略了身体? 这种方法有没有风险? 获取请求,包括他们的头文件必须小于80kB,所以它看起来像一个简单的方法,以避免泛滥我的服务器。

希望这些types的攻击可以通过防火墙或其他方式进入服务器之前检测和避免。 你不应该处理服务器本身的DOS攻击。 但是,如果他们以恶意的意图进入服务器,则需要有一种方法来处理它。 如果你打算处理POST请求,你所指的代码将会有所帮助。

你可以,如果你只是想一起避免POST请求,而不是听他们,如第二个代码片段所示,做下面的事情。

 function denyPost(req, res) { if (request.method == 'POST') { console.log('POST denied...'); // this is optional. request.connection.destroy(); // this kills the connection. } } 

当然,如果你打算以某种方式处理post请求,这是行不通的。 但是,DOS攻击再次需要在到达服务器之前进行处理。 如果他们已经到了那里,他们已经赢了。