1

我目前正在制作一个在线游戏,我想知道 Node.js 和 socket.io 的安全性。

游戏现状

我所有的

io.sockets.on('connection', function (socket) {
    socket.on('request', function (data) {
}) });

是安全的。玩家可以使用任何数据(指“数据”)发出任何请求(在此示例中请求指“请求”),即使他们手动修改他们发出的请求和数据,他们也无法利用它并绕过客户端基本安全。他们也无法通过发送无效数据使服务器崩溃。

注意:我只有 2 个发射:发射用户/通行证以登录和发射输入。服务器通过各种“发射”发送数据。session() 或 GET/POST 没有“通常”的概念。在客户端,我专门使用

 var socket = io.connect('http://something:3000');
 socket.emit('request', data);

对于玩家需要获取代码+图像的静态资源,它看起来像:

 app.use(express.static(__dirname + '/public'));

对于数据库:

 client = mysql.createConnection({  host: 'localhost',  user: 'root',   password: 'something',});
 client.connect(); client.query('USE dbname'); 

最后是路由?,无论请求如何,我都会显示相同的页面:

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

关注点:

  • 有人可以通过注入以外的其他方式访问我的数据库吗?
  • 有人可以修改每个人加载的静态资源吗?
  • 有人可以访问整个服务器脚本或以某种方式修改其变量吗?
  • 有没有办法限制最大并发连接和一次发送的最大数据量?
  • 我需要任何安全模块吗?
  • 您认为适当的任何其他问题。

非常感谢。

4

1 回答 1

7

关于你现在所拥有的——一切看起来都很好。除此之外,您不使用消息名称,而是将所有内容都修补到request消息中。不要认为这是好方法,而且我看不出这种决定背后的安全原因。您还可以订阅和取消订阅不同的套接字消息 - 更容易管理请求点的“可见性”。

有两种方法可以查看应用程序的安全性:

技术
它与您的服务器设置、数据库凭据、防火墙、文件权限、域名和其他位相关,这些不直接来自应用程序本身。
您在这里关心的是确保访问服务器并不容易,并且修改文件更加复杂。尽管在任何情况下总是存在风险,即使是最受保护的。
可靠的托管服务(这里的云是最安全的恕我直言)。
访问服务器的凭据 - 也必须得到保护。即使有人会得到这些,仍然需要他们一些时间才能进入您的服务和数据库。有能力抵抗这种情况(防火墙、ftp/ssh 设置等)。

逻辑
这种关于您的安全性的观点特别关注您的应用程序逻辑和以某种方式克服它的能力。
这是一个很大的话题,你可能想读一些关于这个的书。
要考虑的最简单的事情是一些关于架构方式的通用规则。例如:

  • 只有服务器做出决定。对于游戏来说尤其如此。
  • 根本不要相信客户的决定。作为信任 - 导致作弊。服务器的工作量更大,但为了防止作弊,它的工作量就更少了。因此,尽早从“询问客户”和“决定服务器”之间的正确“政治”互动开始。
  • 验证一切,并在服务器出现非常错误时抛出错误/断开连接。
  • 记录但要小心(不要将所有内容都写入文件 - 这可能会导致安全问题,特别是如果您使用一些基于 html 的日志系统,则可以通过 http 请求注入 JS - 是潜在的危险。
  • 从来没有eval在服务器端。
  • 密码散列- 用于密码和其他东西。还要保护好你的“盐”和“香料”:D。因此,即使闯入您的数据库,也不会允许任何人轻松访问密码。
  • 使用会话存储数据。会话将帮助您在未来水平扩展您的应用程序,因为限制为一个进程并将内容存储在内存中 - 是高效的,但不可扩展。
  • 身份验证- 使用可靠的方法,可能是 SSL(WSS、HTTPS)。
  • 知道你使用什么——这有助于尽可能地防止模块的意外行为。
  • 知道它是如何工作的——例如会话——你需要知道识别机制是如何工作的(cookies等),以及会话数据是如何存储的(内存中、db、redis等)
于 2013-07-15T15:04:59.417 回答