Javascript |了解回调函数的安全性

时间:2018-02-16 21:43:16

标签: javascript node.js socket.io

我需要帮助才能理解回调函数的安全性。我的情况是,我是一个客户端和服务器端代码,与socket.io连接。我的客户端正在使用socket.io向服务器发送一个对象,如果一切正常,回调必须回答。服务器调用方法,该方法返回true或false。如果为true,则服务器必须回答。

我来自客户的电话:

socket.emit('client.to.server', {id: objID}, () => {
    console.log('this is my callback')
})

Serverside socket.io事件:

socket.on('client.to.server', (dataObject, callback = null) => {
    let result = this.doSomething(dataObject, socket)
    if (result === true && (typeof callback === 'function')) callback()
})

所以,我的问题是:这是安全吗?我的意思是,客户端正在向服务器发送回调函数,服务器调用此函数服务器端,如果有人以某种方式操作此函数给我发一些污垢到服务器?我希望我能解释一下我的意思。

我知道我可以通过简单地从服务器发送到客户端来替换整个回调。 但更好的是什么?

2 个答案:

答案 0 :(得分:5)

  

客户端正在向服务器发送回调函数

你误解了它。回调函数根本不是 发送到服务器。流程实际上是这样的:

             client                                     server
 client sends data to server
socket.emit('client.to.server')
                       pushes to fifo queue[0]
                    ----------------------->
                                                server triggers listener
                                              socket.on('client.to.server')
                                               server sends data to client
                       pushes to fifo queue[1]
                    <-----------------------
  client triggers callback
() => console.log('this is my callback')

套接字是消息传递机制。您只能通过它们传递可序列化的对象(二进制数据)。

答案 1 :(得分:-2)

所以你基本上要做的是远程过程调用以及你这样做的方式根本不安全。您可以采用的最简单方法是定义一些在收到某种类型的标识符时调用的预定义函数。例如,来自客户的电话可以是:

来自客户的电话:

socket.emit('client.to.server', 
  {id: objID}, 
  "LOG_DATA", 
  ["data to be logged"]
})

Serverside socket.io事件:

function processType(type, params) {
  switch(type) {
    case LOG_DATA:
      console.log(params[0]); // u can also have predefined functions over here
    case ANOTHER_FUNCTION:
      anotherFunction(params[0], params[1]);
    default:
      doSomething(params);

  }
}
socket.on('client.to.server', (dataObject, type, params) => {
    let result = this.doSomething(dataObject, socket)
    if (result === true && type) processType(type, params)
})

如果您确实需要从客户端调用远程过程,那么您应该尝试在客户端加密数据,然后在服务器端解密,然后调用远程过程。这种方法将非常复杂,因为它需要某种密钥交换机制。但是,如果你想,我也可以进一步解释。