开源系统源码分析(filter.class.php)
<?php
class baseValidater
{
//最大参数个数
const MAX_ARGS=3;
public static function checkBool($var)
{
return filter_var($var,FILTER_VALIDATE_BOOLEAN);
}
public static function checkInt($var)
{
$args=func_get_args();
if($var!=0) $var=ltrim($var,0);
if(isset($args[1]))
{
if(isset($args[2]))
{
$options=array('options'=>array('min_range'=>$args[1],'max_range'=>$args[2]));
}else{
$options=array('options'=>array('min_range'=>$args[1]));
}
return filter_var($var,FILTER_VALIDATE_INT,$options);
}else{
return filter_var($var,FILTER_VALIDATE_INT);
}
}
public static function checkNotInt($var)
{
return !self::checkInt($var);
}
public static function checkFloat($var,$decimal=''){
return filter_var($var,FILTER_VALIDATE_FLOAT,array('options'=>array('decimal'=>$decimal)));
}
public static function checkEmail($var)
{
return filter_var($var,FILTER_VALIDATE_EMAIL);
}
public static function checkPhone($var)
{
return (validater::checkTel($var) or validater::checkMobile($var));
}
public static function checkTel($var)
{
//? 匹配0次或1次之前的原子 这个是配置是固定电话
return preg_match("/^([0-9]{3,4}-?)?[0-9]{7,8}$/",$var)
}
public static function checkMobile($var)
{
return preg_match("/^1[3-5,7,8]{1}[0-9]{9}$/",$var);
}
public static function checkURL($var)
{
return filter_var($var,FILTER_VALIDATE_URL);
}
public static function checkDomain($var)
{
return preg_match('/^([a-z0-9-]+\.[a-z]{2,15})$/',$var);
}
public static function checkIP($var,$range='all')
{
if($range=='all') return filter_var($var,FILTER_VALIDATE_IP);
if($range=='public static') return filter_var($var,FILTER_VALIDATE_IP,FILTER_FLAG_NO_PRIV_RANGE);
if($range=='private')
{
if($var=='127.0.0.1' or filter_var($var,FILTER_VALIDATE_IP,FILTER_FLAG_NO_PRIV_RANG)==false) return true
return false
}
}
//身份证
public static function checkIdcard($idcard)
{
if(strlen($idcard)!=18) return false;
$idcard=strtoupper($idcard);
$cityList=array(
'11','12','13','14','15','21','22',
'23','31','32','33','34','35','36',
'37','41','42','43','44','45','46',
'50','51','52','53','54','61','62',
'63','64','65','71','81','82','91'
);
if(!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/')) return false;
if(!in_array(substr($idcard,0,6),$cityList)) return false;
$baseCode=substr($idcard,0,17);
$verifyCode=substr($idcard,17,1);
$interference=array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$verifyConfig=array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$total=0;
for($i=0;$i<17;$i++) $total+=substr($baseCode,$i,1)*$interference[$i]';
$mod=$total%11;
return $verifyCode==$verifyConfig[$mod];
}
//substr(string,start,length)
public static function checkDate($date)
{
if($date=='0000-00-00') return true;
$stamp=strtotime($date);
if(!is_numeric($stamp)) return false;
return checkdate(date('m',$stamp),date('d',$stamp),date('Y',$stamp));
}
//检查一些日期是否是有效的格利高里日期:checkdate(月,日,年)
//date('m',时间戳)
public static function checkREG($var,$reg)
{
return filter_var($var,FILTER_VALIDATE_REGEXP,array('options'=>array('regexp'=>$reg)));
}
//FILTER_VALIDATE_REGEXP 正则表达式
public static function checkLength($var,$max,$min=0)
{
$length=function_exists('mb_strlen') ? mb_strlen($var,'utf-8'):strlen($var);
return self::checkInt($length,$min,$max);
}
//注:strlen与mb_strlen是求字符串长度的函数,在strlen计算时,对待一个UTF8的中文字符是3个长度,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算
public static function checkNotEmpty($var)
{
return !empty($var);
}
//注:若变量不存在则返回 TRUE
// * 若变量存在且其值为""、0、"0"、NULL、、FALSE、 array()、$var; 以及没有任何属性的对象,则返回 TURE
// * 若变量存在且值不为""、0、"0"、NULL、、FALSE、 array()、$var; 以及没有任何属性的对象,则返回 FALSE
public static function checkEmpty($var)
{
return empty($var);
}
public static function checkAccount($var)
{
global $config;
$accoutRule=empty($config->accountRule)?'|^[a-zA-Z0-9_]{1}[a-zA-Z0-9_\.]{1,}[a-zA-Z0-9_]{1}$|' : $config->accountRule;
return self::checkREG($var,$accountRule);
}
public static function checkCode($var)
{
return self::checkREG($var,'|^[A-Za-z0-9]+$|');
}
public static function checkCaptcha($var)
{
if(!isset($_SESSION['captcha'])) return false;
return $var==$_SESSION['captcha'];
}
public static function checkEqual($var,$value)
{
return $var==$value;
}
public static function checkNoEqual($var,$value)
{
return $var!=$value;
}
public static function checkGT($var,$value)
{
return $var>$value;
}
public static function checkLT($var,$value)
{
return $var<$value;
}
public static function checkGE($var,$value)
{
return $var>=$value;
}
public static function checkLE($var,$value)
{
return $var<=$value;
}
public static funciton checkIn($var,$value)
{
if(!is_array($value)) $value=explode(',',$value);
return in_array($var,$value);
}
public static function checkFileName($var)
{
return !preg_match('/>+|:+|<+/',$var);
}
//注:preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
public static function checkSensitive($vars,$dicts)
{
foreach($vars as $var)
{
if(!$var) continue;
foreach($dicts as $dict)
{
if(strpos($var,$dist)==false) continue;
if(strpos($var,$dist)!==false) return false;
}
}
return true;
}
//注:strpos() 函数查找字符串在另一字符串中第一次出现的位置,返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
public static function filterFiles()
{
global $config;
if(empty($_FILES)) return $_FILES;
foreach($_FILES as $varName=$files)
{
if(is_array($files['name']))
{
foreach($files['name'] as $i=>$filename)
{
$extension=ltrim(strrchr($filename,'.'),'.');
if(stripos(",{$config->file->dangers},",",{$extension},")!==false)
{
unset($_FILES);
return array();
}
}
}else{
$extension=ltrim(strrchr($files['name'],'.'),'.');
if(stripos(",{$config->file-dangers},",",{$extension},")!==false)
{
unset($_FILES);
return array();
}
}
}
return $_FILES;
}
//注:strrchr搜索某个字符在字符串中的位置,并返回从该位置到字符串结尾的所有字符
//strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
//stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
//strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
//strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
public static function filterSuper($super)
{
if(!is_array($supper)) return $supper;
$super=self::filterBadKeys($super);
foreach($super as $key => $item)
{
if(is_array($item))
{
$item=self::filterBadKeys($item);
foreach($item as $subkey=>$subItem)
{
if(is_array($subItem)) continue;
$subItem=self::filterTrojan($subItem);
$super[$key][$subkey]=self::filterXSS($subItem);
}
}else{
$item=self::filterTrojan($item);
$super[$key][$subkey]=self::filterXSS($item);
}
}
return $super;
}
public static function filterBadKeys($var)
{
global $config;
if(empty( $config->framework->filterBadKeys)) return $var;
foreach($var as $key=>$value) if(preg_match('/[^a-zA-Z0-9_\.\-]/',$key)) unset($var[$key]);
return $var;
}
public static function filterXSS($var)
{
global $config;
if(empty($config->framework->filterXSS)) return $var;
if(stripos($var,'<script')!==false)
{
$var =(string)$var;
$evils = array('appendchild(', 'createElement(', 'xss.re', 'onfocus', 'onclick', 'innerHTML', 'replaceChild(', 'html(', 'append(', 'appendTo(', 'prepend(', 'prependTo(', 'after(', 'insertBefore', 'before(', 'replaceWith(');
$replaces = array('a p p e n d c h i l d (', 'c r e a t e E l e m e n t (', 'x s s . r e', 'o n f o c u s', 'o n c l i c k', 'i n n e r H T M L', 'r e p l a c e C h i l d (', 'h t m l (', 'a p p e n d (', 'a p p e n d T o (', 'p r e p e n d (', 'p r e p e n d T o (', 'a f t e r (', 'i n s e r t B e f o r e(', 'b e f o r e (', 'r e p l a c e W i t h (');
$var = str_ireplace($evils, $replaces, $var);
}
$var = preg_replace('/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/Ui', 'j a v a s c r i p t :', $var);
return $var;
}
//注:str_ireplace(find,replace,string,count)
public static function filterParam($var,$type)
{
global $config,$filter,$app;
$moduleName=$app->getModuleName();
$methodName=$app->getMethodName();
$params=$app->getParams();
if(type=='cookie')
{
$pagerCookie='pager'.ucfirst($moduleName).ucfirst($methodName);
$filter->default->cookie[$pagerCookie]='int';
}
foreach($var as $key=>$value)
{
if($config->requestType=='GET' and $type=='get' and isset($params[$key])) continue;
$rules='';
if(isset($filter->{$moduleName}->{$methodName}->{$type}[$key]))
{
$rules=$filter->{$moduleName}->{$methodName}->{$type}[$key];
}elseif(isset($filter->{$moduleName}->default->{$type}[$key]))
{
$rules=$filter->{$moduleName}->default->{$type}[$key];
}else if(isset($filter->default->{$type}[$key]))
{
$rules=$filter->default->{$type}[$key];
}
if(!self::checkByRule($value,$rules)) unset($var[$key]);
}
return $var;
}
public static function checkByRule($var,$rule)
{
if(empty($rule)) return false;
list($operator,$param)=baseValidator::parseRuleString($rule);
$checkMethod='check'.$operator;
if(method_exists('baseValidater',$checkMethod))
{
if(empty($param) and self::$checkMethod($var)==false) return false;
if(!empty($param) and self::$checkMethod($var,$param)===false) return false;
}else if(function_exists('is_'.$operator))
{
$checkFunction='is_'.$operator;
if(!$checkFunction($var)) return false;
}else{
return false;
}
return true;
}
public static function parseRuleString($rule)
{
global $filter;
if(strpos($rule,'::')!==false) list($operator,$param)=explode('::',$rule);
if(strpos($rule,'::')===false) list($operator,$param)=array($rule,'');
if($operator=='reg' and isset($filter->rules->param)) $param=$filter->rules->$param;
return array($operator,$param);
}
//注:list() 函数用于在一次操作中给一组变量赋值。 list(var1,var2...)
public static function call($var,$func)
{
return filter_var($var,FILTER_CALLBACK,array('options'=>$func));
}
}
开源系统源码分析(filter.class.php)的更多相关文章
- Android12系统源码分析:NativeTombstoneManager
Android12系统源码分析:NativeTombstoneManager 概述 android12新增的system_server进程(LocalService)本地服务,用于管理native t ...
- Android开源框架源码分析:Okhttp
一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor ...
- [Android]开源中国源码分析之二---DrawerLayout
从启动界面到主界面之后的效果如图所示,采用的是v4包下的DrawerLayout, activity_main.xml文件如下: <!-- A DrawerLayout is intended ...
- [Android]开源中国源码分析之一---启动界面
开源中国android端版本号:2.4 启动界面: 在AndroidManifest.xml中找到程序的入口, <activity android:name=".AppStart&qu ...
- Redis学习之对象系统源码分析
背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希 ...
- bootstrap_栅格系统_响应式工具_源码分析
-----------------------------------------------------------------------------margin 为负 使盒子重叠 等高 等高 ...
- 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 百篇博客分析OpenHarmony源码 | v7.07
百篇博客系列篇.本篇为: v07.xx 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...
- 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05
百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
- 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 百篇博客分析OpenHarmony源码 | v4.05
百篇博客系列篇.本篇为: v04.xx 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...
随机推荐
- (六)storm-kafka源代码走读之PartitionManager
PartitionManager算是storm-kafka的核心类了,如今開始简单分析一下.还是先声明一下,metric部分这里不做分析. PartitionManager主要负责的是消息的发送.容错 ...
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
多生产者多消费者问题 以生产馒头 消费馒头为例. class Resource { private String name; private int count = 1; private boolea ...
- NSTimer解除循环引用
NSTimer作为一个经常使用的类,却有一个最大的弊病,就是会强引用target.造成调用timer很麻烦.稍有不慎就造成内存泄漏. 下面就是为解决问题做的封装. 直接上代码: #import < ...
- litepal更好的操作sqlite3,配置与基本操作
litepal更好的操作sqlite3 配置 在app下的build.gradle中加入 创建litepal.xml配置 在app/src/main下面创建assets,新建litepal.xml & ...
- 前端到后台ThinkPHP开发整站--php开发案例
前端到后台ThinkPHP开发整站--php开发案例 总结 还是需要做几个案例,一天一个为佳,那样才能做得快. 从需求分析着手,任务体系要构建好,这样才能非常高效. 转自: 前端到后台ThinkPHP ...
- lightoj--1214--Large Division(大数取余)
Large Division Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Submit ...
- vue中计算小数保留两位小数
代码
- 关于zxing生成二维码,在微信长按识别不了问题
在做校园学生到校情况签到系统时,我采用了zxing作为二维码生成工具.在测试的时候使用微信打开连接发现.我长按我的二维码之后,总是不会出现以下这种识别二维码的选项. 这就大大的降低了用户的体验,只能大 ...
- MYSQL8.0的安装方法
1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录 ...
- [笔记-图论]Floyd
用于可带负权的多源最短路 时间复杂度O(n^3) 注意一定不要给Floyd一个带负环的图,不然就没有什么意义了(最短路不存在) 模板 // Floyd // to get minumum distan ...