Nginx 作为最流行的 Web 服务器之一,配置看似简单,但几个小疏忽就可能导致严重安全问题。上周在帮朋友排查网站时,发现他的 Nginx 配置存在源码泄露风险,攻击者可以直接下载 .git、.env 等敏感文件。今天把常见的 3 个高危配置错误和修复方案整理出来,建议所有站长自查。
错误一:未禁止访问隐藏文件
问题:默认配置下,Nginx 不会阻止访问以 . 开头的隐藏文件,如 .git、.env、.htaccess。
风险:攻击者访问 http://yourdomain.com/.git/ 即可下载整个 Git 仓库,包含源码、配置、甚至数据库密码。
修复方案:
在 Nginx 配置中添加:
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
错误二:PHP 解析配置不当导致非 PHP 文件被执行
问题:部分配置会把所有文件都交给 PHP 处理,包括上传的图片。
风险:攻击者上传一个伪装成图片的 PHP 文件(如 shell.jpg.php),Nginx 会将其作为 PHP 执行,直接获取服务器权限。
修复方案:
使用安全的 PHP 解析配置:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
关键点:try_files $uri =404; 确保文件真实存在才解析。
错误三:目录遍历未关闭
问题:Nginx 默认开启 autoindex,或配置中遗漏关闭。
风险:攻击者可以浏览服务器目录结构,获取敏感文件路径。
修复方案:
在 server 块中显式关闭:
server {
autoindex off;
# 其他配置...
}
完整安全配置模板
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 禁止访问敏感文件
location ~* \.(git|env|sql|log|ini)$ {
deny all;
}
# 安全解析 PHP
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 关闭目录遍历
autoindex off;
}
自查清单
- 访问
http://yourdomain.com/.git/是否返回 403? - 访问
http://yourdomain.com/.env是否返回 403? - 上传一个 PHP 文件到图片目录,尝试访问是否被执行?
- 访问
http://yourdomain.com/uploads/是否显示目录列表?
总结
Nginx 的安全配置不是"能用就行",很多漏洞都源于"默认配置"的疏忽。建议所有站长对照上面的清单自查一遍,花10分钟修复,可能避免一次严重的数据泄露。
