1. 保持系统和PHP版本最新
定期运行sudo apt update && sudo apt upgrade
更新Ubuntu系统和所有软件包,确保PHP及依赖库的安全补丁及时应用。优先使用最新的稳定版PHP(如PHP 8.x),避免使用已停止维护的旧版本(如PHP 5.6及以下),旧版本可能存在未修复的高危漏洞。
2. 配置PHP.ini安全参数
编辑/etc/php/{version}/apache2/php.ini
(Apache)或/etc/php/{version}/fpm/php.ini
(PHP-FPM)文件,调整以下关键设置:
expose_php = Off
(隐藏PHP版本信息)、allow_url_fopen = Off
/allow_url_include = Off
(禁止通过URL访问文件,防止远程代码执行)、display_errors = Off
(生产环境关闭详细错误显示,避免泄露敏感路径或数据库信息)、log_errors = On
(将错误记录到/var/log/php_errors.log
);max_execution_time = 30
(脚本最大执行时间,防止长时间占用资源)、memory_limit = 128M
(限制内存使用,避免内存耗尽攻击)、upload_max_filesize = 2M
/post_max_size = 8M
(限制上传文件大小,防止大文件攻击);disable_functions = exec,shell_exec,system,passthru,proc_open,popen,curl_exec,curl_multi_exec
禁用可能用于执行系统命令的危险函数;open_basedir = /var/www/html:/tmp
限制PHP脚本只能访问指定目录,防止目录遍历攻击。3. 强化Web服务器配置
mod_security
(Web应用防火墙,可拦截SQL注入、XSS等攻击)和mod_evasive
(防止暴力破解、DDoS攻击),运行sudo apt install libapache2-mod-security2 && sudo a2enmod security2
安装并启用;location ~ ^/(uploads|assets)/.*\.(php|php5|jsp)$ { deny all; }
拒绝访问上传目录中的PHP文件,避免上传脚本被执行。4. 管理文件和目录权限
确保PHP运行用户(通常为www-data
)对项目目录有正确权限:
sudo chown -R www-data:www-data /var/www/html
将网站目录所有者设为www-data
;755
(sudo find /var/www/html -type d -exec chmod 755 {} \;
)、文件权限为644
(sudo find /var/www/html -type f -exec chmod 644 {} \;
);/var/www/html/uploads
)设置为755
,并禁止执行脚本(chmod -R 755 uploads
),防止上传的恶意脚本被执行。5. 使用安全模块和工具
ufw
(Uncomplicated Firewall)限制访问,仅允许必要端口(如HTTP 80、HTTPS 443、SSH 22),运行sudo ufw allow 'Nginx Full' && sudo ufw enable
启用;sudo apt install fail2ban && sudo systemctl enable fail2ban
;sudo apt install certbot python3-certbot-nginx && sudo certbot --nginx -d yourdomain.com
。6. 实施安全编码实践
$_GET
、$_POST
)进行验证,使用filter_input
函数过滤非法字符(如$input = filter_input(INPUT_GET, 'param', FILTER_SANITIZE_STRING)
);htmlspecialchars
或htmlentities
对输出内容进行转义,防止XSS攻击(如echo htmlspecialchars($output, ENT_QUOTES, 'UTF-8')
);$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]);
);session.use_only_cookies = 1
(仅使用cookie存储会话ID)、session.cookie_httponly = 1
(禁止JavaScript访问会话cookie)、session.cookie_secure = 1
(仅通过HTTPS传输会话cookie),并定期更换会话ID。7. 定期监控与审计
/var/log/apache2/access.log
//var/log/nginx/access.log
)和错误日志(/var/log/apache2/error.log
//var/log/nginx/error.log
),使用tail -f /var/log/nginx/access.log
实时监控异常请求;sudo apt install lynis && sudo lynis audit system
)进行系统安全审计,及时发现潜在漏洞;rsync
或mysqldump
),将备份存储在异地,确保数据丢失时可快速恢复。