首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保护快递/ gun.js服务器?

如何保护快递/ gun.js服务器?
EN

Stack Overflow用户
提问于 2022-01-15 03:50:08
回答 2查看 331关注 0票数 2

我该怎么保护这台枪服务器?我只想从一个域与多个子域的流量。

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

代码语言:javascript
复制
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'});
EN

回答 2

Stack Overflow用户

发布于 2022-01-15 06:17:19

步骤1-创建cors.js文件

代码语言:javascript
复制
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

代码语言:javascript
复制
const { corsWithOptions } = require('./cors');
...
app.use('/*', corsWithOptions, (req, res) => { res.sendStatus(200); })
app.use(Gun.serve);
app.use(express.static('/gun'));
票数 1
EN

Stack Overflow用户

发布于 2022-01-15 05:43:18

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

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

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

  1. Keep您的服务器在互联网上。使它只能在客户端所在的某个本地网络上访问。例如,我有一个raspberry Pi服务器,用于在我家运行一些家庭自动化任务,它位于我的家庭防火墙后面,只能从我的家庭网络(例如,不在互联网上)访问。对此服务器的任何访问(例如更改其配置)都是在家庭网络上完成的。因此,它不必受到随机互联网访问的保护。

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

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

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

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

所以,这意味着#3可能是最有意义的。如果这是一次性部署,则可以使用安全令牌手动配置每个客户端,并将这些令牌手动添加到服务器上的某些配置存储(如JSON文件)中。如果你想让更多其他游戏用户可以使用的更可伸缩的系统,那么你必须开发某种系统来注册合法的客户,给他们颁发凭证,并将这些凭证存储在客户端中。因为你的客户可能成对,需要“连接”,你将不得不在你的证书发放过程中烘焙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70718731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档