Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止用户直接下载MP3_Php_Http_Drm - Fatal编程技术网

Php 如何防止用户直接下载MP3

Php 如何防止用户直接下载MP3,php,http,drm,Php,Http,Drm,我正在构建一个类似网络广播的服务,在这个服务中,用户对服务进行身份验证,获得一个cookie,一个基于Flash的应用程序从服务器播放MP3。只有当客户端允许播放特定的mp3时,服务器才会发送 如果用户打开HTTP记录器(如FireBug),他可以看到flash下载的文件。如果他直接通过地址栏打开mp3 URL,他可以轻松下载mp3,尽管用户无法猜测URL 我正在寻找一个安全的系统,以防止用户下载MP3直接到他的系统。我已经检查了last.fm,因为他们使用了类似的设置,但不知何故他们阻止了它。

我正在构建一个类似网络广播的服务,在这个服务中,用户对服务进行身份验证,获得一个cookie,一个基于Flash的应用程序从服务器播放MP3。只有当客户端允许播放特定的mp3时,服务器才会发送

如果用户打开HTTP记录器(如FireBug),他可以看到flash下载的文件。如果他直接通过地址栏打开mp3 URL,他可以轻松下载mp3,尽管用户无法猜测URL


我正在寻找一个安全的系统,以防止用户下载MP3直接到他的系统。我已经检查了last.fm,因为他们使用了类似的设置,但不知何故他们阻止了它。

最后,你无法阻止一个下定决心的人。然而,你至少可以让它变得困难

有几个选项涉及推荐人检查、身份验证和类似的有趣事情。但我见过的最成功的反下载检查可能是这样的:

用户表示他想要流式传输文件;该应用程序发出一个经过身份验证的加密请求,指示其所需的操作。其结果是,无论是托管该文件的应用程序还是CDN,都可以识别出一个只使用一次且有时间限制的URL。URL使用一次(即flash应用程序使用)后,它将过期,并且永远不能再次使用。如果流媒体在给定的时间内(几秒钟)没有启动,URL同样会过期。显然,给定的URL并不直接对应于文件名,而是在服务器端进行身份验证、解码和翻译


解决这个问题并非不可能,但相当困难。

您可以使用RTMP而不是HTTP来传递音频数据。RTMP用于流式传输音频、视频和杂项数据。它只传输数据,而不是文件。它不是100%安全的,因为如果某个东西到达客户端(浏览器、flash播放器等),用户可以保存它,但这仍然比通过HTTP提供文件要好


您需要一个支持RTMP的服务器,例如Flash Media server(FMS)、Wowza或Red5。

RTMP与简单的HTTP渐进式下载相比有太多的缺点。当前的设置可以在一个根服务器上处理近200个站点,因为它不必提供稳定的数据流。@nanoman,你问过可能的解决方案,我给出了其中一个。如果last.fm也使用它,我不会感到惊讶,但是,因为我没有在那里注册,我无法检查。使用HTTP代替流媒体是一个非常有意识的决定-该产品已经启动并运行。last.fm使用了完全相同的技术(潘多拉也是如此)——我认为你不需要注册来收听。他们似乎有一个智能系统来防止直接下载。@nanoman,为什么要投反对票?只是因为您出于某种原因不喜欢RTMP,尽管它实际上会阻止直接下载(这是您问题中描述的问题)?至于last.fm,当我单击“”时,他们会将我重定向到注册页面-这就是为什么我认为需要注册的原因。如你所说,如果他们使用HTTP,那么tylerl的解决方案对我来说似乎很好。我还评论了如何实现“过期URL”效果的答案。这可能是一个好方法,但我不确定如何确切地让URL在第一个请求启动后过期。有什么想法吗?@nanoman,URL应该类似于
getstream.php?id=123
,其中
id
标识数据库中的数据,并
getstream.php
验证
id
,如果正确,则将文件数据传递给客户端并从数据库中删除相应的条目。