<?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);

}

//注:strlenmb_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)的更多相关文章

  1. Android12系统源码分析:NativeTombstoneManager

    Android12系统源码分析:NativeTombstoneManager 概述 android12新增的system_server进程(LocalService)本地服务,用于管理native t ...

  2. Android开源框架源码分析:Okhttp

    一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor ...

  3. [Android]开源中国源码分析之二---DrawerLayout

    从启动界面到主界面之后的效果如图所示,采用的是v4包下的DrawerLayout, activity_main.xml文件如下: <!-- A DrawerLayout is intended ...

  4. [Android]开源中国源码分析之一---启动界面

    开源中国android端版本号:2.4 启动界面: 在AndroidManifest.xml中找到程序的入口, <activity android:name=".AppStart&qu ...

  5. Redis学习之对象系统源码分析

    背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希 ...

  6. bootstrap_栅格系统_响应式工具_源码分析

    -----------------------------------------------------------------------------margin 为负 ​使盒子重叠 ​等高 等高 ...

  7. 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 百篇博客分析OpenHarmony源码 | v7.07

    百篇博客系列篇.本篇为: v07.xx 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...

  8. 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05

    百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  9. 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 百篇博客分析OpenHarmony源码 | v4.05

    百篇博客系列篇.本篇为: v04.xx 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

随机推荐

  1. redhat下搭建jdk+tomcat环境

    由于redhat自带安装了jdk,我们需要现将其进行卸载 卸载系统自带的jdk版本: 查看自带的jdk: 输入命令:rpm -qa|grep gcj 可能看到如下类似的信息: libgcj-4.1.2 ...

  2. Unix发展史

    简述 了解过去,我们才能知其然,更知所以然.总结过去,我们才会知道明天该何去何从.在时间的滚轮中,许许多多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道.流传 ...

  3. Qt之QImageReader

    简述 QImageReader类为从文件或设备读取图像提供了一个独立的接口. 读取图像最常用的方法是通过构造QImage和QPixmap,或通过调用QImage::load()和QPixmap::lo ...

  4. 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)

    ndk编译C++.提示找不到头文件(ndk-build error: string: No such file or directory) 被这个问题弄得愁眉苦脸啊.心想为啥一个string都找不到呢 ...

  5. CodeForces 550B Preparing Olympiad(DFS回溯+暴力枚举)

    [题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每一个题目有对应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x, ...

  6. 手机Android音视频採集与直播推送,实现单兵、移动监控类应用

    最新手机採集推送直播监控以及EasyDarwin开源流媒体平台的版本号及代码: EasyDarwin 开源流媒体云平台:https://github.com/easydarwin EasyClient ...

  7. 解析UML用例图中include与extend的区别

    UML用例图有很多值得学习的地方,这里向大家简单介绍一下UML用例图中include与extend的区别,希望本文的介绍对你有所帮助. 本文和大家重点讨论一下UML用例图中include与extend ...

  8. webi和universe

    Universe是一个包含以下内容的文件: 1 一个或多个数据库中间件的连接参数. 2 称为对象的SQL结构,映射到数据库中的实际SQL结构,如列,表和数据库函数.其中对象是按类分组的.用户既可以看到 ...

  9. .net 操作INI文件

    using System.Runtime.InteropServices; using System.Text; namespace FaureciaManager { public class Fi ...

  10. PostgreSQL源代码中插件的使用

    如果编译数据库时使用了gmake world和gmake install-world, 所有的插件都会被安装, 那么就不需要再次安装了. 插件目录 contrib 进入要安装的插件目录, 例如 cd ...