我目前正在使用html5 canvas和websockets构建一个游戏网页.我有一个在服务器上运行的perl编写的websocket服务器:3000.在服务器上,我也安装了apache,并创建了一个用户可以访问的网站:
http://server/.该页面上的javascript创建一个websocket到ws:// server:3000
连接工作,我可以从我的浏览器发送消息并获取响应,所有显示在一个div现在.我发送的消息现在只是“message:…”,所以服务器知道它是一条消息,并向当前连接到“游戏”的所有用户输出“…”.
现在的问题是任何人都可以编写自己的客户端,连接到ws:// server:3000并发送/接收相应的消息.这样他们会使用我的后端,但不是我的客户端(我希望他们只能从http://server/播放).
如何确保只有我的客户端被使用?主要关注的是作弊.您可以编写一个连接到端口的机器人,并通过发送消息并对其收到的消息进行播放…如何克服这个问题?
解决方法
我正在使用Jetty网络服务器.
我正在使用基本授权.我最初使用这个,因为它很容易实现.但是,在发现Websockets提出的授权问题后,我认为基本授权是一个很好的机制.
升级请求标头中的授权数据散列在其中:
Accept-Encoding:gzip,deflate,sdch Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 Authorization:Basic YWRtaW46cm9vdA== Cache-Control:no-cache Connection:Upgrade
在我的websocket服务器中,每个OnMessage事件我调用:
session.getUpgradeRequest().getUserPrincipal()
然后,我可以使用此信息来决定数据是否被授权进行处理.另外,我在OnConnect事件中检查套接字的原点:
session.getUpgradeRequest().getOrigin()