// 安全研究 · 2026-02-16

实验:Apache 开启 .shtml (SSI) 解析

一、SSI 是什么

SSI(Server Side Includes,服务器端包含)是一种简单的服务器端脚本技术,允许在 HTML 页面(通常以 .shtml 为扩展名)中嵌入指令,Apache 服务器在返回页面给客户端前会解析这些指令并执行相应操作(如包含其他文件、执行系统命令、显示服务器信息等)。启用 SSI 解析后,.shtml 文件中的 SSI 标签才能被 Apache 正确识别和执行。

二、实验步骤

1. 启用必要模块

SSI 的核心解析依赖 mod_include 模块,若需使用 #exec 指令执行系统命令或 CGI 脚本,还需启用 mod_cgi 模块。执行以下命令启用模块:

# 启用 SSI 核心解析模块
sudo a2enmod include
# 启用 CGI 执行模块(如需使用 #exec 指令则必须启用)
sudo a2enmod cgi

2. 修改站点配置文件

编辑 Apache 虚拟主机配置文件(默认路径为 /etc/apache2/sites-available/000-default.conf,若为自定义站点则修改对应配置文件),在 <Directory> 段落中添加 SSI 解析相关配置,核心配置如下:

<Directory /var/www/html>
    # 启用必要选项:Includes 支持 SSI 解析,ExecCGI 支持 #exec 指令执行 CGI/命令
    Options +Indexes +FollowSymLinks +Includes +ExecCGI
    
    # 将 .shtml 扩展名关联到 text/html 类型,确保浏览器正确解析
    AddType text/html .shtml
    
    # 为 .shtml 文件添加 INCLUDES 输出过滤器,触发 Apache 解析 SSI 标签
    AddOutputFilter INCLUDES .shtml
    
    # (可选) 将 index.shtml 加入默认首页列表,优先加载 .shtml 首页
    DirectoryIndex index.shtml index.html
    
    AllowOverride All
    Require all granted
</Directory>

配置说明:

  • Options +Includes:是启用 SSI 解析的核心选项,缺失则 Apache 不会处理 .shtml 中的 SSI 指令;
  • AddOutputFilter INCLUDES .shtml:明确指定对 .shtml 文件应用 SSI 过滤解析,是确保 SSI 生效的关键;
  • 若无需执行 #exec 指令,可移除 +ExecCGI 以提升安全性。

3. 调整全局 SSI 安全策略(可选)

Apache 全局 SSI 配置文件 /etc/apache2/mods-available/include.conf 可能限制 #exec 指令执行,需检查并调整:

<IfModule mod_include.c>
    # 注意:若此处为 IncludesNoExec,会禁止 #exec 指令,需改为 Includes(或直接注释)
    # XBitHack full:通过文件可执行权限控制 SSI 行为,full 表示只要文件有可执行权限就解析 SSI
    XBitHack full
</IfModule>

关键说明:

  • IncludesNoExec 是安全限制选项,会禁用 #exec 指令,仅保留文件包含等基础 SSI 功能;
  • XBitHack full:开启后,即使未在站点配置中显式启用 Includes,只要 .shtml 文件设置了可执行权限(如 chmod +x test.shtml),Apache 也会解析其内部的 SSI 指令。

4. 重启服务并验证配置

修改 Apache 配置后,必须重启服务使配置生效:

sudo systemctl restart apache2
# 可选:检查配置是否有语法错误,避免重启失败
sudo apache2ctl configtest

测试 SSI 是否生效

  1. 在 /var/www/html 目录下创建测试文件 test.shtml:
<!DOCTYPE html>
<html>
<head>
    <title>SSI 测试</title>
</head>
<body>
    <h1>SSI 解析测试</h1>
    <!-- SSI 指令:显示当前时间 -->
    <p>服务器当前时间:<!--#echo var="DATE_LOCAL" --></p>
    <!-- SSI 指令:显示服务器 IP 地址(可选) -->
    <p>服务器 IP:<!--#echo var="SERVER_ADDR" --></p>
    <!-- 若启用了 ExecCGI,可测试 #exec 指令(示例:执行 ls 命令) -->
    <!-- <p>目录文件列表:<!--#exec cmd="ls /var/www/html" --></p> -->
</body>
</html>
  1. 访问 http://服务器IP/test.shtml,若页面显示服务器时间、IP 等信息,说明 SSI 解析已成功启用;若仅显示原始 SSI 标签,则配置未生效,需检查上述步骤。

三、注意事项

  1. 安全性:#exec 指令可执行系统命令,存在安全风险,非必要场景建议禁用 mod_cgi 或设置 Options IncludesNoExec;
  2. 权限:确保 .shtml 文件所属用户/组对 Apache 进程(通常为 www-data)有可读权限;
  3. 扩展名:若需让 .html 文件也支持 SSI,可在配置中添加 AddOutputFilter INCLUDES .html,但不建议(易增加解析开销)。

总结

  1. 启用 SSI 核心依赖 mod_include 模块,mod_cgi 仅在使用 #exec 指令时需要;
  2. 站点配置中需通过 Options +Includes 和 AddOutputFilter INCLUDES .shtml 开启 .shtml 解析;
  3. 配置修改后需重启 Apache 并通过测试文件验证 SSI 指令是否正常解析,同时注意控制 #exec 指令的使用以保障服务器安全。

原文 https://blog.csdn.net/2301_79518550/article/details/158126358