在客户端 - 服务器应用程序中,服务器如何知道请求来自真正的应用程序而不是来自篡改的副本? 我还没有开发客户端和服务器应用程序。解决方案可能是普通套接字,wcf,IIS托管或其他。
答案 0 :(得分:7)
真的没有办法。任何你可以要求应用程序提供的东西,一个流氓应用程序可能会欺骗。最终答案是您不应该信任任何客户端应用程序。您可以信任用户,只要他们已经过身份验证,但客户端本身就是100%不值得信任的。
为了完整地说明这一点,我可以通过代理服务器运行所有流量,并随意注入/删除消息。然后你有一个合法的客户端带有虚假消息。
现在,如果您正在谈论计划在客户端上使用的库,确保它没有被篡改,那就是强命名程序集的用途。但那对你来说无济于事。
答案 1 :(得分:4)
您不能“保证”您使用的是真正的客户端。计算机中确实没有“秘密”;只有更难以发现的事实。有些事情可能使您的客户更有可能成为真正的交易:
认证。数字签名,内部哈希和用户提供的数据都使得您正在与之交谈的内容更有可能是您认为正在与之交谈的内容。但是,程序可能会被使用客户端程序集作为木偶的恶意软件劫持。即使您的代码没有可公开访问的钩子,一个恶意软件或获取使用SkipVerification运行权限的黑客也可以反映到您的程序集中并调用私有成员。
安全监控。您创建的客户端可以定期向Windows询问当前哪些内存挂钩到其代码中。如果有人正在倾听您的客户端或使用它,您的客户端无法识别或服务器已识别为敌对,则客户端可能会崩溃并烧毁,并且服务器知道该客户端已被盗用。这通常很难解决,但是安全程序的知识可以通过快速工作来避免安全“巡逻”,或者通过劫持客户端挂钩到Windows来询问可疑活动来帮助破坏它。
行为监控。如果客户端开始发送没有意义的消息,或者不按预期发送“仍然在这里,仍然是理智的”消息,服务器可以检测到客户端有问题并对其进行处理可疑,要么完全忽略它,要么限制敏感数据。同样,知道客户端应该发送什么,或者在客户端上捎带,可以让攻击者欺骗预期的行为。
答案 2 :(得分:2)
许多公司通过在每端部署数字证书(称为相互或双向身份验证)来确保客户端和服务器之间存在信任通道。实际上不可能监视或欺骗已启用相互身份验证的应用之间的任何通信。
当然,这只能保护频道,但不能保护客户端应用本身。确保客户端完全防篡改的唯一方法是使用实现物理安全控制来保护正在运行的应用程序(即ATM和POS机)。
答案 3 :(得分:1)
我同意Hounshell的评论,因为网上的所有数据都应视为不受信任。但是,您可以采取一些措施来增加所需攻击的复杂性,并防止轻易篡改客户端,例如建议使用强名称。 Authenticode证书还可以提供防止篡改代码的保护,并确保来自特定来源的软件是真实的。
您还可以在客户端和服务器之间实现身份验证,其中身份验证基于用户只知道的数据(不写入代码)。这避免了篡改客户端的有用性,因为如果没有必要的凭据来验证服务器,攻击者就无法真正实现这一点。要完成攻击,他们需要拦截传输中的数据,或者在用户计算机上安装一些东西(无论如何它都是游戏)。
要保护传输中的数据免受数据侦听(中间人)攻击,您需要加密数据。这可以通过客户端和服务器之间的SSL通信来实现,只要执行一些基本检查即可。客户端应确保证书由受信任的根CA签名,尚未过期,并根据与被调用者匹配的URL发出。
答案 4 :(得分:1)
您无法远程验证应用程序。
您可以对用户进行身份验证,并且可以防止中间人攻击。但是,如果您认为经过身份验证的用户自己是敌对的并且可能会篡改应用程序,那么就无法阻止这种情况发生。
最好的办法是验证所有输入,为服务器上的操作保留关键部分,记录每个经过身份验证的用户的所有活动,并尽可能限制用户可能对系统造成的损害。