2011-06-27 15 views
2

我有一个java服务器通过json-rpc与java客户端进行通信。客户端应该向修改服务器行为的服务器报告内部统计信息。客户端和服务器端都是内部编写的,所以我可以控制客户端的功能以及它如何报告统计信息,但有没有办法可以验证客户端代码是否未被修改?如果有,它仍然会服务客户端,但使用一些默认行为。如何从服务器验证客户端代码没有被修改

客户端将公开提供,所以对反编译和改变行为的人来说没什么大不了的。

只需让客户端发送代码的签名就不好,因为通过将客户端的原始副本与修改后的副本保持一致,可能很容易被欺骗。

+1

我不认为你可以。想象一下,你有这样一个声称的网络消息,你会接受为有效的。你怎么能把它与其他客户播放的录音区分开来? –

回答

4

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

某些专业环境(例如,嵌入在智能卡上的代码或诸如游戏控制台的设备,其操作系统仅用于运行签名代码)给了您更多的保证,因为逆向工程/获取难度增加对设备进行适当的控制。但即使这些也不是无懈可击的(看看iPhone或任何控制台,看看这些设备需要多长时间才能被“破解”),而不是这样做,以便让您了解安全级别。

0

您无法验证客户端是否未通过客户端 - 服务器架构进行修改。

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

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

+2

不过要小心。 “能够通过SSL发送正确的登录信息”并不意味着“正在使用我认为正在使用的代码发送该登录信息”。 –

0

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

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

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

相关问题