服务/业务层具有REST(JSON)接口.
有两种可以称为API的客户端:在浏览器和移动应用(Android)中运行的webapp).他们都是公开的.使用授权(!)webapp或授权(!)移动应用程序的所有人都应该可以访问资源.应禁止所有未经授权的客户端(例如脚本).
注意:没有限制多少或哪些用户可以访问服务层 – >客户端公钥证书可能无法使用.只有客户端软件必须被授权.
在我看来,唯一的一个解决方案是“晦涩”.
思路:
>从浏览器(或应用程序)中执行的服务器加载一个随机JS函数(让我们称之为“挑战”),以特定的方式(浏览器缺陷?)指纹浏览器,计算结果并发送每个REST API调用结果.
你有什么进一步的想法或建议吗?
谢谢你提前&对不起,我的英语不好
编辑:
我的问题与用户身份验证和/或授权无关,但客户端软件验证授权无关.
我的问题的背景是,我自己的应用程序(android web)有一个RESTful后端,我不希望有人创建自己的客户端软件.原因是因为它是一个商业网站/应用程序,它提供了一些相当昂贵的数据收集.我想推广该网站和移动应用程序,而不是RESTapi(或一些第三方竞争对手).
解决方法
虽然有各种方式与您分发的客户端建立信任关系,但所有这些都可能被黑客入侵,破解或绕过.不要信任来自服务器外部的任何数据.永远.不要依赖连接来自您的客户端或主要的网络浏览器.一切都可以用足够的时间和精力来欺骗.
像行业这样的一些很好的例子很容易从游戏这样的事情中看出,即使是通过例行程序来检查内存黑客和其他方法,最终甚至像“魔兽世界”这样庞大的预算的服务通常都会看到客户端的黑客出现或者是能够发送正常客户端命令的直接客户端仿真器不会.依靠您的客户端软件保持安全,只有将正确的数据发送到您的服务器才是灾难的秘诀.如果是重要的,总是验证服务器端.始终正确地逃脱/参数化数据.使用白名单模型,最好在适当的情况下使用基于用户输入而不是用户数据本身的符号表查找.客户端验证只能被视为帮助用户,而不是安全的.
如果你只是“做得足够好”,那么你可能会有一些选择来帮助减少看到这种情况的可能性,比如你提出的晦涩的解决方案的安全性,但是即使如此,你也不应该依靠它.
一个解决方案是基本上不包括客户端的客户端的主要功能,而是在运行时将其从服务器(javascript / etc)发送,每次将逻辑包发送到客户端时都有不同的指纹,可能与一系列不同的逻辑例程,随机挑选一个.然后,您可以暂停包,跟踪哪个用户访问哪个包,并将包返回遥测器,您也可以使用它来帮助维护安全性.返回的逻辑与使用指纹发送的逻辑之间的任何不匹配都可以立即被假定为欺骗或黑客尝试.然而,最终,所有这一切仍然可以被打败(一个比较简单的例子,这样可以被某人确定的相当容易地打败,特别是如果你没有运行时内存安全).