如果我使用nodejs的http模块来创建一个简单的http服务器,那么我需要做多少验证/检查?nodejs作为http服务器有多健壮?
该模块是否处理安全问题,如恶意请求和具有恶意标头值的请求?模块是否确保所有内容遵循http规范,还是必须进行大量检查以确保我的服务器不易崩溃?
编辑:假设nodejs没有做任何真正的验证,我敢肯定的是这种情况。我需要做些什么来确保我的服务器不易被破坏?
如果我使用nodejs的http模块来创建一个简单的http服务器,那么我需要做多少验证/检查?nodejs作为http服务器有多健壮?
该模块是否处理安全问题,如恶意请求和具有恶意标头值的请求?模块是否确保所有内容遵循http规范,还是必须进行大量检查以确保我的服务器不易崩溃?
编辑:假设nodejs没有做任何真正的验证,我敢肯定的是这种情况。我需要做些什么来确保我的服务器不易被破坏?
什么是恶意标头值?节点是低层次的,所以很多东西都没有被检查。但你必须看看那些东西。但它不像有人可以发送“执行0xFA894224”什么的。它可能具有的唯一孔之类的东西,允许恶意请求(例如,也许你可能会得到request.location: "\*\*\* CHINAAA \*\*\*"
,忘记发动套接字关闭事件,或抛出一个JavaScript错误,并优雅地终止。
您可以随时检查自己对这些或者使用try catch块,process.on等等。当然,这并不是说可能没有缓冲区溢出或某处存在某种东西,但是不太可能考虑节点构建在v8之上,并且许多库纯JavaScript
编辑: 如何阻止随机崩溃:
process.on('uncaughtException',function() {
/* ignore error */
});
此外,虽然这会阻止99%的随机崩溃,但99%的随机崩溃是由JavaScript造成的,而不是由节点造成的。例如,你可能会做obj [request.location] = request.headers,如果某人设法以某种方式泄漏'\ _ \ _ proto \ _ \ _',可能会崩溃。 但是,这只是一般的JavaScript考虑因素。 –
为了记录'/ *忽略错误* /'是一个非常愚蠢的想法。如果你实现它,请用一些明智的错误处理来代替它。 – Raynos
NodeJS没有被用作面向世界的HTTP服务器。但是,HTTP功能可以用来将请求代理到适当的Web服务器。
偏离主题,但Nginx真的擅长这样做,因为它拥有稳定的线程数量。
因此,使用nodejs服务器直接服务POST和GET请求通常是个坏主意? – shelman
我听说的最常见的设置是使用Nginx作为一个或多个node.js实例的网关。我认为说它“没有成为......”,当它没有完成时是不正确的。对我来说,这个项目的开发者似乎正在面向一个面向Web的应用服务器。 –
节点可以启动更多节点进程,使用nginx并不有用。 –
[http module source](https://github.com/joyent/node/blob/master/lib/http.js) – Raynos
@Raynos:它看起来好像根本没有任何验证,只是将请求解析为标题和正文。你同意吗? – shelman
我对HTTP服务器安全/漏洞或黑客手段一无所知。所以我不能评论它应该验证什么。 – Raynos