防止直接文件访问

时间:2013-05-01 09:47:30

标签: apache .htaccess

我有几个音频文件,我不想让其他人访问它们。每个文件都在主文件夹内的一个单独的文件夹中,我现在称之为“下载”。所以“下载”有几个其他目录,每个目录里面都有音频文件。这些音频文件在系统上的Web应用程序中播放。

问题是,现在任何人都可以输入文件localhost/download/dir/sound.wav的完整地址并播放音频文件。这是我想要防止发生的事情,我希望这些文件只在访问或从我们的应用程序流式传输时才会流式传输。

我在.htaccess文件上尝试了以下内容

deny from all

这只返回了一个403 forbidden页面,但我无法从应用程序中流式传输文件

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)localhost.com/.*$ [NC]
RewriteRule \.(mp3|wav)$ - [F]

这只是禁用了流一起没有返回403或任何它只是没有从应用程序或直接访问流

最后我使用AJAX来调用保存要流式传输的文件的脚本;我可以使用任何选项吗?

3 个答案:

答案 0 :(得分:4)

无法阻止用户访问这些文件

为了听到它们,必须将它们下载到用户的计算机上,这意味着它们必须是可访问的!

您可以做的最好的事情是加密文件并在播放器中解密它们。但即使这样,玩家也可以进行逆向工程,有人可以发现加密密钥和算法。最后你会发现你浪费了大量的处理时间,实际上减慢了你的申请速度!

答案 1 :(得分:0)

只有一个问题:服务器如何检测谁曾请求您的媒体 - 应用程序或其他系统,只是使用类似的协议?

但是,如果您只想阻止对您的媒体提出最简单的http请求,则可能涉及一些令牌交换系统,例如:您的应用程序以特定格式发送媒体请求,服务器发送用于访问某些文件的令牌,然后您的应用程序可以访问特殊(例如php)脚本,为其提供令牌,脚本返回您的声音流。这样,就可以禁止从外部访问媒体,只能通过自己的服务器端php脚本访问媒体。

然后,为了获得对媒体文件的访问权限,用户需要知道您现有的令牌或您的交换协议,以免随意用户随意访问您的媒体。但是,正如您之前所说,可能无法防范“受过教育的用户”。

答案 2 :(得分:0)

一种可能性是:

  1. 在该下载文件夹上添加一个apache重写指令,将所有请求路由到php脚本,而不是将请求的文件作为参数。
  2. 在您的应用程序中创建此脚本(例如sound.php),该脚本将该文件路径作为get参数。此脚本可以输出正确的http标头,以指示数据类型是wav还是您想要的任何内容。然后检查一些cookie或令牌或类似物,并仅在用户有效时直接输出受限文件的内容(参见readfile)。