我希望建立一个简单的上传网站,在输入验证码后会生成视频文件的临时URL。我需要保护文件的真实位置,因此不能直接进行热链接。基于时间的URL,在x分钟后到期似乎是最好的选择,但我不确定实际的实现。
任何提示?
答案 0 :(得分:5)
将您的网址设为:
http://myvid.com/video?id=1×tamp=12341561234&hash=1203941h23jk479sdf87sdf
其中timestamp是unix时间戳,而hash是md5哈希,例如,附加到服务器上的秘密字符串的时间戳。
然后,当您播放该视频时,检查时间戳字段是否有效(使用散列),然后检查时间戳的年龄。
答案 1 :(得分:3)
Yegor,他们使用Mod Rewrite。所以有人进来的时候 www.domain.com/video/1234567890/theLongHashCode 你在.htaccess中写道,网址应该被视为video.php?timestamp = 12341561234& hash = 1203941h23jk479sdf87sdf
这样可以防止显示实际网址。
mod重写的一些来源:http://www.modrewrite.com/
考虑到你在Apache上启用了mod_rewrite模块,你需要输入.htaccess文件:
RewriteEngine On
RewriteRule ^video/([0-9]+)/(.*) video.php?timestamp=$1&hash=$2
这只需要2个值:timestamp和hash。视频ID未发送。我甚至不会发送时间戳。对于临时URL,我只生成一个哈希,将其与时间戳一起存储在数据库中。所以当有人访问网址时,我会从数据库中查找哈希值。如果存在哈希,那么我将数据库中的时间戳与当前时间进行比较,如果它在时间限制内,则该URL被认为是有效的,否则它是无效的并写入页面“此链接已过期”。
所以我会把网址看起来像: http://hsbsitez.com/video/thehashcodehere
使用以下.htaccess文件来解释该url。
RewriteEngine On
RewriteRule ^video/(.*) video.php?hash=$1
其中video.php是检查数据库中是否存在哈希的文件。
答案 2 :(得分:1)
header('Content-Type: application/force-download');
$fileee = 'filename.zip';
$file_Location = "/..yourfolder/" . $fileee;
header('Content-Length:' . filesize($file_Location));
header("Content-Disposition: inline; filename=\"".$fileee."\"");
$file_Pointer = fopen($fileLocation,"rb");
fpassthru($file_Pointer);
答案 3 :(得分:0)
您是否考虑过使用带有PUT方法的表单?这正是PUT设计的一种情况 - 无法使用相同的URL来恢复页面。只需创建一个包含一些隐藏字段的简单表单,您就可以创建一个提交它的javascript链接。这样您就不必担心用户试图恢复链接或在历史记录中包含链接。
示例:
<form id="myform" method="put" action="viewimage.php">
<input type="hidden" name="id" value="uniquevalue" />
<input type="hidden" name="filename" value="foo.jpg" />
<a href="javascript:myFunctionToInvokeSumit()">Image foo.jpg</a>
</form>
从表面上看,没有人可以重新访问图像,而无需在典型用户之外进行一些HTTP魔术。但是,要进一步验证图像是否仅在单击后启动,您可以在会话中注册id并为其加上时间戳,然后检查查看图像时的时间戳。
答案 4 :(得分:0)
我建议不要通过php打印整个文件,因为它耗费资源(甚至 fpassthru
)。
还有另一种选择 - 使用自己的脚本生成对temporary url
=&gt; original url
{{1}} {{1}}。
但应谨慎使用此选项。