本文目录导读:

PHP代码安全加固需要从多个层面系统性地进行,以下是核心的加固措施和最佳实践:
输入验证与过滤(最关键)
严格验证所有用户输入
// 好的做法:严格类型验证
$id = (int)$_GET['id']; // 强制转为整数
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// 处理无效邮箱
}
// 使用白名单验证
$allowed_roles = ['admin', 'user', 'guest'];
if (!in_array($role, $allowed_roles)) {
die('Invalid role');
}
防止SQL注入
// 始终使用参数化查询
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
// 或使用ORM(如Eloquent/Doctrine)
$user = User::where('email', $email)->first();
防止XSS攻击
// 输出时进行转义
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// 使用模板引擎(如Twig)自动转义
echo $twig->render('profile.html', ['name' => $name]);
文件操作安全
文件上传防护
// 验证文件类型
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['file']['type'], $allowed_types)) {
die('Invalid file type');
}
// 重命名文件,防止路径遍历
$new_name = md5(uniqid()) . '.' . $ext;
$upload_path = '/uploads/' . $new_name;
文件包含防护
// 禁用远程文件包含
// php.ini: allow_url_include = Off
// 使用白名单
$allowed_pages = ['home', 'about', 'contact'];
$page = basename($_GET['page']); // 防止路径遍历
if (in_array($page, $allowed_pages)) {
include "pages/{$page}.php";
}
会话安全
配置会话安全
// session_start()前配置
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); // HTTPS下
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_samesite', 'Strict');
// 重新生成session ID
session_regenerate_id(true);
防CSRF攻击
// 生成Token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 验证表单
if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
// 处理请求
}
PHP配置加固(php.ini)
; 基本安全设置 expose_php = Off display_errors = Off log_errors = On error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; 禁用危险函数 disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source ; 资源限制 max_execution_time = 30 memory_limit = 128M post_max_size = 8M upload_max_filesize = 2M ; 文件上传安全 file_uploads = On upload_tmp_dir = /tmp/php_uploads
常见攻击防护
命令注入防护
// 避免使用shell命令,必须使用时用escapeshellarg $command = 'ls -la ' . escapeshellarg($user_dir); $output = shell_exec($command);
SSRF防护
// 限制URL访问
function is_safe_url($url) {
$parsed = parse_url($url);
$blocked = ['10.', '172.', '192.168.', '127.0.0.1', 'localhost'];
foreach ($blocked as $ip) {
if (strpos($parsed['host'], $ip) === 0) return false;
}
return true;
}
框架与工具
使用成熟框架
- Laravel:内置CSRF、XSS、SQL注入防护
- Symfony:安全组件完善
- Yii:安全特性丰富
安全工具
# 安装依赖安全检查工具 composer require --dev enlightn/security-checker # 定期扫描 php vendor/bin/security-checker security:check
持续安全措施
- 定期更新:保持PHP版本和依赖库更新
- 日志监控:配置详细的访问和错误日志
- 安全测试:使用OWASP ZAP等工具进行渗透测试
- 代码审计:使用PHPStan、Psalm进行静态分析
检查清单
- [ ] 所有用户输入已验证和过滤
- [ ] 使用参数化查询或ORM
- [ ] 输出时进行HTML转义
- [ ] 文件上传已限制类型和大小
- [ ] 会话配置安全
- [ ] 禁用危险PHP函数
- [ ] HTTPS强制使用
- [ ] 错误处理不泄露敏感信息
- [ ] 依赖库已更新至最新版本
安全是一个持续的过程,需要定期审查和更新安全策略,建议结合自动化安全测试工具和手动代码审查来确保安全性。