scriptalias是cgi安全运行的核心,必须置于块内,映射url路径并限定执行目录;配合禁用覆盖、启用+execcgi、限制访问源;脚本需正确shebang、http头和权限。
在虚拟主机中配置 scriptalias 实现 cgi 脚本的安全运行,核心是**隔离路径、限定权限、明确处理方式**。不是所有目录都能跑 cgi,apache 默认禁止执行,必须显式授权;而 scriptalias 不仅做 url 映射,还自带 cgi 执行上下文,比单纯加 options +execcgi 更可靠、更安全。
明确 ScriptAlias 的作用与位置
ScriptAlias 必须放在 对应虚拟主机的配置块内(<virtualhost></virtualhost>),不能只写在主配置里。它告诉 Apache:这个 URL 路径下的所有文件,都按 CGI 脚本处理,且只从指定目录读取——天然防止路径穿越或误执行其他位置的脚本。
- 正确写法示例:
ScriptAlias /cgi-bin/ "/var/www/example.com/cgi-bin/" - 末尾斜杠不可省略:
/cgi-bin/≠/cgi-bin;URL 访问也必须带斜杠,如https://example.com/cgi-bin/test.py - 路径需为绝对路径,且该目录不应是网站文档根目录(
DocumentRoot)的子目录,避免静态文件和 CGI 混杂
配合 Directory 块收紧执行权限
仅靠 ScriptAlias 还不够,必须用 <directory></directory> 明确限制该 CGI 目录的行为边界:
- 禁用 .htaccess 覆盖:
AllowOverride None - 只允许 CGI 执行:
Options +ExecCGI(不加Indexes或FollowSymLinks) - 限制访问来源(可选但推荐):
Require ip 192.168.1.0/24或Require local用于开发环境 - 拒绝所有未授权访问:
Require all denied,再单独放行 CGI 执行所需权限
确保脚本本身满足运行前提
Apache 不会替你检查脚本是否合法,以下三点出错会导致 500 错误或“Premature end of script headers”:
-
Shebang 行正确:Python 脚本首行写
#!/usr/bin/env python3,Perl 写#!/usr/bin/perl,路径必须真实存在且可被 Apache 用户(如www-data或apache)访问 -
输出标准 CGI 头:至少第一行必须是
Content-type: text/html,后紧跟一个空行(\n\n) -
文件权限合理:脚本需有可执行权限(
chmod 755 script.py),但目录权限不宜过宽(如避免777);SELinux 启用时还需确认 context(chcon -t httpd_exec_t)
避免常见安全隐患
不安全的配置往往源于“图省事”,比如把 CGI 放进 DocumentRoot 下或开放任意后缀执行:
- 不要用
AddHandler cgi-script .py在普通目录启用 CGI,这会让整个目录下所有 .py 文件都可执行,极易被上传恶意脚本利用 - 不要把
ScriptAlias指向用户可写的上传目录(如/var/www/uploads/) - 生产环境建议关闭 CGI 日志中的详细错误(
LogLevel warn),避免泄露脚本路径或系统信息 - 若只需极少数脚本,可考虑用
SetHandler cgi-script配合<files></files>精确控制,而非开放整个目录











