私人路线的正确方式是什么?

时间:2017-11-17 04:16:50

标签: node.js

我想了解以下安全方面:

如果我理解正确,在PHP中URL会直接路由到服务器上的特定文件。例如https://mypage.com/secretFunctions.php将转到secretFunctions.php。如果我通过基本身份验证保护此路由,则在文件处理并提供给客户端之前将进行身份验证。结果,只有经过身份验证的用户才能看到呈现的内容。

对于客户端node.js应用程序,整个App.js代码将发送到客户端并在那里进行处理。 URL始终指向同一文件。该文件中定义的路由确定将执行和呈现的代码段。即使我通过任何类型的身份验证保护任何特定路由,用户仍将获得整个代码。

有没有办法防止这种情况发生?为了防止客户端收到私有路由的私有代码,只要它们没有经过身份验证?

1 个答案:

答案 0 :(得分:4)

  

在node.js中,整个App.js代码被发送到客户端并在那里进行处理。

不,这根本不是它的工作方式。当您在服务器上运行node.js和代码时,代码不会转到客户端 - 永远。它只是在服务器上运行。客户端无法访问它。如果使用命令行node app.js运行node.js应用程序,则运行节点可执行引擎并在服务器上执行app.js.

在node.js服务器中,您通常不会定义专用路由,并且期望仅在没有客户端访问权限的服务器实现中使用它们。虽然可以完成(使用只有服务器知道的某种形式的授权令牌),但您通常不会在公共服务器上使用私有路由。相反,您只需将相关代码放在函数中并直接调用该函数,而不是自己请求私有路径。然后,它完全是私有的服务器实现。

然后,app.js将启动一个http服务器进程并定义它希望该服务器处理的路由。当客户端出现并从服务器请求路由时,app.js代码(或其加载的其他模块)将解析所请求的路由,将其映射到该路由的已定义处理程序并仅执行node.js代码应该处理该路线。当它完成处理该路线时,它将发送响应。根据请求的类型,该响应可能是浏览器将解析和显示的网页,也可能是请求结果的JSON,也可能是任意数量的其他数据类型。 / p>

发送到客户端的唯一代码是嵌入在网页中的Javascript代码,专门用于在浏览器中运行。那不是node.js代码,也不是你的服务器代码。这就像浏览器Javascript就像任何后端框架一样(node.js与这方面的任何其他框架都没有区别)。

  

有没有办法防止这种情况发生?为了防止客户端收到私有路由的私有代码,只要它们没有经过身份验证?

这部分问题大多只是被误导,因为它似乎是基于对node.js后端应用服务器如何工作的误解。您可以通过不首先将代码发送到客户端来防止代码进入客户端。客户端无法从您的服务器中看到任何您没有专门处理和发送响应的路由。默认情况下,node.js Web服务器将NOTHING发送到客户端。默认情况下不发送任何页面。因此,唯一发送给客户端的是您专门编写代码以发送的响应。请注意,这与其他后端(如Apache)不同,后端可以配置为自动发送大量请求的内容。

  

如果我理解正确,在PHP中URL会直接路由到服务器上的特定文件。例如https://mypage.com/secretFunctions.php将路由到secretFunctions.php。

那就是PHP。这不是node.js Web服务器的工作方式。要使路由https://mypage.com/secretFunctions.php完全响应客户端,您必须在服务器代码中定义一个路由,该路由经过专门编码以响应请求/secretFunctions.php,然后您定义了什么代码应该在收到请求时在服务器上运行。除非您在此路由处理程序中专门编写代码以将代码发送到要在浏览器中运行的客户端,否则不会向客户端发送代码。

让我向您展示一个非常简单的node.js应用程序,它响应三条路线(并且只有三条路线)。我要说这是app.js

const app = require('express')();

app.get('/', function(req, res) {
    res.send("Hello");
});

app.get('/name', function(req, res) {
    res.send("My name is Bob");
});

app.get('/city', function(req, res) {
    res.send("I am in San Francisco");
});

// start the server
app.listen(80);

使用node app.js启动此服务器。当它运行app.js时,它初始化快速框架的一个实例,注册三个路由处理程序,然后启动Web服务器。

现在,您有一个正在运行的Web服务器。假设您在同一台服务器上运行了一个Web浏览器,并在URL栏中键入:http://localhost。这将触发'/'路由处理程序并显示" Hello"在浏览器中。

然后,在浏览器中输入http://localhost/name。那将显示"我的名字是Bob"在浏览器中。

如果您键入此处定义的除此之外的任何其他路线,则不会向浏览器发送任何内容。如果contacts.html文件位于同一目录中,则无关紧要。如果没有特定的编码路由来处理请求,则不发送任何内容。因此,默认情况下不会发送任何私有代码。

现在,有一些方法可以指示您的服务器自动发送一些静态文件,但这需要一种特殊的路由,告诉您要查找的路由前缀以及服务器上的哪个目录可以查找可能匹配的文件请求的网址。这可以针对您特定位于目录中的静态文件(例如.css文件)进行,您希望在请求时将其发送到客户端。并且,您必须使用正确的代码来实现这一目标。默认情况下永远不会发生。

相关问题