如何从服务器validation客户端代码是否未被修改

我有一个java服务器通过json-rpc与java客户端通信。 客户端应该向服务器报告内部统计信息,从而修改服务器行为。 客户端和服务器的主要内容都是内部编写的,因此我可以控制客户端的操作以及报告统计信息的方式,但有没有办法可以validation客户端代码是否未被修改? 如果有,它仍将为客户端提供服务,但使用一些默认行为。

客户端将公开发布,因此对于有人反编译并改变行为并不是什么大不了的事。

简单地让客户端发送代码的签名没有好处,因为可以通过将客户端的原始副本与修改后的副本一起保存来轻易欺骗。

你不能。 您基本上无法知道客户端上运行的代码,并且您的程序逻辑都不应该依赖于将客户端视为“受信任”。 所有访问控制,validation等都应在服务器上(或在两个地方)完成。

某些专业环境(例如智能卡上嵌入的代码,或游戏控制台等设备只能运行签名代码的设备)可以为您提供更多的保证,因为逆向工程的难度增加/获得适当的控制权设备。 但即使这些也不是绝对正确的(看看iPhone或任何控制台,看看设备被“破解”需要多长时间,而这样做是为了让您了解安全级别)。

您无法validation客户端未使用客户端 – 服务器体系结构进行修改。

除非经过身份validation的用户(登录名+密码匹配)通过安全连接(例如SSL)与您通信,否则您永远不应该信任来自客户端的输入。

客户端必须只调用逻辑而不是将其发送到服务器。

首先想到的是客户端发送签名文件(在代码内)和自身的哈希值。

但是,就像你说的那样,它可能是欺骗性的。

如果你试图依靠客户端的真实性在服务器上做东西: 不要! 重新思考你的逻辑。 如果这只是一个额外的安全措施(配合它)。