PHPWeb安全通用防护策略
Web安全是开发的基础。从输入验证到输出转义,每一步都关系到应用的安全。今天说说PHP中基础的Web安全防护。
防止路径遍历。
```php
function safeFilePath(string $baseDir, string $path): string
{
$baseDir = realpath(rtrim($baseDir, '/'));
$fullPath = realpath($baseDir . '/' . $path);
if ($fullPath === false || !str_starts_with($fullPath, $baseDir)) {
throw new RuntimeException("无效的文件路径");
}
return $fullPath;
}
try {
$path = safeFilePath('/var/www/uploads', $_GET['file']);
readfile($path);
} catch (RuntimeException $e) {
echo "文件访问被拒绝";
}
?>
防止HTTP响应头注入。
```php
$location = filter_var($_GET['redirect'] ?? '', FILTER_SANITIZE_URL);
if (filter_var($location, FILTER_VALIDATE_URL)) {
header("Location: $location");
}
// 安全地设置头信息
function safeHeader(string $name, string $value): void
{
$name = str_replace(["\r", "\n"], '', $name);
$value = str_replace(["\r", "\n"], '', $value);
header("$name: $value");
}
?>
文件包含防护。
```php
// 不安全
include $_GET['page'] . '.php';
// 安全
$allowedPages = ['home', 'about', 'contact'];
$page = $_GET['page'] ?? 'home';
if (!in_array($page, $allowedPages)) $page = 'home';
include __DIR__ . '/pages/' . $page . '.php';
?>
反序列化防护。
```php
// 不安全
$data = unserialize($_POST['data']);
// 安全
function safeUnserialize(string $data, array $allowedClasses = []): mixed
{
return unserialize($data, ['allowed_classes' => $allowedClasses]);
}
$data = safeUnserialize($_POST['data'], [User::class]);
?>
安全响应头。
```php
header('X-Frame-Options: DENY');
header('X-Content-Type-Options: nosniff');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: strict-origin-when-cross-origin');
header("Content-Security-Policy: default-src 'self'");
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
?>
输入验证的基本原则。
```php
// 验证邮箱
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if ($email === false) die("无效的邮箱");
// 验证整数范围
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 150]]);
if ($age === false) die("无效的年龄");
// 验证URL
$url = filter_var($_POST['url'], FILTER_VALIDATE_URL);
if ($url === false) die("无效的URL");
?>
Web安全的几个基本原则。不要信任用户输入,输出到HTML要转义,敏感信息加密存储,关键操作验证权限和token。把这几条牢牢记住了,大部分安全漏洞都能避免。
PHPWeb安全通用防护策略