Ubuntu下PHP安全设置指南
保持系统和PHP及其依赖库的最新状态,是修复已知安全漏洞的核心措施。定期执行以下命令更新系统及PHP组件:
sudo apt update && sudo apt upgrade -y
sudo apt install php php-cli php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip --only-upgrade
php.ini是PHP安全的核心配置文件,需根据实际环境修改以下关键参数:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
allow_url_fopen和allow_url_include,防止通过URL访问或包含远程文件(如恶意脚本)。allow_url_fopen = Off
allow_url_include = Off
disable_functions = eval,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
upload_max_filesize = 2M
post_max_size = 8M
file_uploads = On
session.cookie_httponly = On
session.cookie_secure = On
session.gc_maxlifetime = 1440 # 会话有效期(分钟)
max_execution_time = 30
memory_limit = 128M
expose_php,隐藏服务器上的PHP版本信息(减少针对性攻击)。expose_php = Off
open_basedir限制PHP脚本只能访问指定目录(如网站根目录和临时目录),防止越权访问系统文件。open_basedir = /var/www/html/:/tmp/
sudo a2enmod php7.x # 替换为实际PHP版本
sudo a2dismod php7.y # 禁用不需要的PHP版本
/etc/apache2/apache2.conf或虚拟主机配置),限制错误信息泄露并设置目录权限:ServerTokens Prod # 隐藏Apache版本信息
ServerSignature Off # 禁止在错误页面显示服务器信息
<Directory /var/www/html>
Options -Indexes # 禁止目录列表
AllowOverride None # 禁止.htaccess覆盖配置
Require all granted
</Directory>
sudo systemctl restart apache2
fastcgi_pass指向正确的PHP-FPM socket):location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.x-fpm.sock; # 替换为实际PHP版本
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
sudo systemctl restart nginx
sudo apt install libapache2-mod-security2
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
sudo systemctl restart apache2
sudo ufw allow 'Apache Full' # 允许HTTP和HTTPS
sudo ufw allow ssh
sudo ufw enable # 启用防火墙
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll();
SELECT、INSERT、UPDATE),避免使用root用户连接数据库。www-data)有读取权限,但无写入权限;上传目录可写入但不可执行脚本):sudo chown -R www-data:www-data /var/www/html # 将所有权赋予Web服务器用户
sudo chmod -R 755 /var/www/html # 设置目录权限为755(所有者可读写执行,其他用户可读执行)
sudo chmod -R 775 /var/www/html/uploads # 上传目录设置为775(允许Web服务器写入)
sudo chcon -R -t httpd_sys_rw_content_t /var/www/html/uploads # (可选)针对SELinux系统设置上下文
/var/log/php_errors.log)和Web服务器错误日志(如Apache的/var/log/apache2/error.log),及时发现异常行为(如大量404请求、SQL错误)。可使用工具(如fail2ban)自动封禁恶意IP地址。lynis)定期扫描系统,检查PHP配置的安全性(如是否存在未禁用的危险函数、是否暴露了敏感信息)。sudo apt install lynis
sudo lynis audit system
通过以上步骤,可显著提升Ubuntu环境下PHP应用的安全性,防范常见的Web攻击(如SQL注入、XSS、文件上传漏洞等)。需根据实际应用场景调整配置(如调整上传文件大小、开放必要端口),并持续关注安全动态以应对新威胁。