如何保护express/gun.js服务器



如何保护此枪服务器?我只想要来自一个域和许多子域的流量。

在我的用例中,我在iPad上为我的孩子们制作了一个游戏。当他们第一次玩游戏时,我意识到如果一些游戏控件可以移动到他们的手机上会更好。所以他们同时使用ipad和手机来控制游戏。它非常有效。数据通过枪在设备之间同步。然而,存在安全问题。任何人都可以使用我的枪支服务器在设备之间实时共享状态。我想将其限制在我的应用

const ARGS = process.argv.slice(2);
var fs = require('fs');
var protocol = ARGS[0];
var port = ARGS[1];
var express = require('express');
var cors = require('cors')
var Gun = require('gun');
require('gun/axe');
var app = express();
var allowedOrigins = [
'localhost:8080',
];
app.use(cors({
origin: function (origin, callback) {
// allow requests with no origin
// (like mobile apps or curl requests)
// if (!origin) return callback(null, true);
if (allowedOrigins.indexOf(origin) === -1) {
var msg = 'The CORS policy for this site does not ' +
'allow access from the specified Origin.';
return callback(new Error(msg), false);
}
return callback(null, true);
}
}));

app.use(Gun.serve);
app.use(express.static('/gun'));
server = require(protocol);
if (protocol == 'https') {
var privateKey = fs.readFileSync('../json-data.ssl/key.pem', 'utf8');
var certificate = fs.readFileSync('../json-data.ssl/cert.pem', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var server = server.createServer(credentials, app);
} else {
var server = server.createServer(app);
}
server.listen(port, () => {
console.log('listening on *:'.concat(port));
});
var gunDev = Gun({web: server, file: 'testingDB'});

步骤1-创建cors.js文件

const cors = require('cors');
const whitelist = ['localhost:8080'];
const corsOptions = (req, callback) => {
let options = {
origin: whitelist.includes(req.header('Origin') ? true : false;
}
callback(null, options);
};
exports.corsWithOptions = cors(corsOptions);

步骤2-导入并应用corsWithOptions

const { corsWithOptions } = require('./cors');
...
app.use('/*', corsWithOptions, (req, res) => { res.sendStatus(200); })
app.use(Gun.serve);
app.use(express.static('/gun'));

默认情况下,互联网上的web服务器对任何具有任何编程技能的人开放。

COR保护只适用于在网页中运行的Javascript。COR保护本身是在浏览器中实现的,当任何类型的代码在浏览器外运行时(任何简单的脚本(,根本没有COR保护。因此,COR实际上不适用于除浏览器之外的任何其他类型的客户端。

因此,为了保护您的服务器不被公众访问,您有以下各种选择:

  1. 让您的服务器远离互联网使其只能在客户端所在的某个本地网络上访问。例如,我有一台树莓派服务器,用于在我家执行一些家庭自动化任务,它位于我家防火墙后面,只能从我家网络访问(例如,不能在互联网上访问(。对该服务器的任何访问(例如更改其配置(都是从家庭网络上完成的。因此,它不必针对随机互联网访问进行保护。

  2. 限制只能访问某些客户端IP地址一般来说,这通常不太实用,因为任何类型的移动设备都可能定期更改其IP地址,而且也不完全安全。

  3. 连接到服务器时需要某种凭据这是使用的主要机制。根据客户端获取和输入凭据的方式,这可能是一个典型的最终用户帐户凭据,如用户名和密码,或者如果一切都是编程的,它可以是一个加密安全密钥。在任何一种情况下,客户端都会(由您的服务器(获得一个凭据,该凭据可用于在将来连接到您的服务器时进行身份验证。这将拒绝访问任何客户端或您尚未向其颁发凭据的任何类型的客户端。您的服务器在连接时将需要凭据,并拒绝任何未通过身份验证检查的请求。不用说,凭据只能通过https发送,以防止网络窥探者(如公共WiFi(窃取凭据。

对于您的特定游戏用途,只有当您将使用限制在家庭网络上,并要求两个设备都在家庭WiFi上,而不是在蜂窝网络上时,#1才有可能。

对于你使用的,#2可能是不可行的。

所以,这意味着#3可能是最有意义的。如果这是一次性部署,那么您可以手动为每个客户端配置一个安全令牌,并手动将这些令牌添加到服务器上的一些配置存储(如JSON文件(中。如果你试图制作一个更具可扩展性的系统,供许多其他游戏用户使用,那么你就必须开发某种系统来注册合法客户端,向他们颁发凭据,并将这些凭据存储在客户端中。由于你的客户可能是成对的;"连接";,你也必须把它融入到你的证书颁发过程中。

相关内容

  • 没有找到相关文章

最新更新