在 Ubuntu 上配置 PHP 以防止常见攻击,需要从系统层面、PHP 本身、Web 服务器、应用代码多个维度来做。下面是一套实战向的安全配置建议(以 Ubuntu + Nginx/Apache + PHP-FPM 常见环境为例)。
sudo apt update
sudo apt upgrade -y
定期更新 PHP 及依赖:
sudo apt install --only-upgrade php*
PHP-FPM 默认已使用 www-data,确认:
; /etc/php/8.x/fpm/pool.d/www.conf
user = www-data
group = www-data
; 禁止执行系统命令(极端安全)
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
路径示例:
/etc/php/8.x/fpm/php.ini
/etc/php/8.x/cli/php.ini
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = Off
allow_url_include = Off
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
post_max_size = 8M
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
location ~* \.(env|git|svn|ini|log)$ {
deny all;
}
location ~* /(wp-admin|admin) {
allow 你的IP;
deny all;
}
<FilesMatch "\.(env|ini|log)$">
Require all denied
</FilesMatch>
✅ 使用 PDO + 预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
❌ 禁止字符串拼接 SQL
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
可配合:
X-XSS-Protection<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf'] ?>">
$allowed = ['jpg','png'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, $allowed)) {
die('非法文件');
}
✅ 上传目录 禁止执行 PHP
location /uploads/ {
location ~ \.php$ { deny all; }
}
sudo ufw allow 22,80,443/tcp
sudo ufw enable
sudo apt install fail2ban
composer audit)如果你愿意,可以告诉我:
我可以直接给你可复制的配置文件。