应在thinkphp中通过行为(behavior)机制统一过滤表单数据:创建wordsfilterbehavior类,在run()方法中用引用参数 &$params 递归清洗,严格判断数据类型后调用str_replace或正则替换敏感词,并注意html实体解码与框架版本适配。

要在ThinkPHP中对所有表单提交数据自动执行敏感词替换、HTML标签清理、空格裁剪等操作,又不想在每个控制器里重复写过滤逻辑,就得用行为(Behavior)机制在请求生命周期早期统一拦截处理。
创建WordsFilterBehavior行为类
在Application/Common/Behavior/目录下新建WordsFilterBehavior.class.php文件(注意TP5+需改为WordsFilterBehavior.php并使用命名空间)。
类必须继承thinkehaviorBehavior,且run()方法接收一个引用参数&$params——这是框架传入的原始POST/GET数据快照,不是$_POST全局变量。
这一步不能漏掉&符号,否则后续所有修改都不会生效到实际请求数据中。
实现递归清洗逻辑
在run()方法内调用私有方法loopFilter(),对$params做深度遍历:
① 先判断is_string($params),是则直接进敏感词过滤;
② 若为数组,则逐层foreach,对每个值再判断类型——遇到字符串才调用filter(),遇到子数组则递归调用loopFilter();
③ 遇到对象、资源、布尔值等非标量类型,直接跳过,不传入filter()函数,否则会触发警告或崩溃。
这一步若不对类型做严格判断,深层嵌套的JSON字段或文件上传数组会被错误转义,导致入库失败。
编写安全的敏感词过滤函数
方法一:基础str_replace批量替换
从配置文件读取C('SENSITIVE_WORDS')返回的字符串数组,用str_replace($badWords, '***', $string)一次性完成全部替换——比循环调用快5倍以上,适合词库小于500条的场景。
方法二:正则边界匹配防误杀
构造'/('.implode('|', array_map('preg_quote', $words)).')/iu'正则表达式,用preg_replace()执行替换;preg_quote必须加,否则词库里带点号或方括号会直接让正则编译失败。
方法三:预处理防变体绕过
先用preg_replace('/[sp{P}]+/u', '', $string)清除所有空白符和标点,再进核心匹配——这能拦住“傻@逼”“shǎ bī”这类变形输入,但会破坏原始格式,仅限纯文本内容使用。
【注意:如果框架已对POST数据执行过htmlspecialchars(),必须先用html_entity_decode()还原,否则原始词库根本匹配不上编码后的字符串】
注册行为到系统入口
打开Application/Common/Conf/tags.php(TP3.2)或app/provider.php(TP6),在action_begin标签位置注入该行为:
TP3.2写法:'action_begin' => array('Common\Behavior\WordsFilterBehavior');
TP6写法:在provider.php中添加thinkacadeHook::listen('action_begin', $request->param());并绑定行为实例。
这一步注册后,所有控制器的input()、post()、param()获取的数据,都已是清洗过的版本。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











