首页 > 开发 > Php > 正文

ThinkPHP框架安全实现分析

2020-02-21 20:46:04
字体:
来源:转载
供稿:网友

ThinkPHP框架是国内比较流行的PHP框架之一,虽然跟国外的那些个框架没法比,但优点在于,恩,中文手册很全面。最近研究SQL注入,之前用TP框架的时候因为底层提供了安全功能,在开发过程中没怎么考虑安全问题。

一、不得不说的I函数

TP系统提供了I函数用于输入变量的过滤。整个函数主体的意义就是获取各种格式的数据,比如I('get.')、I('post.id'),然后用htmlspecialchars函数(默认情况下)进行处理。

如果需要采用其他的方法进行安全过滤,可以从/ThinkPHP/Conf/convention.php中设置:

'DEFAULT_FILTER'    => 'strip_tags',//也可以设置多种过滤方法'DEFAULT_FILTER'    => 'strip_tags,stripslashes',

从/ThinkPHP/Common/functions.php中可以找到I函数,源码如下:

/** * 获取输入参数 支持过滤和默认值 * 使用方法: * <code> * I('id',0); 获取id参数 自动判断get或者post * I('post.name','','htmlspecialchars'); 获取$_POST['name'] * I('get.'); 获取$_GET * </code> * @param string $name 变量的名称 支持指定类型 * @param mixed $default 不存在的时候默认值 * @param mixed $filter 参数过滤方法 * @param mixed $datas 要获取的额外数据源 * @return mixed */function I($name,$default='',$filter=null,$datas=null) {  static $_PUT  =  null;  if(strpos($name,'/')){ // 指定修饰符    list($name,$type)   =  explode('/',$name,2);  }elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串    $type  =  's';  }  /*根据$name的格式获取数据:先判断参数的来源,然后再根据各种格式获取数据*/  if(strpos($name,'.')) {list($method,$name) =  explode('.',$name,2);} // 指定参数来源  else{$method =  'param';}//设定为自动获取  switch(strtolower($method)) {    case 'get'   :  $input =& $_GET;break;    case 'post'  :  $input =& $_POST;break;    case 'put'   :  /*此处省略*/    case 'param'  :  /*此处省略*/    case 'path'  :  /*此处省略*/  }  /*对获取的数据进行过滤*/  if('' // 获取全部变量    $data    =  $input;    $filters  =  isset($filter)?$filter:C('DEFAULT_FILTER');    if($filters) {      if(is_string($filters)){$filters  =  explode(',',$filters);} //为多种过滤方法提供支持      foreach($filters as $filter){        $data  =  array_map_recursive($filter,$data); //循环过滤      }    }  }elseif(isset($input[$name])) { // 取值操作    $data    =  $input[$name];    $filters  =  isset($filter)?$filter:C('DEFAULT_FILTER');    if($filters) {   /*对参数进行过滤,支持正则表达式验证*/      /*此处省略*/    }    if(!empty($type)){ //如果设定了强制转换类型      switch(strtolower($type)){        case 'a': $data = (array)$data;break;  // 数组         case 'd': $data = (int)$data;break;  // 数字         case 'f': $data = (float)$data;break;  // 浮点          case 'b': $data = (boolean)$data;break;  // 布尔        case 's':  // 字符串        default:$data  =  (string)$data;      }    }  }else{ // 变量默认值    $data    =  isset($default)?$default:null;  }  is_array($data) && array_walk_recursive($data,'think_filter'); //如果$data是数组,那么用think_filter对数组过滤  return $data;}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表