博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP违禁词敏感词 全站文件扫描
阅读量:5077 次
发布时间:2019-06-12

本文共 11504 字,大约阅读时间需要 38 分钟。

全站违禁词扫描下载地址

https://files.cnblogs.com/files/kingchou/%E8%BF%9D%E7%A6%81%E8%AF%8D%E7%B1%BB%E6%96%87%E4%BB%B6.rar

 

全站扫描违禁词代码

require_once ROOT_PATH."/Banned.php";          $banned=new Banned();       $banned->write_html=true;       $banned->write_log=true;       $banned->check_type="file";       $banned->checkFileAll();

  

 

类文件

'', "check_sub_dir"=>array('web'), 'check_type'=>'file', 'banned_from'=>'table', 'clean'=>false, 'fornum'=>20, 'write_html'=>false, 'write_log'=>false, 'bannedword'=>true,); /** *初始化方法 */ public function __construct($config=array()) { if(!empty($config)) { $this->_config = array_merge($this->_config, $config); } $this->BannedInit(); } /** * 设置key * @param $key * @param $value */ public function __set($key, $value) { $this->_config[$key] = $value; } /** * 读取key * @param $key * @return mixed */ public function __get($key) { return $this->_config[$key]; } /** * 初始化违禁词和敏感词 */ private function BannedInit(){ $this->logtime=date("YmdHis"); $this->document_root=$_SERVER['DOCUMENT_ROOT']; //初始化加载违禁词 否则默认读取文件中的违禁词 //敏感词正则规则 $mingan_words= $this->getMinganWords(); $this->match_mingan=$this->generateRegularExpression($mingan_words); //违禁词正则规则 $banned_words= $this->getBannedWords(); $this->match_banned=$this->generateRegularExpression($banned_words); } /** * 检测所有内容 */ public function checkAll(){ //判断类型是数据库 if($this->_config['check_type']=="file"){ return $this->checkFileAll();//检测文件 } } /** * 检查文件 */ public function checkFileAll(){ $path=$this->_config['path']; if(!$path){ $path=$this->document_root.""; } $laststr= substr($path, -1); if($laststr!="/"){ $path.="/"; } $dir_list= $this->getDir($path); //判断是否包含子目录 if(count($dir_list)>0){ foreach ($dir_list as $dirkey=>$dirvalue){ if(empty($dirvalue)){ continue; } //判断是否是允许检测的子目录 // if(in_array($dirvalue,$this->_config['check_sub_dir'])){ $subpath=$path.$dirvalue.'/'; $this->check_sub_dir($subpath); // } } } return true; } /** * 检测单条内容 */ public function check($content){ if($this->_config['check_type']=="file"){ return $this->check_file($content);//检测文件 } } /** * 检测单条文本内容 * @param $content */ public function check_text($content){ $res_mingan=array();$res_banned=array(); $this->__check_content($content,$res_mingan,$res_banned); $data['mingan']=$res_mingan; $data['banned']=$res_banned; return $data; } /** * 检测单条文件内容 * @param $content */ public function check_file($content){ $res= $this->__check_file($content); $this->set_finish_path($content); return $res; } /** * 迭代检查子文件目录 * @param $path */ function check_sub_dir($path){ $file_list= $this->getFile($path);//获取文件目录 if(count($file_list)>0){ foreach ($file_list as $filekey=>$filevalue){ if(empty($filevalue)) continue; $this->__check_file($filevalue);//执行检查文件 } } $dir_list= $this->getDir($path);//获取文件夹目录 if(count($dir_list)>0){ foreach ($dir_list as $dirkey=>$dirvalue){ if(empty($dirvalue)){ continue; } $subpath=$path.$dirvalue.'/'; $this->check_sub_dir($subpath); } } } /** * 验证单个文件 * @param $filepath */ function __check_file($filepath){ //判断文件是否已经完成检查,如果已经完成则不需要检查 if(!$filepath) return; if(in_array($filepath,$this->finish_path)) return; if(!file_exists($filepath)) return; if(stripos($filepath,"mingan_words.txt")>0 || stripos($filepath,"banned_words.txt")>0 ){ return ; } //判断文件如果是 违禁词或敏感词文件则跳过不处理 $content = file_get_contents($filepath); $res_mingan=array();$res_banned=array(); $this->__check_content($content,$res_mingan,$res_banned); $data=array(); if($res_mingan || $res_banned){//如果有敏感词或违禁词则写日志 $this->write_log($filepath,$res_mingan,$res_banned); $this->write_html($filepath,$res_mingan,$res_banned); $data['mingan']=$res_mingan; $data['banned']=$res_banned; } //执行保存文件路径 return $data; } /** * 检查内容 * @param $content * @param $res_mingan * @param $res_banned */ private function __check_content($content,&$res_mingan,&$res_banned){ //检查敏感词 $res_mingan=$this->check_words($this->match_mingan,$content); //检查违禁词 $res_banned=$this->check_words($this->match_banned,$content); } /** * 检查敏感词 * @param $banned * @param $string * @return bool|string */ private function check_words($banned,$string) { $match_banned=array(); //循环查出所有敏感词 $new_banned=strtolower($banned); $i=0; do{ $matches=null; if (!empty($new_banned) && preg_match($new_banned, $string, $matches)) { $isempyt=empty($matches[0]); if(!$isempyt){ $match_banned = array_merge($match_banned, $matches); $matches_str=strtolower($this->generateRegularExpressionString($matches[0])); $new_banned=str_replace("|".$matches_str."|","|",$new_banned); $new_banned=str_replace("/".$matches_str."|","/",$new_banned); $new_banned=str_replace("|".$matches_str."/","/",$new_banned); } } $i++; if($i>$this->_config['fornum']){ $isempyt=true; break; } }while(count($matches)>0 && !$isempyt); //查出敏感词 if($match_banned){ return $match_banned; } //没有查出敏感词 return array(); } /** * @describe 生成正则表达式 * @param array $words * @return string */ private function generateRegularExpression($words) { $regular = implode('|', array_map('preg_quote', $words)); return "/$regular/i"; } /** * @describe 生成正则表达式 * @param array $words * @return string */ private function generateRegularExpressionString($string){ $str_arr[0]=$string; $str_new_arr= array_map('preg_quote', $str_arr); return $str_new_arr[0]; } /** * 写日志 * @param $path * @param $content */ private function write_log($location,$contentarr,$weijinciarr){ if($this->_config['write_log']) { if (!$contentarr && !$weijinciarr) { return; } $content = $location; if (count($contentarr) > 0) { $content .= "," . count($contentarr) . "," . implode('|', $contentarr); } else { $content .= ",,"; } if (count($weijinciarr) > 0) { $content .= "," . count($weijinciarr) . "," . implode('|', $weijinciarr); } else { $content .= ",,"; } $content .= "\r\n"; $filename =$this->document_root."/logs/file" . $this->logtime . "/file_bannwords.csv"; /* 文件日志路径 */ // $file = './' . $filename; $file = $filename; if (!file_exists($file)) { $pathdir = dirname($file); if (!is_dir($pathdir)) { mkdir($pathdir, 0775, true); } $content_title = "位置,敏感词数量,敏感词,违禁词数量,违禁词" . "\r\n"; error_log(iconv('UTF-8', 'GB2312', $content_title), 3, $file); } error_log(iconv('UTF-8', 'GB2312', $content), 3, $file); } } /** * 打印到页面上 * @param $filepath * @param $res_mingan * @param $res_banned */ private function write_html($location,$res_mingan,$res_banned){ if($this->_config['write_html']){ print_r(iconv('GB2312','UTF-8',$location)); if($res_mingan){ print_r(" 敏感词(".count($res_mingan)."):".implode('|',$res_mingan)); } if($res_banned){ print_r(" 违禁词(".count($res_banned)."):".implode('|',$res_banned)); } echo "
"; } } /** * 保存已完成文件 * @param $path */ private function set_finish_path($path){ if(!$path){ return; } $content =$path. "\r\n"; $filename=$this->document_root."/logs/file" . $this->logtime . "/banned_finish_path.txt"; /* 文件日志路径 */ // $file ='./' . $filename; $file = $filename; if (!file_exists($file)) { mkdir(dirname($file), 0775, true); } error_log(iconv('GB2312','UTF-8',$content), 3, $file); } //重置已完成文件/* function clean_finish_file(){ $filename=$this->document_root."/logs/banned_finish_path.txt"; file_put_contents($filename,''); }*/ //获取文件目录列表,该方法返回数组 private function getDir($dir) { $dirArray[]=NULL; if (is_dir($dir)) { try{ if (false != ($handle = @opendir($dir))) { $i = 0; while (false !== ($file = @readdir($handle))) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".." && !strpos("*" . $file, ".")) { $dirArray[$i] = $file; $i++; } } //关闭句柄 @closedir($handle); } }catch (Exception $ex){ } } return $dirArray; } //获取文件列表 private function getFile($dir) { $fileArray[]=NULL; if (false != ($handle = @opendir ( $dir ))) { $i=0; while ( false !== ($file = @readdir ( $handle )) ) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".." && (strpos($file,".php") || strpos($file,".html"))) { $fileArray[$i]=$dir.$file; if($i==1000){//当同一个文件下超出1000个文件则跳出循环 break; } $i++; } } //关闭句柄 @closedir ( $handle ); } return $fileArray; } //获取敏感词文件 private function getMinganWords(){ $shehuangwords=file_get_contents($this->document_root."/words/forbidden.txt"); // $shehuangwords=iconv("GBK","UTF-8",$shehuangwords); $shehuangword_arr=explode("\r\n",$shehuangwords); return $shehuangword_arr; } //获取违禁词文件 private function getBannedWords(){ if($this->_config['bannedword']){ $guanggaowords=file_get_contents($this->document_root."/words/banned.txt"); // $guanggaowords=iconv("GBK","UTF-8",$guanggaowords); $guanggaowords_arr=explode("\r\n",$guanggaowords); return $guanggaowords_arr; }else{ return array(); } }}

  

 

转载于:https://www.cnblogs.com/kingchou/p/7943304.html

你可能感兴趣的文章
Spring MVC 入门(二)
查看>>
格式化输出数字和时间
查看>>
页面中公用的全选按钮,单选按钮组件的编写
查看>>
java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
查看>>
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
python的列表与shell的数组
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>