Ubuntu如何提升PHP安全性
小樊
42
2025-11-22 21:11:37
Ubuntu提升PHP安全性的实用清单
一 基础加固
- 保持系统与PHP为最新版本,及时修补漏洞:执行sudo apt update && sudo apt upgrade。
- 隐藏PHP版本信息,避免被针对性攻击:在 php.ini 中设置expose_php = Off。
- 关闭错误回显、开启错误日志,防止敏感信息泄露:设置display_errors = Off、log_errors = On,并指定日志路径如error_log = /var/log/php_errors.log。
- 精简攻击面:仅安装必要的PHP扩展,禁用不需要的模块(例如不需要则禁用FTP相关模块)。
- 修改后重启服务生效:如sudo systemctl restart php7.4-fpm或sudo systemctl restart apache2。
二 PHP运行时关键配置
- 禁用危险函数:在 php.ini 中设置disable_functions = eval,exec,system,passthru,shell_exec,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source(按应用实际白名单化保留)。
- 限制远程资源包含与读取:设置allow_url_fopen = Off、allow_url_include = Off。
- 上传安全:限制大小与类型,建议upload_max_filesize = 2M、post_max_size = 8M;上传目录禁止执行脚本(见第四部分Nginx示例)。
- 资源与执行限制:设置max_execution_time = 30、memory_limit = 128M,降低DoS风险。
- 会话安全:开启session.cookie_httponly = On、session.cookie_secure = On,并在代码中执行session_regenerate_id(true);为Cookie设置SameSite=Strict。
- 文件系统隔离:按需使用open_basedir限制脚本可访问目录(如仅允许**/var/www与/tmp**),减少目录遍历风险。
三 服务器与网络层防护
- 全站启用HTTPS/TLS:使用Let’s Encrypt获取免费证书,Apache执行sudo apt install certbot python3-certbot-apache后运行sudo certbot --apache -d yourdomain.com;Nginx可用python3-certbot-nginx。
- 防火墙最小化开放:启用UFW,仅放行80/443与SSH(如sudo ufw allow 'Nginx Full’或sudo ufw allow ‘Apache Full’,以及sudo ufw allow ‘OpenSSH’)。
- Web应用防火墙与防暴力:部署ModSecurity(Apache)与fail2ban,缓解常见Web攻击与暴力破解。
- 隐藏服务器标识:Apache设置ServerTokens Prod、ServerSignature Off,降低信息泄露。
四 文件权限与Web服务器配置
- 文件与目录权限:网站根目录建议chown -R www-data:www-data /var/www/html、chmod -R 755 /var/www/html,上传目录单独设置更严格权限。
- Apache建议:在虚拟主机或目录配置中关闭目录索引(Options -Indexes),避免泄露目录结构。
- Nginx建议:将PHP处理与静态资源分离,并对上传目录禁止解析PHP,示例:
- 处理PHP:
- location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; }
- 禁止上传目录执行:
- location /(uploads|assets)/.*.(php|php5|jsp) { deny all; }
- 禁止访问.ht*文件:
- location ~ /.ht { deny all; }
- 修改后重启对应服务使配置生效。
五 应用与运维实践
- 依赖与漏洞管理:使用Composer管理依赖并执行composer update;定期使用PHP Security Advisories Checker等工具扫描依赖安全。
- 安全编码:对数据库访问使用预处理语句/参数化查询防止SQL注入;输出到页面前进行输出编码以缓解XSS。
- 密码存储:使用**password_hash() / password_verify()**进行安全哈希,禁止明文或弱哈希。
- 备份与演练:定期备份代码与数据库(如rsync、mysqldump),并验证恢复流程。
- 持续监控:启用并监控访问日志/错误日志,结合IDS/IPS或集中化日志平台及时发现异常。