如何实现一个php框架系列文章【5】安全处理输入

所有的外部输入参数都应该检查合法性。

未正确处理输入数据将可能导致sql注入等漏洞。

框架提供系列函数来取$_REQUEST中的值

requestInt

requestString

requestFloat

requestBool

ps:注意$_REQUEST中变量类型可能会是数组

如请求为 ?i[]=1,那么$_REQUEST[‘i‘] 的值为array(1)

做校验的时候要考虑全面以防止php warning信息泄露

另外再介绍一下kv json格式的数据校验。

有时为了在项目中保留一定扩展性,会使用json格式的数据,这种数据又该如何校验呢。

//校验键值形式{k1:v1, k2:v2, k3:v3 ...}的json数据,可以对每一对kv进行校验

requestKvJson

部分实现代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

//校验整数,失败返回$default

function checkInt($var$default = 0) {

    return  is_numeric($var) ? intval($var, (strncasecmp($var‘0x‘, 2) == 0 || strncasecmp($var‘-0x‘, 3) == 0) ? 16 : 10) : $default;

}

//校验字符串 $check为正则表达式

function checkString($var$check ‘‘$default ‘‘) {

    if (!is_string($var)) {

        if(is_numeric($var)) {

            $var = (string)$var;

        }

        else {

            return $default;

        }

    }

    if ($check) {

         return (preg_match($check$var$ret) ? $ret[1] : $default);

    }

    return $var;

}

/*

    校验kv json,

    如果想要一个这样的数据{id:1, ‘type‘:‘single_text‘, ‘required‘: true, ‘desc‘:‘this is a text‘}

    那么$desc可以这样写

    array(

   array(‘id‘, ‘Int‘),

   array(‘type‘, ‘string‘, PATTERN_NORMAL_STRING),

   array(‘required‘, ‘Bool‘, false),

   array(‘desc‘, ‘string‘, PATTERN_NORMAL_STRING),

))

*/

function checkKvJson($var$desc array()) {

    if(is_string($var)) {

        $var = json_decode($var, true);

    }

    if(!$var || !is_array($var)) {

        return array();

    }

    if($desc)

    foreach($desc as $d) {

        if(!isset($var[$d[0]])) {

            return array();

        }

        $ps array_slice($d, 2);

        array_unshift($ps$var[$d[0]]);

        $var[$d[0]] = call_user_func_array(‘check‘.$d[1], $ps);

        if($var[$d[0]] === false && strcasecmp($d[1], ‘Bool‘)) {

            return array();

        }

    }

    return $var;

}

时间: 2024-10-08 11:50:19

如何实现一个php框架系列文章【5】安全处理输入的相关文章

如何实现一个php框架系列文章【开篇】

1.本系列文章的目的 实现一个小而美的产品级别php框架 自己动手实现一个新框架仅用于学习交流,不打算替代市面上现有的其他主流框架. 2. 我要一个怎样的PHP框架 简单实用,安全优雅,博采众长 安装简单,上手简单,扩展简单 不需要编译C扩展. 不需要知道什么是composer. 不需要改nginx.cnf .htaccess各种重写规则. 但支持各种环境,从最低端的虚拟空间到独立服务器,从单机xampp,phpstudy, 到各种云sae,bae,以及高大上的分布式架构部署方式.绿色无需安装,

如何实现一个php框架系列文章【6】mysql数据库

实现一个mysql数据库封装需要考虑的问题 使用方便性 采用直接sql语句操作方式.只要会写sql语句,那么将没有其他学习成本. uctphp框架提供的dba辅助封装类,用会之后将爱不释手. 使用前需要显示初始化并连接到数据库吗,当然不需要. 直到执行第一条sql语句之前,都不会去连接数据库,甚至不会new一个db对象. dba将会在合适的时机去连接数据库并执行初始化字符编码操作. 查询语句.不需要new一个查询构造器也不提供链式操作方式,那样复杂且低效. dba提供了以下的查询辅助函数. 1

如何实现一个php框架系列文章【3】支持psr4的自动加载类

psr4自动加载规范https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md 我们把第三方使用psr规范的类库放在vendor目录下 修改一下autoload函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22     //psr     if (!empty($GLOBALS['_UCT']['autoload_psr'])) {        

2019 年起如何开始学习 ABP 框架系列文章-开篇有益

2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/latest/Welcome-to-52abp 本文的目的是为了让刚刚接触 ABP 框架的同学或者准备接触 ABP 框架的同学,能够理解和搞明白 ABP 框架到底是怎么回事,毕竟它发展了好几年的时间.社区中有很多人做 了 ABP 的资料和文章包括我自己也建立了 52ABP,社区中还有 ABPplus 等等的内

【开源】EnterpriseFrameWork框架系列文章索引

一.EnterpriseFrameWork框架总体介绍 二.利用EnterpriseFrameWork快速开发Web系统(B/S) 三.利用EnterpriseFrameWork快速开发Winform系统(C/S) 四.利用EnterpriseFrameWork快速开发基于WCF为中间件的三层结构系统 五.利用EnterpriseFrameWork快速开发基于WebServices的接口 六.EnterpriseFrameWork框架基础功能之权限管理 七.EnterpriseFrameWork

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

NET架构设计、框架设计系列文章总结

NET架构设计.框架设计系列文章总结 从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以在发挥点价值作用. 架构设计: ElasticSearch大数据分布式弹性搜索引擎使用 (推荐) DDD实施经验分享-价值导向.从上往下进行(圈内第一个吃螃蟹DDD实施方案)(推荐) 软件工程-思考项目开发那些事(一)(推荐) SOA架构设计经验分享-架构.职责

一个关于unity3d的系列文章

写在前面 想来从事unity3d开发已有三年多一些,寻思着该为这个奋斗了这么久的行业做些少许贡献,无赖自身水平局限加上各种拖延症,一直未能实施. 该写什么? 该怎么写? 不知道自己的能力是否能够撑起梦想,最后是否会太监? 也不会做需求分析,自己的文章会否有人问津? 更加不知道文章是否书写正确,不要传递了错误的信息,误人技术,徒留一地鸡毛. 想的多了,做得就少了,越想越无法下笔,但近日开始接手一个陈旧的项目,看着自己无法下手的代码,看着各种解不开的变量关系,才知道,虽然unity3d大大降低了做游

Net设计模式实例系列文章总结

1 什么是设计模式 设计模式是对在软件设计过程中重复出现的问题提出了一种比较好的解决方案.正如一位专家所说:设计模式是对程序设计人员经常遇到的设计问题的可再现的解决方案(The Smalltalk Companion).GOF设计模式通常被认为是其他设计模式的基础,随着业务复杂度的增大,会不断涌现新的设计模式,而这些新的设计模式一般会以GOF模式理论为参照. 2 为什么要学习设计模式 从个人职业规划来考虑.一位软件开发工程师随着编码量的增加,开发经验的增加,软件理论理解的加深,会不由自主地想一些