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

时间:2014-04-01 21:36:59

标签: javascript android ios spring java-ee

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

我希望用户在appstore中购买应用后才能访问网络应用(使用它)。如何阻止用户反编译源并直接转到URL?

6 个答案:

答案 0 :(得分:2)

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

有一种方法可以阻止这种特定情况,但它仍然无法完全保护应用程序。我们的想法是在应用程序中加载一个密钥,其中包含用于签署从您的网站发送的每个请求的二进制文件,有关详细信息,请参阅here

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

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

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

例如,像twitter这样的应用将其密钥暴露在blog posts中。

所以它是安全性与便利性之间的权衡:如果你想要覆盖从浏览器访问的URL,请使用API​​密钥并定期扫描android商店以获取克隆应用程序并报告它们将被关闭。这应该很少见,很容易被发现,用户也会向您报告。

如果您想要更高的安全性,那么请免费提供应用程序,并自行管理登录/付款:它要复杂得多,并且会阻止用户减少销售。使用API​​密钥似乎是最好的安全/便利权衡。

答案 1 :(得分:2)

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

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

  

您可以使用Google Play提供的GoogleAuthUtil课程   服务,用于检索名为“ID令牌”的字符串。你寄了   令牌到你的后端,你的后端可以快速使用它   便宜地验证哪个应用程序发送了它以及谁在使用该应用程序。

通常,方法是添加一些代码,以检查发送到您网址的请求是由“经过身份验证/付费”的用户生成的(在Android博客示例中是通过检查他们的Google Play服务帐户)。

答案 2 :(得分:2)

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

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

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

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

<强>的Android

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

每个Android应用程序都由证书签名,您可以通过HTTP头发送签名值验证服务器端。有关如何从Android应用程序获取签名,请参阅this

请记住,应用签名是独一无二的,这就是Google Play商店识别应用的方式,因此他们绝不会让其他开发者获得持有。如果它不能满足你添加额外的标题值(一些秘密)并在每次更新时更改它。

来自Android或Apache的其他HTTP API的

HttpURLConnection提供了支持。

<强>的iOS

有关如何在iOS上修改http标头的信息,请参阅this

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

您可以从网络服务下载包装的网址(使用https),这样网址永远不会在应用内部进行反编译。

无论如何,嗅探器可以监视Web请求,并且可能仍然可以检索。

答案 5 :(得分:0)

您可以尝试以下方式:

  1. 使用缩小器,优化器,混淆器和预处理器类,如 PROGUARD
  2. 将您的网站网址分成更多部分并将其放入您的strings.xml
  3. 编写加密,如 AES DES ,以加密strings.xml中的url字符串
  4. 在运行时,您可以解密,组合您的url字符串并将其设置为变量。当你使用它时,你可以将该变量设置为null,这样人们就无法在内存中获取它
  5. 我认为这隐藏了你的字符串,人们无法轻易找到它,