![](/img/trans.png)
[英]Prevent direct access to images/pdfs through browser but only allow access through android app
[英]How to prevent direct URL access of a file which is used in an Android app?
我在服務器中有一個mp3文件,例如:www.example.com/Album/Songs/abc.mp3。
我正在構建一個Android應用,以列出“歌曲”文件夾下的所有文件,然后播放選定的文件。
現在,有沒有一種方法可以防止在有人掌握URL的情況下直接訪問mp3文件?
我嘗試了重寫引擎之類的常用方法。 它阻止了直接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。 我仍然想檢查是否還有其他方法可以使它工作。
在您的android應用中,您無能為力。 服務器端應采取的策略來防止這種情況。 即使您保護您的APK,也可以使用wireShark之類的應用程序來嗅探您的應用程序並找到您正在調用的API。
有一些方法可以做到這一點。 每當應用程序(具有登錄用戶的應用程序)調用一個說說播放API時,他們都會嘗試生成臨時鏈接,他們會使用臨時鏈接為應用程序提供該應用程序,這些臨時鏈接將使某些小塊(或一小時)無效。 然后應用程序使用該鏈接播放音樂或其他內容。
另一種情況是對音樂字節進行加密並在應用程序端進行解密,這需要考慮更復雜的因素。
您可以使用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
可能是最容易實現的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.