我有一个通过json-rpc与java客户端通信的java服务器。客户端应该向服务器报告内部统计信息,从而修改服务器行为。客户端和服务器的权限都是内部编写的,因此我可以控制客户端执行的操作以及报告统计信息的方式,但有没有办法可以验证客户端代码是否未被修改?如果有,它仍将为客户端提供服务,但使用一些默认行为。
客户将公开发布,因此对某人进行反编译并改变行为并不是什么大不了的事。
只是让客户端发送代码签名没有好处,因为通过将客户端的原始副本与修改后的副本一起保存可能很容易被欺骗。
答案 0 :(得分:4)
你做不到。您基本上无法知道客户端上运行的代码,并且您的程序逻辑都不应该依赖于将客户端视为“受信任”。所有访问控制,验证等都应在服务器上(或在两个地方)完成。
某些专业环境(例如嵌入在智能卡上的代码,或游戏控制台等设备只能运行签名代码的设备)可以为您提供更多保证,因为逆向工程的难度增加/获得适当的控制设备。但即使这些也不是绝对可靠的(看看iPhone或任何控制台,看看这些设备被“破解”需要多长时间,而这样做是为了让您了解安全级别。) p>
答案 1 :(得分:0)
您无法验证是否未使用客户端 - 服务器体系结构修改客户端。
除非经过身份验证的用户(登录名+密码匹配)通过安全连接(例如SSL)与您通信,否则您永远不应该信任来自客户端的输入。
客户端必须只调用逻辑而不是将其发送到服务器。
答案 2 :(得分:0)
首先想到的是客户端发送签名文件(在代码中)和自身的哈希值。
但是,就像你说的那样,它可能会被欺骗。
如果您正在尝试依靠客户端的真实性来在服务器上执行操作:不要!重新思考逻辑。如果这只是一个额外的安全措施(配合它)。