使用PHP/Apache限制对图像的访问
首先,我知道这不是一个新话题,甚至不是一个重复的讨论,但我想提出一个新的方法,我不知道如何实现:
我的想法如下:
- APACHE应该交付文件,而不是PHP。这是非常关键的
- PHP应该做认证和重新发送/转发请求与一些技巧/变量设置)
- 相同的请求正在被重新发送,第二次重写条件应该失败(由于技巧),文件应该直接交付。
步骤:
- 请求来了(URL = http://somedomain.com/files/image1.png), apache将其转发到access.php
- access.php检查用户是否有权访问文件
- 如果检查成功,PHP设置一个环境变量AUTHORIZED = true,并进行内部重定向到原始URL。
- 同样的请求来了(第二次-这次是授权设置)-> 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结合起来)。