如何防止在Android应用中使用的文件的直接URL访问?

时间:2016-10-16 06:45:22

标签: java android apache

我在服务器中有一个mp3文件,例如:www.example.com/Album/Songs/abc.mp3。

我正在构建一个Android应用程序,列出“Songs”文件夹下的所有文件,然后播放所选文件。

现在,有没有办法阻止直接访问mp3文件,如果有人拿到了URL?

我尝试了像重写引擎这样的常用方法。它会阻止直接URL访问,但它也会阻止我的应用程序使用这些文件。

这是我的Android代码来播放文件:

            MediaPlayer player = new MediaPlayer();
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
            player.setDataSource(song_path);
            player.prepare();
            player.start();

song_path只是http://www.example.com/Album/Songs/abc.mp3

PS:我知道通过ProGuard进行加密将使得通过逆向工程获得直接URL几乎是不可能的。我仍然想检查是否还有其他方法可以使它发挥作用。

2 个答案:

答案 0 :(得分:1)

你的Android应用程序中没有任何关于它的事情。它是服务器方应采取的一项政策来防止这种情况发生。即使你准备你的APK还有像WireShark这样的应用程序可以嗅探你的应用程序并找到你正在调用的API。

有一些方法可以做到这一点。有些人尝试生成临时链接,只要应用程序(使用已登录的用户)调用说游戏API,他们就会提供应用程序临时链接,这将使稍后的一些小步(或小时)无效。然后应用程序使用该链接播放音乐或其他任何内容。

另一种情况是加密音乐字节并在应用程序端解密,这有更复杂的考虑。

答案 1 :(得分:1)

您可以使用player.setDataSource(Context context, Uri uri, Map<String, String> headers)发送自定义header。然后,您可以在返回mp3之前在PHP或Apache中检查该自定义标头。

要检入Apache,您可以使用rewrite rule检查并仅允许与正确header的连接。

在PHP中,您可以使用$_SERVER['HTTP_*YOUR_HEADER_HERE*']然后使用echo MP3文件以及正确的标题。如果你允许寻求,可能会有点棘手。

Apache rewrite rule可能是最容易实现的。