zoukankan      html  css  js  c++  java
  • 如何实现一个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;
    }
  • 相关阅读:
    【gtest/gmock】警告与报错集合
    【gtest/gmock】gmock:Mock的常用方法
    【C++容器】vector 和 list 的区别
    【C++百科】C++标准库到底是什么?
    【C++】设置、改变、获取系统环境变量:setenv & putenv & getenv
    【C++调试】error: 编译报错合集
    【C++调试】 warning: 编译警告合集
    Linux常用命令
    tcpdump及wireshark组合使用
    Vim快捷键
  • 原文地址:https://www.cnblogs.com/yyluming/p/5193471.html
Copyright © 2011-2022 走看看