如何在Apache中使用PHP脚本进行访问控制

Ach*_*nos 12 php apache security fastcgi access-control

我正在寻找一种方法来使用PHP脚本来控制对Apache资源的访问.我希望拥有不依赖于目标资源的访问控制; 即它将适用于html,文件,其他脚本和cgi程序,就像"允许来自"或"拒绝来自"指令一样 - 除了使用自定义逻辑.

我已经看了几种方法来尝试管理它:

  1. 使用像mod_auth_script这样的apache模块(好但是这个模块很旧,我认为不能很好地扩展)
  2. 使用FastCGI指令FastCgiAccessChecker
  3. 创建我自己的apache模块来调用php并做我需要的任何事情

鉴于FastCGI的普及,其中#2看起来最有前途,也是最便携的.所以,我设法换掉了通常的linux php模块,让php通过fastcgi工作.它比在Windows上更难,但最终作为外部服务器工作,即使用Apache指令

FastCGIExternalServer /var/www/html/thing -host 192.168.0.11:9000

并启动php守护进程

php-cgi -q -b 192.168.0.11:9000 &

试图找到一种使用FastCgiAccessChecker调用PHP脚本的方法遇到了麻烦.

我尝试过各种方法尝试通过更改FastCGIExternalServer和/或FastCgiAccessChecker指令中的文件名来传递我想要运行的脚本名称 - 不起作用.我也尝试用脚本说明符启动php-cgi,即

php-cgi -q -b 192.168.0.11:9000 -f /var/www/html/thing/access.php &

什么都行不通.我可以告诉apache识别我的指令,因为当我包含FastCgiAccessChecker然后访问一个php页面时,内容类型更改为text/plain,如果它是一个脚本,我会从页面服务中丢失第一个~8000字节的内容(否)想法为什么).但它不会调用我想运行的PHP脚本.

据我所知,发生的事情是FastCgiAccessChecker假定指定的fastcgi服务器专门编译为充当访问检查器.没有办法告诉fastcgi服务器(在我的情况下是PHP)运行什么脚本来进行访问检查.

我在网上搜索过,据我所知,没有人曾尝试过使用PHP脚本,或者没有人写过.

所以我的问题是:我该怎么做?我可以看到一些可能性:

1)我遗漏了一些东西,并且有一些神奇的方法让FastCgiAccessChecker做我想做的事:运行PHP脚本来控制apache访问控制

2)我在c中编写自己的FastCGI服务器并嵌入PHP,因此我可以指定我想要运行的PHP脚本(我花了几分钟时间查看它;它看起来很复杂和可怕,我没有在c中工作自1995年以来)

3)我放弃了FastCGI并编写了一个apache模块来直接调用我的PHP脚本来控制访问.(看起来也很复杂;而且这种技术需要为每个执行PHP的请求生成一个新进程.)

有没有人有任何建议,无论是如何让FastCGI做我想要的,或者是(合理地)简单替代FastCGI?

感谢你能提出的任何建议

ezz*_*ron 8

我对这些类型情况的处理方法是将mod_xsendfilemod_rewrite结合使用.这些可能看起来没有你想要的第一个,但如果你:

  1. 使用mod_rewrite规则创建前端控制器(处理所有传入请求的单个PHP脚本).
  2. 通过查看$ _SERVER的内容(可能是$ _SERVER ['PATH_INFO'])来确定正在请求的文件.
  3. 在此处插入您的访问控制/安全层.
  4. 如果安全性通过,则使用mod_xsendfile发送文件的内容.

您基本上可以以这种方式实现所需的任何安全系统.

mod_xsendfile本质上只是以与Apache直接访问文件相同的方式发送文件.它是稳定的,并且在我抛出的每种情况下都能很好地工作.它也应该"正常工作",没有巨大的设置负担,你似乎正在努力一点点.