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


Use PHP/Apache to restrict access to images

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

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

我的想法如下:

  • APACHE应该交付文件,而不是PHP。这是非常关键的
  • PHP应该做认证和重新发送/转发请求与一些技巧/变量设置)
    • 相同的请求正在被重新发送,第二次重写条件应该失败(由于技巧),文件应该直接交付。

步骤:

  1. 请求来了(URL = http://somedomain.com/files/image1.png), apache将其转发到access.php
  2. access.php检查用户是否有权访问文件
  3. 如果检查成功,PHP设置一个环境变量AUTHORIZED = true,并进行内部重定向到原始URL。
  4. 同样的请求来了(第二次-这次是授权设置)-> RewriteCond将不匹配(RewriteCond %{ENV:AUTHORIZED} !^$),文件将被发送。

我不确定如何在步骤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

使用PHP/Apache限制对静态文件(html, css, img等)的访问

我不知道如何在步骤3和步骤4之间建立适当的联系。我不知道这怎么可能。

它不是,至少在实践中不是。HTTP没有状态。

我不太熟悉Apache的生命周期,但是任何环境变量都可以持续:

  • 仅用于请求,在这种情况下,当客户端响应重定向发出另一个请求时,它将不存在
  • 全局,在这种情况下,每个请求(来自每个客户端)将被授予访问权限

理论上你可以授权一个IP地址(但是IP地址是共享的,所以你会给任何共享IP的人访问权限,比如在很多情况下,和客户端在同一栋楼里的每个人)。所以,这是不安全的。

你可以设置一个cookie,然后有另一种机制检查该cookie,但这样你要么需要重复身份验证,要么有一个共享的cookie,任何人都可以复制。所以,这是不安全的。

如果你是用C或Perl (mod_perl)工作,那么你可以写一个Apache模块来挂钩到请求周期的认证/授权部分。但是您使用的是PHP,而且据我所知,还没有人编写过任何东西让PHP与Apache的内部机制一起发挥作用(好吧,除非算上PHP)。pm,但我不知道如何巧妙地将它与mod_perl结合起来)。