我正在开发一个使用socket.io的实时网络应用程序。我担心的是,在客户端通过此<script>/socket.io/socket.io.js</script>
加载socket.io js文件时,它会将io实例公开为全局对象。现在,如果您打开chrome开发人员工具,现在可以使用
var socket = io.connect();
任何人现在都可以发出事件并将恶意数据发送到正在侦听客户端的服务器 发出的事件。我在我的客户端代码中有这个例子:
(function (sio) {
var socket = sio.connect();
// some code here...
// once a user submitted the comment, it will emit an comment:create event to the
// server
socket.emit("comment:create", comment);
}(io));
在chrome开发人员工具中,我可以创建一个连接然后使用一些恶意参数发出相同的事件,这可能会导致我的应用程序崩溃,就像传递null作为第二个参数一样。有没有办法防止这样的问题?
编辑:我当前的解决方案是在我的客户端代码中创建io
实例的本地副本,然后将全局io
对象设置为null以防止建立另一个连接。
答案 0 :(得分:1)
当客户端进行初始(HTTP)连接并将其存储为会话变量时,让服务器端代码创建某种(相当随机的)令牌。要求客户端将令牌作为其发送的每条socket.io
消息的一部分包含在内,并拒绝任何不匹配的消息。