2016-11-21 74 views
1

我目前正在使用socket.ioNodeJS来控制别的东西。这是我的代码到目前为止:Socket.io - 不允许客户端使用main.js文件查看文件

var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var fs = require('fs'); 

var contents = fs.readFileSync("data.json"); 
var remoteLayout = JSON.parse(contents); 

app.get('/', function(req, res) { 
    res.sendFile(__dirname + '/index.html'); 

}); 

app.get('/edit', function(req, res) { 
    res.sendFile(__dirname + '/edit.html'); 

}); 

app.use(express.static(__dirname)); 

io.on('connection', function(socket) { 
    console.log('a user connected'); 

    socket.on('disconnect', function() { 
     console.log('user disconnected'); 
    }); 

}); 


http.listen(8080, function() { 
    console.log('listening on *:8080'); 
}); 

这是我的代码缩短到相关的部分。

所以我的问题是,当我在节点运行这段代码,我打开[myIPAddress]:8080页它开辟了index.html像它应该在Chrome浏览器上,它说[myIPAddress]:8080。现在,如果我进入显示顶部网页网址的栏,然后将其更改为[myIPAddress]:8080/handler.js,它会打开一个页面,并在其上打印出我的js脚本。我该怎么做才能让这个人不能去[myIPAddress]:8080/handler.js页面?

我不确定它是否重要,但文件夹main.js也有index.html,edit.htmlhandler.js

+0

当为.js文件提出请求并正确处理响应时,您必须检查referer头。当然,使用开发者工具,任何人都可以看到js加载在页面中,所以,为什么要试图隐藏js代码 - 你不能使它看不见 –

+0

所以我必须检查每个文件?此外,我对此很陌生,那么如何检查引用标头 - 是否是'app.get(...)'?我意识到,开发人员工具允许观众查看代码无论如何,但这更多是为了我的好奇心... –

+0

我会认为你在app.get中使用正则表达式进行检查以捕获以''结尾的文件。 js'作为第一个参数 - 但是,这只是一个猜测 –

回答

0

问题是这样的:

app.use(express.static(__dirname)); 

当你这样做,你已经暴露了__dirname目录中的所有文件,任何人都可以看到包括位于该目录服务器的文件。相反,你应该将你的,你打算让公众有一些其他目录的访问静态文件,然后使用:

app.use(express.static(someOtherPath)); 

这将保持在__dirname您的服务器上的文件私人和只露出你想让你的文件公开你已经找到了一些其他路径。


如果handler.js实际上是用于在Web页中使用,因此必须提供给浏览器,那么你不能阻止任何人看它。如果你的网页需要使用它,那么浏览器必须能够下载它,如果浏览器必须能够下载它,那么你不能阻止一个人看到它。你可以做各种各样的事情,比如模糊它,使其对于一个人来说变得不那么容易理解,但对于任何确定的黑客来说,逻辑将仍然存在,并且你无法隐藏任何旨在在浏览器中运行的Javascript。

您要保护的逻辑必须只在您的服务器上,也许可以通过Ajax调用使用。您无法保留必须在浏览器中运行的密码。