我有一个linux盒子,刚安装了nodejs。我看到的很多例子只是做了一个特定的功能,但没有看到他们“保护”nodejs服务器的任何地方?例如对于php我会使用会话来保护我网站的某个区域。 nodejs是否正常?是否需要在nodejs中使用其他设置或代码才能确保只有合适的人才能访问它?或者“开箱即用”是对的吗?
答案 0 :(得分:26)
Node.js本身不是一个Web服务器。它是一个用Javascript编程的异步事件引擎。 :)
PHP不会为它生成的输出提供服务。此任务留给Apache或IIS等Web服务器。 PHP附带一个会话管理模块(通过超全局$ _SESSION变量公开),而Node.js附带一个Web服务器模块(“http”)。
Node.js允许您在一个环境中执行这两个操作,因为它允许您和您的程序自己实例化Web服务器。这使得将功能作为普通的旧HTTP(s)Web服务器公开,非常容易,而使用PHP,您的环境受到Web服务器配置的限制。
事实上,将'http'模块更像是一种多变的HTTP协议实现方式。如果你需要一个“真正的”Web服务器,像express这样的项目将更适合你,因为它带有像Apache这样的Web服务器提供的功能。
顺便提一下,快递框架已经提供了session support。
所以,要真正回答你的问题:是的,Node.js是可以的,因为它本身不是一个Web服务器。拉入模块时,必须考虑其设置。您可以完全控制“用户代理体验”。
答案 1 :(得分:12)
Node本质上只是一个Web服务器。它不知道谁是“正确的人”访问它,默认情况下会向任何和所有人提出请求。
如果您需要特定的访问控制机制,您自己有责任自行实施。
答案 2 :(得分:6)
我注意到http.createServer的示例是不安全的,如果你没有将路径限定为允许的话。例如:我能够用curl获取http://localhost/../../../../../etc/passwd。
我通过不允许提供任何不在当前目录中的文件来解决问题。
var filename = path.normalize( path.join(process.cwd(), uri) );
if (filename.indexOf(__dirname) == 0 ) {
path.exists(filename, function(exists) {
答案 3 :(得分:5)
Node.js就是您的服务器端javascript将从您创建的模块运行的环境。它为您提供了许多内置库/模块,如http / https。安全,身份验证和授权方面的任何事情都必须由您编写或使用开源模块合并。如果您正在编写Web应用程序,请查看Express作为您的框架,并使用其会话功能来帮助构建。
关于从基础架构角度保护服务器,您可以将其置于NGiNX等反向代理之后,并使用防火墙仅根据您的需要打开NGiNX端口80或443。这通常很方便,因为您将运行多个Node实例以匹配您的CPU核心数,反向代理可以在这些实例之间循环,同时允许您保持端口关闭。
答案 4 :(得分:3)
Express支持会话,但我读过一些文章,建议不要使用session if 性能因为它分配内存。我使用sessionStorage来保存客户端的用户名和密码。问题是黑客可以通过控制台访问,所以我找到一些密码解密javascript库,如sjcl(http://crypto.stanford.edu/sjcl/)。但是之后 另一个问题仍然是sjcl函数可以在控制台中访问。所以我所做的就是重写 用户在线时的功能。
#offline - sjcl can access in console
#online - override the sjcl to prevent access in console
window.sjcl = -> "back-off hacker!"
我所做的是在通过sessionStorage重新加载时将用户名和密码发送到服务器,以便它会检查并回复正确的页面(离线或在线)。
但当然这种安全性仅适用于普通网站,不建议某些银行或政府使用。我希望你明白这一点...... ^ _ ^
PS。我正在使用angularjs和express.io