English 中文(简体)
如何在PHP中创建临时URL以防止热链接?
原标题:
  • 时间:2009-02-11 04:40:46
  •  标签:

我想建立一个简单的上传网站,当输入验证码后会生成视频文件的临时URL。我需要保护文件的真实位置,以防止被直接链接。基于时间的URL,在x分钟后过期似乎是最好的选择,但我不确定具体实现方式。

有什么技巧吗?

最佳回答

使您的URL如下:

http://myvid.com/video?id=1&timestamp=12341561234&hash=1203941h23jk479sdf87sdf

当时间戳是Unix时间戳,哈希是md5哈希时,可以将时间戳附加到服务器上的秘密字符串上生成哈希。

然后,当您播放该视频时,请检查时间戳字段是否有效(使用散列进行检查),然后检查时间戳的时间长度。

问题回答

Yegor, they use Mod Rewrite. So when someone enters www.domain.com/video/1234567890/theLongHashCode you write in .htaccess that the url should be treated as video.php?timestamp=12341561234&hash=1203941h23jk479sdf87sdf

这可以防止显示实际网址。

一些关于mod rewrite的来源:http://www.modrewrite.com/

如果您已经在Apache上启用了mod_rewrite模块,您需要将什么放置在.htaccess文件中:

RewriteEngine On
RewriteRule ^video/([0-9]+)/(.*)  video.php?timestamp=$1&hash=$2

这只接收2个值:时间戳和哈希。视频 ID 不会被发送。我甚至不会发送时间戳。对于临时 URL,我只生成哈希,将其存储在数据库中,并附加时间戳。因此,当有人访问 URL 时,我会从数据库中查找哈希。如果哈希存在,则将从数据库中比较时间戳和当前时间,如果在时间限制内,则认为该 URL 是有效的,否则它是无效的,并写入页面“此链接已过期”。

So I would have the url look like: http://hsbsitez.com/video/thehashcodehere

使用以下.htaccess文件来解释该url。

RewriteEngine On
RewriteRule ^video/(.*)  video.php?hash=$1  

其中video.php是检查哈希是否存在于数据库中的文件。

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);

Use a FORM with method set as PUT

你考虑过使用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并时间戳,然后在查看图像时根据时间戳进行检查。

I would recomend not printing whole file via php, because it is resource-consuming(even fpassthru). There is another option - using own script for generating pairs temporary url => original url with rewritemap prg. But this option should be used careful.





相关问题
热门标签