Socket.io,安全和多人游戏

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

游戏的当前状态

我所有的

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

是安全的。 玩家可以发出任何请求(请求在这个例子中是指'请求')与任何数据(指数据),他们将不能利用它,即使他们手动修改他们发出的请求和数据并绕过客户端的基本安全。 他们也不能通过发送无效数据来使服务器崩溃。

注:我只有2发射:发射用户/通过login和发射input。 服务器虽然通过各种“发射”发送数据。 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'); 

最后是路由?,我显示相同的页面,不pipe请求:

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

关注:

  • 有人能通过其他方式访问我的数据库,而不是发射注入?
  • 有人可以修改每个人加载的静态资源吗?
  • 有人可以访问整个服务器脚本或修改其variables吗?
  • 有没有办法限制同时发送的最大并发连接数和最大数据量?
  • 我是否需要任何安全模块?
  • 任何其他您认为适合的问题。

非常感谢。

关于你现在有什么 – 一切看起来都很好。 除此之外,您不使用消息名称,但将所有内容修改为request消息。 不要以为这是好的方法,我可以看到背后没有安全的理由。 您还可以订阅和取消订阅不同的套接字消息 – 更容易pipe理请求点的“可见性”。

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

技术
它涉及您的服务器,数据库凭据,防火墙,文件权限,域名和其他位的设置,这些不是直接来自应用程序本身。
您在这里担心的是确保访问服务器并不容易,修改文件更加复杂。 虽然在任何情况下总会有风险,甚至是最受保护的。
可靠的托pipe服务(这里的云是最安全的地方)。
访问凭据到服务器 – 也必须得到保护。 即使有人会得到这些,仍然需要一些时间来进入你的服务和数据库。 有能力抵制这个(防火墙,FTP / SSH设置等)。

合乎逻辑
这个关于安全性的观点主要集中在你的应用程序逻辑和以某种方式克服它的能力上。
这是一个很大的话题,你可能想要一般性地阅读一些关于这方面的书籍。
最简单的事情是关于你的架构的一些通用规则。 例如:

  • 只有服务器做决定 。 游戏尤其如此。
  • 不要相信客户的决定。 作为信任 – 导致作弊。 对于服务器来说,这是更多的工作,但是为了防止作弊,后面的工作要less一些。 所以,尽早开始“询问客户”和“决定服务器”之间正确的“政治”互动。
  • validation一切 ,并在服务器出现非常错误时抛出错误/断开连接。
  • logging但仔细(不写入文件的一切 – 这可能会导致安全问题,特别是如果您使用一些基于html的日志系统,可以通过HTTP请求注入JS – 是潜在的危险。
  • 在服务器端没有评价。
  • 密码哈希 – 密码和其他东西。 保持你的“盐”和“香料”:D。 这样即使闯入你的数据库,也不会让任何人轻易地访问密码。
  • 使用会话来存储数据。 会话将在未来帮助您横向扩展您的应用程序,因为限制到一个进程和存储内存中的东西 – 是有效的,但不可扩展。
  • 身份validation – 使用可靠的方法,可能是SSL(WSS,HTTPS)。
  • 知道你使用什么 – 这有助于尽可能地防止模块的意外行为。
  • 知道它是如何工作的 – 例如会话 – 你需要知道识别机制如何工作(cookies等),以及如何存储会话数据(内存,数据库,Redis等)