WAFPHP高阶教程
目录
WAFPHP框架开发指南
数据模型开发规范
路径结构
#your WAFPHP path#/Lib/Model/
接口规范
需实现 ModelInterface 接口,包含以下核心方法:
核心方法说明
| 方法名 | 功能描述 | 特殊要求 |
|---|---|---|
getInstance() |
单例模式实例化方法,避免多实例资源消耗 | 必须实现 |
getDefaultConfig() |
返回默认配置,与用户配置合并时以用户配置优先 | 必须实现 |
sessionExists() |
检查当前session有效性(绑定客户端IP,IP变更即失效) | 必须实现 |
sessionBreath() |
session心跳维护,每次请求更新session有效时间 | 必须实现 |
proclaimSession() |
颁发新session,记录客户端IP | 必须实现 |
addSessionValue() |
向session写入数据 | 必须实现 |
delSessionValue() |
删除session指定键值 | 必须实现 |
getSessionValue() |
获取session指定键值 | 必须实现 |
isBlackIP() |
检查客户端IP是否在黑名单 | 必须实现 |
isWhiteSession() |
检查当前session是否在白名单 | 必须实现 |
addBlackIP() |
添加IP到黑名单 | 必须实现 |
addWhiteSession() |
添加session到白名单 | 必须实现 |
delBlackIP() |
删除黑名单IP(支持通配符前缀匹配) | 必须实现 |
delWhiteSession() |
删除白名单session(支持通配符前缀匹配) | 必须实现 |
get() |
通用数据获取方法 | 必须实现 |
set() |
通用数据存储方法(建议设置过期时间) | 必须实现 |
del() |
通用数据删除方法 | 必须实现 |
getError() |
获取最后错误信息 | 必须实现 |
quit() |
资源清理方法,系统退出时自动调用 | 必须实现 |
⚠️ 特别说明:此处的session为框架自定义会话机制,与原生PHP session完全独立
检测脚本开发规范
路径结构
#your WAFPHP path#/Lib/Waf/
接口规范
需实现 WafInterface 接口,包含以下核心方法:
核心方法说明
| 方法名 | 功能描述 | 特殊要求 |
|---|---|---|
getDefaultConfig() |
提供默认配置防止系统异常 | 必须实现 |
getError() |
返回最后一次错误的详细信息 | 必须实现 |
run($config, $client) |
执行检测逻辑• $config: 当前脚本配置(WAF__CONFIG)• $client: 客户端信息数组(IP/GET/POST/UA/Cookie/Host) |
必须实现 |
开发建议
- 配置参数应包含:
- 检测阈值
- 规则模式
- 触发动作
- 客户端检测维度建议:
$client = [ 'ip' => '192.168.0.1', 'get' => $_GET, 'post' => $_POST, 'ua' => $_SERVER['HTTP_USER_AGENT'], 'cookie' => $_COOKIE, 'host' => $_SERVER['HTTP_HOST'] ];
开发最佳实践
数据模型开发
class MyModel implements ModelInterface {
// 实现单例模式
private static $instance;
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
// 默认配置示例
public function getDefaultConfig() {
return [
'session_expire' => 3600,
'blacklist_ttl' => 86400
];
}
// ...其他方法实现
}
检测脚本开发
class MyWaf implements WafInterface {
private $error = '';
public function getDefaultConfig() {
return [
'max_requests' => 100,
'time_window' => 60,
'block_action' => 'log_and_block'
];
}
public function run($config, $client) {
// 实现检测逻辑
if ($this->checkRateLimit($client['ip'], $config)) {
return true; // 通过检测
}
$this->error = '请求频率超限';
return false; // 拦截请求
}
public function getError() {
return $this->error;
}
}
开发提示:建议结合PHPStan进行静态分析,使用PHPUnit编写单元测试。调试时可通过
WAFPHP_DEBUG常量开启调试模式,查看详细的检测日志。