为了确保不存在可以通过 .htaccess 被利用的安全漏洞,我们如何才能看到 Apache 可以通过 和 等指令使用的所有可能的处理SetHanlder
程序AddHandler
。
我知道我可以通过查看 mod_info 的输出或通过 conf 文件 grepping 找到一些(这是我在尝试找到此问题的答案时发现的一种方法),但这并不意味着没有可用的处理程序不是这样列出的。我想我可以下载并搜索 Apache 的所有源代码以及加载的每个模块并查看它们正在注册的内容,但是有更好的方法吗?
一个快速的解决方法是在 .htaccess 中不允许 AddHandler 和 SetHandler,但这有其缺点。例如,Drupal 有一个有效的 SetHandler 指令用例,因为它使用它作为深度防御的一部分,以防止 PHP 脚本运行,如果有人设法通过文件上传器将它们上传到站点。
以下是我所指的一些示例:
AddHandler server-parsed .shtml
SetHandler server-info
AddHandler application/x-httpd-php5 .php
如果有人感兴趣,这里是来自 sites/default/files/.htaccess 的 Drupal 用例:
# Set the catch-all handler to prevent scripts from being executed.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
# Override the handler again if we're run later in the evaluation list.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>
编辑 2015 年 7 月 30 日:这不是一个详尽的答案,但如果它对任何人都有帮助,我发现一些处理程序列在http://httpd.apache.org/docs/2.4/handler.html的顶部并且还阅读了可以通过 Action 指令创建自定义处理程序(请参阅http://httpd.apache.org/docs/2.4/mod/mod_actions.html#action)。
编辑 2015 年 9 月 1 日:我想知道是否有某种方法可以转储 httpd 进程的内存并在其中找到处理程序名称。我使用 gcore 进行了尝试,但没有成功(尽管我以前从未使用过它并且在执行此操作时收到警告,所以我不确定我是否做错了什么)。
我很确定没有已经实现的方法来返回您的处理程序可以将请求映射到的现有操作、脚本等列表。
编写一个可以返回此类信息的 apache 模块可能是可能的,但需要对 apache 代码进行一些探索才能了解那里的可能性。
不可能,对不起。根据我在The Apache Modules Guide上的声明:
根据设计,这一切都是在请求时处理的,因此您无法遍历模块或以其他方式解决此问题。您必须阅读每个模块的源代码以了解它们的处理程序名称。
最好的办法是自己制作一个模块,根据一组接受的处理程序名称检查当前为请求设置的处理程序,如果列表中不存在,则将其更改为默认值。