阻止在包装器应用程序之外访问 Web 应用程序

Prevent access to web app outside of wrapper apps

本文关键字:应用程序 访问 Web 包装      更新时间:2023-09-26

我正在创建一个网络应用程序,我将它包装在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 请求可以由嗅探器监控,并且可能仍然可以检索。

您可以尝试以下方法:

  1. 使用收缩器、优化器、混淆器和验证器类,如 PROGUARD
  2. 将您的网站网址分成更多部分,并将其放入字符串中.xml
  3. 编写 AESDES 等加密,以字符串形式加密 url 字符串.xml
  4. 在运行时,您可以解密,组合您的 url 字符串并将其设置为变量。当你使用它时,你可以将该变量设置为 null,这样人们就无法在内存上获取它

我认为这隐藏了你的字符串,人们不容易找到它,