我正在创建一个Web应用程序,我将在Android和iOS设备的Web视图中打包。 Web视图将是非常简单的代码,基本上指向我的Web应用程序。例如:www.myapp.com
我希望用户在appstore中购买应用后才能访问网络应用(使用它)。如何阻止用户反编译源并直接转到URL?
答案 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)
您可以尝试以下方式:
我认为这隐藏了你的字符串,人们无法轻易找到它,