使用PHP / Apache限制对图像的访问

时间:2016-06-24 10:13:27

标签: php apache .htaccess security

使用PHP / Apache限制对图像的访问

首先,我知道这不是一个新主题,甚至是讨论过的重复,但我想提出一个新的方法,我不知道如何实现:

我的想法如下:

  • APACHE应该提供的文件不是PHP。这非常关键
  • PHP应该只进行身份验证并使用一些技巧/变量集重新发送/转发请求
    • 同一请求正在重新发送,第二次重写条件失败(由于技巧),文件应该直接传递。

步骤:

  1. 请求即将进入(URL = http://somedomain.com/files/image1.png),apache将其转发给access.php
  2. access.php检查用户是否有权访问该文件
  3. 如果检查成功,那么PHP会设置一个环境变量AUTHORIZED = true,并将内部重定向到原始网址。
  4. 相同的请求即将进入(第二次 - 这次是AUTHORIZED设置) - > RewriteCond将不匹配(RewriteCond%{ENV:AUTHORIZED}!^ $),文件将被传递。
  5. 我不确定如何在第3步和第4步之间建立正确的链接。不确定如何做到这一点。

    我不确定PHP可以使用哪种机制来设置apache环境变量或类似的东西。

    任何输入都将不胜感激。

    代码示例:

    .htaccess

    RewriteEngine on  
    RewriteCond %{ENV:AUTHORIZED} !^$
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ access.php [L]
    

    access.php
        

    if ( 1 == 1 /* check if user is authorized*/ ) {
        // set an environment variable for apache!!!
        apache_setenv( 'AUTHORIZED', "true" ); //not working!
    
        //forward the request
        header( "Location:" . $_SERVER[ 'REQUEST_URI' ] );
        exit;
    } else  {
        header("HTTP/1.1 401 Unauthorized");
        exit;
    }
    

    一些参考文献:

    https://serverfault.com/questions/374955/protecting-images-from-direct-access-by-checking-current-php-session-with-mod-re

    Using PHP/Apache to restrict access to static files (html, css, img, etc)

1 个答案:

答案 0 :(得分:0)

  

我不确定如何在第3步和第4步之间建立正确的链接。不确定如何做到这一点。

这不是,至少在实践中并非如此。 HTTP是无状态的。

我不熟悉Apache生命周期,但任何环境变量都会持续:

  • 仅针对请求,在这种情况下,当客户端发出另一个请求以响应重定向时,它不会存在
  • 在全球范围内,在这种情况下,每个请求(来自每个客户)都将被授予访问权限

理论上,您可以授权IP地址(但IP地址是共享的,因此您可以访问任何共享IP的人...例如,在许多情况下,与客户端在同一建筑物中的每个人)。所以,这不安全。

你可以设置一个cookie,然后让另一个机制检查那个cookie ......但是你要么需要重复认证,要么拥有一个任何人都可以复制的共享cookie。所以,这不安全。

如果您使用的是C或Perl(mod_perl),那么您可以write an Apache module挂钩到请求周期的身份验证/授权部分。但是你在PHP工作,据我所知,没有人写任何东西让PHP玩Apache的内部(好吧,除非你算上PHP.pm,但是我'我不知道你怎么能把它与mod_perl结合起来。