阻止在包装器应用程序之外访问 Web 应用程序
Prevent access to web app outside of wrapper apps
我正在创建一个网络应用程序,我将它包装在Android和iOS设备的Web视图中。Web 视图将是非常简单的代码,基本上指向我的 Web 应用程序。例如:www.myapp.com
我希望用户只有在应用商店购买应用程序后才能访问网络应用程序(使用它)。如何防止用户反编译源码并直接转到 URL?
用户真的愿意,没有办法阻止用户获取 URL 并直接访问它,然后将其放在在线论坛中。
有一种方法可以防止这种特定情况,但它仍然不能完全保护应用程序。这个想法是用二进制文件中的密钥为应用程序提供,用于对从您的网站发送的每个请求进行签名,有关一些详细信息,请参阅此处。
通过这种方式,您可以确保请求来自拥有 API 密钥的人,很可能是您的应用。这将防止在论坛上发布 URL 并且通过 Web 浏览器直接访问应用程序的情况。
此机制通常用于保护 JSON API,但也可用于保护从 Web 视图应用访问网页。
但这并不能阻止某人检查二进制文件以获取 API 密钥,并生成另一个使用它签署请求的应用程序或程序,从而创建应用程序的克隆。
例如,像Twitter这样的应用程序在博客文章中公开了它们的密钥。
因此,这是安全性与便利性的权衡:如果您想覆盖从浏览器访问的URL,请使用API密钥并定期扫描Android商店以查找克隆应用程序并报告它们被关闭。 这应该很少发生并且很容易发现,用户也会向您报告。
如果您想要更高的安全性,请免费提供该应用程序,并自己管理登录/付款:它要复杂得多,并且会阻止用户减少销售。使用 API 密钥似乎是最好的安全性/便利性权衡。
想起了我在这里参与的另一个讨论,我有一个类似的问题。接受的答案有相当广泛的列表,你可以尝试。
对于我自己的答案,这是我链接的"验证来自 Android 应用程序的后端调用"文章中的简短摘要:
您使用GoogleAuthUtil类,可通过Google Play获得 服务,以检索名为"ID 令牌"的字符串。您发送 令牌到您的后端,您的后端可以使用它来快速和 便宜地验证哪个应用程序发送了它以及谁在使用该应用程序。
通常,方法是添加一些代码来检查进入您的URL的请求是否由"经过身份验证/付费"的用户生成(在Android博客示例中,这是通过检查他们的Google Play服务帐户)。
客户端验证将毫无用处,因为,如果有人知道该 URL 将能够访问它。而且,无论您使用多少代码混淆,它都不会对决定性黑客隐藏。此外,如果请求是通过代理路由的,甚至不需要黑客攻击,日志无论如何都会显示 URL。
您应该进行服务器端验证,并有一个简单的脚本来查看这些请求的来源。
每个 HTTP 请求都提供有关客户端的一些信息。您可以查看该信息以确定请求的确切来源。要增加一点安全性,您可以从客户端修改和设置自己的 HTTP 标头值。
在Android和IOS中的实现会有所不同,因为挑战也不同。
人造人
在Android上,将应用程序发布到市场相对容易,如果有人知道您的网址,他们可以对HTTP请求执行相同的技巧并发布另一个应用程序。为了防止这种情况:-
每个 android 应用程序都由证书签名,您可以在服务器端发送带有 HTTP 标头的签名值进行验证。请参阅此处了解如何从安卓应用程序获取签名。
请记住,应用程序签名是唯一的,这就是Google Play商店识别应用程序的方式,因此其他开发人员无法掌握这一点。 如果它不满足,您可以添加额外的标头值(一些秘密),并在每次更新时更改它。
来自Android或Apache的HttpURLConnection和其他HTTP API提供了支持。
苹果
有关如何在 iOS 上修改 http 标头的信息,请参阅此处。
在这种情况下,仍然存在一个问题是任何人都可以创建iOS应用程序并执行相同的操作,但是在iOS上,人们不能简单地这样做,因为每个应用程序都要经过漫长的Apple验证过程。您甚至可以轮换密钥,或者随着每个新的应用程序更新或 http 请求而动态生成它,只有您的服务器才能验证这些密钥以使事情变得更加困难。
您应该使用 OAuth 2 来限制对 Web 服务器的访问。
这个问题可能会有所帮助:使用 OAuth2 安全验证移动访问的选项
您可以从网络服务下载包装的 URL(使用 https),这样 URL 将永远不会在应用程序内进行反编译。
无论如何,Web 请求可以由嗅探器监控,并且可能仍然可以检索。
您可以尝试以下方法:
- 使用收缩器、优化器、混淆器和验证器类,如 PROGUARD
- 将您的网站网址分成更多部分,并将其放入字符串中.xml
- 编写 AES 或 DES 等加密,以字符串形式加密 url 字符串.xml
- 在运行时,您可以解密,组合您的 url 字符串并将其设置为变量。当你使用它时,你可以将该变量设置为 null,这样人们就无法在内存上获取它
我认为这隐藏了你的字符串,人们不容易找到它,
- 如何安全地获取&使用Facebook应用程序访问令牌发送通知使用PHP&Javascript
- 通过chrome后台扩展或后台应用程序访问用户麦克风
- 三星智能电视视频播放器应用程序-访问存储在USB上的mp4
- C# - 通过控制台应用程序访问 Javascript 修改的 HTML
- 从 JavaScript 应用程序访问 SQLite 数据库
- 使用具有应用程序访问令牌的图形 API 搜索用户
- 仅允许通过本机iOS和Android应用程序访问网络链接
- 黑莓z10移动浏览器上的煎茶应用程序访问
- 通过谷歌打包的应用程序访问网站的DOM
- 使用 Web 应用程序访问本地文件系统并提取文件元数据
- 是否可以通过iOS应用程序访问rails数据库
- 从html文件夹中的HTML5桌面应用程序访问本地文件
- 如何从nodejs应用程序访问浏览器的窗口对象?
- 无法通过Lumia 520(运行Windows Phone 8.1预览版)的应用程序访问摄像头
- 如何从离线可用的web应用程序访问在线资源
- 获取Facebook用户名与javascript SDK和应用程序访问令牌
- CSS访问的链接-如何识别访问的链接,通过点击我的应用程序访问
- 如何实现OAuth 2.0,比如基于令牌的认证,用于从移动和javascript web应用程序访问的rest API
- 从同构应用程序访问导航器对象的优雅解决方案
- 如何通过javascript API验证Facebook应用程序访问公共页面feed