简单的宝塔waf防火墙php代码
[]// waf.php
// 定义错误处理函数
function handleError($message, $statusCode = 403) {
http_response_code($statusCode);
echo "
Forbidden
$message
";
exit;
}
// 获取客户端IP
function getClientIP() {
if (isset($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP']) {
return $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']) {
// 处理可能存在的多个IP
$ipList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
return trim($ipList[0]);
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR']) {
return $_SERVER['REMOTE_ADDR'];
}
return 'UNKNOWN';
}
// 简单的速率限制
function rateLimit($ip, $limit = 100, $timeFrame = 60) {
$logFile = __DIR__ . '/waf_logs/' . $ip;
$currentTime = time();
// 创建日志目录
if (!is_dir(__DIR__ . '/waf_logs/')) {
mkdir(__DIR__ . '/waf_logs/', 0755, true);
}
// 清理过期的记录
if (file_exists($logFile)) {
$log = file_get_contents($logFile);
$logEntries = explode("\n", $log);
$filteredEntries = [];
foreach ($logEntries as $entry) {
if ($entry) {
list($timestamp) = explode('|', $entry);
if (($currentTime - $timestamp) < $timeFrame) {
$filteredEntries[] = $entry;
}
}
}
$log = implode("\n", $filteredEntries);
} else {
$log = '';
}
// 检查是否超过限制
if (substr_count($log, "\n") >= $limit) {
handleError('请求过于频繁,请稍后再试。');
}
// 记录当前请求
$log .= $currentTime . '|' . $currentTime . "\n";
file_put_contents($logFile, $log);
}
// 过滤恶意请求
function filterRequest() {
$clientIP = getClientIP();
// 速率限制
rateLimit($clientIP);
// 获取所有输入数据
$input = $_REQUEST;
foreach ($input as $key => $value) {
// 简单的SQL注入防护
if (preg_match('/\b(SELECT|INSERT|UPDATE|DELETE|DROP|TRUNCATE|UNION|EXEC)\b/i', $value)) {
handleError('检测到潜在的SQL注入攻击。');
}
// 简单的XSS防护
if (preg_match('/<script\b[^>]*>(.*?)<\/script>/is', $value)) {
handleError('检测到潜在的XSS攻击。');
}
// 其他防护规则可以在这里添加
}
// 过滤URL参数
foreach ($_GET as $key => $value) {
if (preg_match('/[\x00-\x1F\x7F<>"\'%;()&]/', $value)) {
handleError('检测到恶意输入。');
}
}
// 过滤POST参数
foreach ($_POST as $key => $value) {
if (preg_match('/[\x00-\x1F\x7F<>"\'%;()&]/', $value)) {
handleError('检测到恶意输入。');
}
}
}
// 调用防护函数
filterRequest();
// 如果没有触发防护规则,继续执行
?>[/]
拯救了 168 人的帖子