# EasyWaf **Repository Path**: 392223903/easy-waf ## Basic Information - **Project Name**: EasyWaf - **Description**: 免费PHP_WAF - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-04-18 - **Last Updated**: 2025-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

EasyWaf简单易用的PHP_WEB应用防火墙

##

项目介绍

EasyWaf是一个基于PHP的Composer包,旨在帮助开发人员轻松地加强其Web应用程序的安全性。该包提供了针对SQL注入、CC攻击防护、SEO爬虫IP真伪侦测、跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的强大防护功能,让开发人员能够更好地保护他们的应用免受恶意攻击。

##

Composer安装

~~~ composer require easy-waf/easy-waf ~~~ ##
【A】. 配置防护规则
~~~ // 连接redis $redis = new Redis(); $redis->pconnect('127.0.0.1'); // 启动waf防护 $wafConfig = [ 'debug' => true, // 是否开启debug模式,开启后将输出waf拦截信息 'redis' => $redis, // redis实例对象,用于CC防火墙和爬虫拦截 'checkCc' => [ 'enable' => true, // 是否开启CC攻击防护 'enableSeoIpCheck' => true, // 开启SEO-IP检查,避免误伤百度蜘蛛等优化IP,此功能需要配合cli.php示例配置 'seoFriendly' => true, // 是否SEO友好,不需要SEO的网站请关闭,防御效果更好 'reqTime' => 60, // 请求时间间隔,单位秒 'reqCount' => 30, // 单位时间内请求次数限制 'reqDayMaxCount' => 365, // 每日请求最大次数限制,0则不限制(单个IP限制) ], 'illegalReqCallback' => function ($businessCode) use ($redis) { // 拦截后的回调函数,根据业务码进行业务处理,可不配置 // businessCode说明 // 100 触发请求频繁 101 触发每日请求最大次数限 102 GET参数包含非法字符串 103 POST参数包含非法字符串 104 COOKIE参数包含非法字符串 // 105 UserAgent为空 106 UserAgent包含非法字符串 107 禁止代理IP访问 108 请求方法不合法,例如禁止POST请求 // 例子, 将触发的IP加入IP检查队列,CLI进程需开启,然后自动拉黑 $checkCode = [100, 101, 105, 106, 107]; if (in_array($businessCode, $checkCode)) { $ip = Utils::getClientRealIp(); if ($ip) { $redis->lPush(Enums::WafCheckIpDnsQueueKey, $ip); } } }, 'checkGet' => true, // 是否开启GET参数防护,如SQL注入 'checkPost' => true, // 是否开启POST参数防护,如SQL注入 'checkCookie' => true, // 是否开启COOKIE参数防护,如SQL注入 'checkUserAgent' => true, // 是否开启UserAgent参数防护,如各种垃圾爬虫,扫描器等 'checkProxyRequest' => true, // 是否开启代理请求检查,拦截代理请求 'checkRequestMethod' => ['get', 'post', 'option'], // 是否开启请求方法检测,仅允许get,post,option请求方法 ]; (new Waf($wafConfig))->run(); ~~~ ##
【B】. 独立进程模式检测真假SEO蜘蛛IP
~~~ // 连接Redis $redis = new Redis(); $redis->connect('127.0.0.1'); // IP白名单和黑名单有效期 $expire = 86400 * 365; // 读取队列数据 while (true) { // 读取Ip $ipData = $redis->brPop(Enums::WafCheckIpDnsQueueKey, 15); if (!$ipData) { continue; } $ip = $ipData['1']; echo '正在检查IP: ' . $ip . PHP_EOL; // 如果IP在白名单,跳过 $ipWhiteKey = Utils::getIpCacheKey($ip, Enums::WafIpWhiteListKey); if ($redis->get($ipWhiteKey)) { echo '此IP: ' . $ip . '命中白名单,跳过' . PHP_EOL; continue; } // 如果IP在黑名单,跳过 $ipBlackKey = Utils::getIpCacheKey($ip, Enums::WafIpBlackListKey); if ($redis->get($ipBlackKey)) { echo '此IP: ' . $ip . '命中黑名单,跳过' . PHP_EOL; continue; } // 查询IP-DNS信息 $checkIpCount = 3; $dns = ''; while ($checkIpCount--) { $dns = Utils::reverseDnsLookup($ip); if ($dns) { break; } } // 根据IP查询结果处理 if (!$dns) { echo '此IP: ' . $ip . '查询DNS失败,已添加黑名单' . PHP_EOL; $redis->setex($ipBlackKey, $expire, true); } else { if (!Utils::isSeoFriendlyDns($dns)) { // IP黑名单 echo '此IP: ' . $ip . '伪造SEO蜘蛛,已添加黑名单' . PHP_EOL; $redis->setex($ipBlackKey, $expire, true); } else { // IP白名单 echo '此IP: ' . $ip . '为真正的SEO蜘蛛,已添加白名单' . PHP_EOL; $redis->setex($ipWhiteKey, $expire, true); } } } ~~~