【问题标题】:Prevent access to web app outside of wrapper apps阻止访问包装应用程序之外的 Web 应用程序
【发布时间】:2014-05-12 21:42:44
【问题描述】:

我正在创建一个网络应用程序,我将在 Android 和 iOS 设备的网络视图中包装它。 Web 视图将是非常简单的代码,基本上指向我的 Web 应用程序。例如:www.myapp.com

我希望用户在 appstore 中购买应用后才能访问(使用)网络应用。怎样防止用户反编译源码直接进入网址?

【问题讨论】:

  • 很抱歉,如果我遗漏了一些非常明显的东西,但是用户如何在不先购买应用程序的情况下让代码反编译?您是否在询问如果有用户购买、反编译并共享 URL 该怎么办?
  • 一句警告 - Apple 有拒绝简单地将网站包装在 UIWebview 中的应用程序的历史 - 您的应用程序需要提供超出您可以使用网络浏览器执行的功能 - 例如。使用相机、定位服务等
  • @Paulw11 我使用 HTTP Basic + SSL。
  • 嗨@LuckyLuke,你的目的只是隐藏你的网址?

标签: javascript android ios spring jakarta-ee


【解决方案1】:

没有办法阻止用户获取 URL 并直接访问它,如果他真的想要的话,然后将其发布到在线论坛中。

有一种方法可以防止这种特殊情况,但它仍然不能完全保护应用程序。我们的想法是在应用程序的二进制文件中提供一个密钥,用于对从您的站点发送的每个请求进行签名,有关详细信息,请参阅here

这样,您可以确保请求来自拥有 API 密钥的人,很可能是您的应用程序。这将防止 URL 被发布在论坛上并且应用程序被直接通过网络浏览器访问的情况。

此机制通常用于保护 JSON API,但也可用于保护 Web 视图应用程序对网页的访问。

但这并不妨碍有人检查二进制文件以获取 API 密钥,并生成另一个应用程序或程序来签署请求,从而创建您的应用程序的克隆。

例如,像 twitter 这样的应用程序的密钥在 blog posts 中公开。

因此,这是安全性与便利性的权衡:如果您想覆盖从浏览器访问的 URL,请使用 API 密钥并定期扫描 android 商店以查找克隆应用程序并报告它们已关闭。这应该是不常见且容易发现的,用户也会向您报告。

如果您想要更高的安全性,请免费安装该应用,并自行管理登录/付款:这要复杂得多,并且会阻止用户减少销售量。使用 API 密钥似乎是最好的安全性/便利性折衷方案。

【讨论】:

  • 我明白了。我正在做的是为移动设备和最终桌面应用程序制作一个 Web 应用程序,但我想在不同的应用程序商店中提供该应用程序以对抗金钱,因此我不需要在应用程序中处理我自己。我还认为人们会在下载应用程序后意识到这一点,而不必处理信用卡等。但目前我担心有人得到了 URL 并避免付款而只是注册一个帐户并开始使用它。
【解决方案2】:

这个问题让我想起了another discussion here in which I participated in 有类似的问题。接受的答案有很多你可以尝试的东西。

对于我自己的答案,这是我链接的"Verifying Back-End Calls from Android Apps" article) 的简短摘要:

您使用可通过 Google Play 获得的 GoogleAuthUtil 类 服务,以检索称为“ID 令牌”的字符串。你发送 令牌到您的后端,您的后端可以使用它来快速和 廉价地验证是哪个应用发送了它以及谁在使用该应用。

一般来说,该方法是添加一些代码来检查到达您的 URL 的请求是否由“经过身份验证/付费”的用户(在 Android 博客示例中是通过检查他们的 Google Play 服务帐户)产生的。

【讨论】:

  • iOS中是否存在相同的东西?
  • 在 iOS 中会是这样吗?
  • 我不知道在 iOS 上是否可以使用/推荐类似的做法。不过,在这里使用“ios user identify”搜索会产生一些有趣的结果,例如 thisthis
【解决方案3】:

客户端验证将毫无用处,因为如果有人知道 URL 将能够访问它。而且,无论您使用多少代码混淆,它都不会被决定性的黑客隐藏。此外,如果请求通过代理路由,甚至不需要黑客攻击,无论如何日志都会显示 URL。

您应该进行服务器端验证并有一个简单的脚本来查看这些请求的来源。

每个 HTTP 请求都提供一些关于客户端的信息。您可以查看该信息以确定请求的确切来源。为了增加一点安全性,您可以从客户端在 HTTP 标头中修改和设置您自己的值。

在 Android 和 IOS 中的实施会有所不同,因为挑战也不同。

安卓

在 Android 上,将应用程序发布到市场相对容易,如果有人知道您的 url,他们可以使用 HTTP 请求执行相同的技巧并发布另一个应用程序。为了防止这种情况:-

每个 android 应用程序都由证书签名,您可以在服务器端发送带有 HTTP 标头的签名值验证。如何从安卓应用中获取签名请见this

请记住,应用签名是独一无二的,这就是 Google Play 商店识别应用的方式,因此其他开发人员无法掌握这一点。如果它不满足您添加额外的标头值(一些秘密)并在每次更新时更改它。

HttpURLConnection 和其他来自 Android 或 Apache 的 HTTP API 提供支持。

iOS

查看this 了解如何在 iOS 上修改 http 标头。

在这种情况下,仍然存在一个问题,即任何人都可以创建一个 iOS 应用程序并做同样的事情,但在 iOS 上,人们不能简单地这样做,因为每个应用程序都经过漫长的 Apple 验证过程。您甚至可以在每次新的应用程序更新或 http 请求时轮流生成或动态生成它,只有您的服务器才能验证这会使事情变得更加困难。

【讨论】:

  • 如果其他开发者在包管理器中传递了我的 APK 包名。然后他也会得到我的秘密,即签名值。对吗?
【解决方案4】:

我认为您应该使用 OAuth 2 来限制对您的网络服务器的访问。

这个问题可能有帮助:Options to securely authenticate mobile access using OAuth2

【讨论】:

    【解决方案5】:

    您可以从 Web 服务下载封装的 URL(使用 https),这样 URL 将永远不会在应用程序内部进行反编译。

    无论如何,一个网络请求可以被嗅探器监控并且可能仍然被检索到。

    【讨论】:

    • 但是用户不能只向提供真实应用程序 URL 的 Web 服务发出请求然后继续吗?还是我不明白的地方?
    • 可以对请求进行某种身份验证
    【解决方案6】:

    你可以试试这些方法:

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

    我认为这隐藏了您的字符串,人们无法轻易找到它,

    【讨论】:

    • 隐藏不是一种选择,最终它会被发现,例如使用 http 嗅探器或代理
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多