我可以想到两种方法。
首先,从最初的测试来看,您似乎可以查询 remoteHost 和 remotePort。即使您使用主机,它们也会返回对您有用的值。如下所示。
其次,您可以将套接字设置为 ping Flash,以便每 5 分钟左右得到响应。有 ping 请求 localAddress、localPort、remoteAddress 和 remotePort。如果它们与您收到数据时的预期不符,请终止连接。
最重要的是,每当您收到数据时,都要在服务器端进行验证。让你的服务器知道玩家在做什么,以及什么是合理的。 Mos 多人游戏(这是我假设的),有效地在服务器上“运行”自己。因此,如果用户 A 确实设法绕过了您设置的安全性并说他想击中 5000 码外的目标并造成 150 万伤害,那么服务器已经知道:
在开发最终游戏时,此主题是最难管理的主题之一。虽然您可以与之抗争,并且大部分都赢了,但您永远不会阻止人们“模拟”服务器并在那里使用您的内容。但是,您应该能够阻止大多数注入到您的游戏中。
编辑:当人们开始反编译 SWF 并设法重新编译它时,您的问题才真正开始。然后,任何客户端验证都将被排除在外,因为它们将删除您已有的验证,并且您 100% 依赖于服务器端验证。这也可以通过内存编辑来实现,不过……一般来说,客户端验证只会阻止更基本的“黑客”。
package kazo
{
import flash.net.SharedObject;
import flash.net.Socket;
import flash.events.Event
import flash.events.ProgressEvent
import flash.events.SecurityErrorEvent
import flash.events.IOErrorEvent
/**
* ...
* @author KM
*/
public class TestCases
{
private var socket:Socket;
private const ADDRESS_LIST:Vector.<String> = {
'255.255.255.255',
'255.255.255.254'
}
private const PORT_LIST:Vector.<String> = {
'111',
'112'
}
public function TestCases() { }
/**
* Start the test case
*/
public function start():void {
trace('Starting test case');
socket = new Socket();
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onData);
socket.connect('example.domain.com', port);
}
/**
*
* @param e
*/
private function onConnect(e:Event):void {
trace(socket.remoteAddress);
trace(socket.remotePort);
// validate before doing anything
validateNow();
}
/**
*
* @param e
*/
private function onData(e:ProgressEvent):void {
trace(e.target);
// validate before processing data
validateNow();
}
/**
*
*/
private function validateNow():void {
var i:int = 0;
// List of allowed ports (MUST be hardcoded)
var portLen:int = PORT_LIST.length;
// List of addresses (MUST be hardcoded)
var addressLen:int = ADDRESS_LIST.length;
var addressPass:Boolean;
var portPass:Boolean;
// Loop through, make sure we're valid
for (i; i < portLen; i++) {
PORT_LIST[i] === socket.remotePort ? portPass = true : continue;
}
// Loop through, make sure we're valid
for (i = 0; i < addressLen; i++) {
ADDRESS_LIST[i] === socket.remoteAddress ? addressPass = true : continue;
}
// If we're not, close off. If we are, run the course
if (!addressPass || !portPass) {
socket.close();
// inform server
}
}
}
}