2012-12-08 113 views
0

我通过一个php文件(我们称之为serveMedia.php)将图片和视频提供给我的index.php。 我使用mod_rewrite,php-sessions和URL中包含的一个令牌来调用index.php中的这些媒体文件,例如, src="media=SOMEFILENAME&type=jpeg&token=2134573946284615492345" 的媒体文件本身通过的.htaccess(deny from all只通过页面访问php文件

躺在文件夹中有限制存取权限现在我的问题:是否有可能使这个URL只能通过我的index.php访问? 我试图实现的是用户只能在通过我的页面发送内容时看到内容,而不是在他们访问它的URL时看到内容。

也许有一些先进的.htaccess或php选项我不知道? 我在托管的空间,所以这两个可能是我唯一的选择。

这就是我与此刻的工作:

的index.php

ob_start(); 

session_start(); 

if (!isset($_SESSION['token']) || $_COOKIE['PHPSESSID'] !== session_id()){ 
    $token = md5(uniqid(rand(), true)); 
    $_SESSION['token'] = $token; 
} 
else { 
    $token = $_SESSION['token']; 
}; 

serveMedia.php:

if(isset($_GET['token']) 
    && $_GET['token'] == $_SESSION['token'] 
    && $_COOKIE['PHPSESSID'] == session_id()){ 

     //streamthisfile! 

else { 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    echo "no file"; 
    session_regenerate_id(true); 
    session_destroy(); 
    unset($_SESSION); 
} 

感谢您的帮助!

回答

0

通常情况下,HTTP头referer被设定为图像请求的源页面,所以你可以用它来确定,如果你所服务的资源或没有。

if($_SERVER['HTTP_REFERER'] == 'my/index.php') { 
    //serve page 
} 
+0

这是特定浏览器,而不是总是设置,对不对?我引用的页面的名称不是静态的... – basbebe

1

加密变量(如当前日期)并将其放置在“门”链接中。当您到达新页面时,脚本会解密该变量,如果它不匹配或甚至不存在,脚本将重定向到另一个页面。

喜欢的东西:

 <a href="restricted.php?pass=eERadWRWE3ad=">Go!</a> 

有几个图书馆,在那里,可以做所有的加密/解密给你。

其他明智的,你必须依靠在会话即以前的方法,也可以使用HTTP_Refferer(不可靠)

这里: Restricting access to page unless coming from a specific page

+0

我使用'$ token = md5(uniqid(rand(),true));'生成标记。我试过'if(isset($ _ SERVER ['HTTP_REFERER']))'但这不安全,例如iPhone不再播放视频。 – basbebe

+0

如果您使用http_referrer, 在页面上生成该值,在数据库中存储相同的值,则您在其上提供视频的页面只需使用$ _GET ['pass']检索传递值,并在数据库值匹配继续,否则重定向。 – sven