php实现waf功能
PHP实现WAF(Web应用防火墙)功能
WAF用于保护Web应用免受常见攻击(如SQL注入、XSS等)。以下是基于PHP实现简易WAF的核心方法:
输入过滤与验证
对用户输入进行严格过滤,使用filter_var或自定义正则匹配:
$input = $_GET['user_input'];
$filtered_input = filter_var($input, FILTER_SANITIZE_STRING);
SQL注入防护
使用预处理语句替代直接拼接SQL,例如PDO方式:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $user_input, PDO::PARAM_INT);
$stmt->execute();
XSS防护
输出时对特殊字符进行转义,可使用htmlspecialchars:
echo htmlspecialchars($user_content, ENT_QUOTES, 'UTF-8');
请求频率限制
防止暴力破解,记录IP请求次数:
$ip = $_SERVER['REMOTE_ADDR'];
$key = "rate_limit_$ip";
$current = apcu_fetch($key);
if ($current > 100) {
header("HTTP/1.1 429 Too Many Requests");
exit;
}
apcu_inc($key);
敏感函数禁用
在php.ini中禁用危险函数:
disable_functions = "exec,passthru,shell_exec,system"
用户代理检测
拦截恶意爬虫或扫描器:
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/sqlmap|nmap|wget|curl/i', $userAgent)) {
header('HTTP/1.0 403 Forbidden');
exit;
}
文件上传防护
检查文件类型和内容:
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['file']['type'], $allowed_types)) {
die("Invalid file type");
}
正则规则匹配
定义常见攻击模式的正则规则库:
$patterns = [
'/\bunion\b.+?\bselect\b/is',
'/<script.*?>.*?<\/script>/is'
];
foreach ($patterns as $pattern) {
if (preg_match($pattern, $input)) {
log_attack();
block_request();
}
}
日志记录功能
记录可疑请求便于分析:
function log_attack() {
$log = date('Y-m-d H:i:s') . " - Attack detected: " . $_SERVER['REQUEST_URI'];
file_put_contents('/var/log/waf.log', $log.PHP_EOL, FILE_APPEND);
}
实现建议
- 将WAF逻辑封装为独立类或中间件
- 定期更新防护规则模式
- 考虑使用成熟的开源方案(如ModSecurity)作为补充
以上方法需根据实际业务需求调整,建议配合服务器级WAF(如Cloudflare、NAXSI)使用。







