我如何保護這個槍支服務器?我只想要來自一個具有許多子域的域的流量。
在我的用例中,我在 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'});
uj5u.com熱心網友回復:
默認情況下,互聯網上的 Web 服務器對任何具有任何編程技能的人開放。
CORs 保護僅適用于在網頁中運行的 Javascript。CORs 保護本身是在瀏覽器中實作的,當任何型別的代碼在瀏覽器外部運行時(任何簡單腳本),根本沒有 CORs 保護。因此,CORs 確實不適用于除瀏覽器之外的任何其他型別的客戶端。
因此,為了保護您的服務器免受公眾訪問,您有以下各種選擇:
讓您的服務器遠離互聯網。使其只能在客戶端所在的某個本地網路上訪問。例如,我有一個樹莓派服務器,用于在我家運行的一些家庭自動化任務,它位于我的家庭防火墻后面,只能從我的家庭網路訪問(例如,不能在互聯網上)。對該服務器的任何訪問(例如更改其配置)都是在家庭網路上完成的。因此,它不必防止隨機互聯網訪問。
僅限制對某些客戶端 IP 地址的訪問。 一般來說,這通常不太實用,因為任何型別的移動設備都可能會定期更改其 IP 地址,而且也不完全安全。
連接到服務器時需要某種憑據。 這是使用的主要機制。根據客戶端獲取和輸入憑據的方式,這可能是典型的最終用戶帳戶憑據,例如用戶名和密碼,或者如果一切都是程式化的,它可以是加密安全密鑰。在任何一種情況下,客戶端都會(由您的服務器)頒發一個憑據,然后可以使用該憑據對將來與您的服務器的連接進行身份驗證。這將拒絕訪問您尚未向其頒發憑據的任何客戶端或任何型別。您的服務器將在連接時需要憑據并拒絕任何未通過身份驗證檢查的請求。不言而喻,憑證只能通過 https 發送,以防止網路窺探者(如公共 WiFi)竊取憑證。
對于您的特定游戲用途??,僅當您限制使用家庭網路并要求兩個設備都在家庭 WiFi 上而不是蜂窩網路上時,#1 才有可能。
對于您的使用,#2 可能是不可行的。
所以,這意味著#3 可能是最有意義的。如果這是一次性部署,那么您可以使用安全令牌手動配置每個客戶端,并將這些令牌手動添加到服務器上的某些配置存盤(如 JSON 檔案)中。如果您正在嘗試創建一個可擴展性更高的系統,許多其他游戲用戶可以使用,那么您將必須開發某種系統來注冊合法客戶端、向它們頒發憑據并將這些憑據存盤在客戶端中。由于您的客戶可能成對出現,需要“連接”,因此您也必須將其納入您的證書頒發程序。
uj5u.com熱心網友回復:
第 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'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411361.html
標籤:
