• PHP用户输入安全过滤和注入攻击检测


    摘抄自ThinkPHP

    /**
     * 获取变量 支持过滤和默认值
     * @param array         $data 数据源
     * @param string|false  $name 字段名
     * @param mixed         $default 默认值
     * @param string|array  $filter 过滤函数
     * @return mixed
     */
    function input($data = [], $name = '', $default = null, $filter = '')
    {
        $name = (string) $name;
    
        if (is_array($data)) {
            array_walk_recursive($data, 'filterValue', $filter);
            reset($data);
        } else {
            filterValue($data, $name, $filter);
        }
        return $data;
    }
    
    
    /**
     * 递归过滤给定的值
     * @param mixed     $value 键值
     * @param mixed     $key 键名
     * @param array     $filters 过滤方法+默认值
     * @return mixed
     */
    function filterValue(&$value, $key, $filters)
    {
        $default = array_pop($filters);
        foreach ($filters as $filter) {
            if (is_callable($filter)) {
                // 调用函数或者方法过滤
                $value = call_user_func($filter, $value);
            } elseif (is_scalar($value)) {
                if (false !== strpos($filter, '/')) {
                    // 正则过滤
                    if (!preg_match($filter, $value)) {
                        // 匹配不成功返回默认值
                        $value = $default;
                        break;
                    }
                } elseif (!empty($filter)) {
                    // filter函数不存在时, 则使用filter_var进行过滤
                    // filter为非整形值时, 调用filter_id取得过滤id
                    $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter));
                    if (false === $value) {
                        $value = $default;
                        break;
                    }
                }
            }
        }
        return filterExp($value);
    }
    
    /**
     * 过滤表单中的表达式
     * @param string $value
     * @return void
     */
    function filterExp(&$value)
    {
        // 过滤查询特殊字符
        if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) {
            $value .= ' ';
        }
        // TODO 其他安全过滤
    }
    
    /**
     * 强制类型转换
     * @param string $data
     * @param string $type
     * @return mixed
     */
    function typeCast(&$data, $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:
                if (is_scalar($data)) {
                    $data = (string) $data;
                } else {
                    throw new InvalidArgumentException('variable type error:' . gettype($data));
                }
        }
    }

    PHP检测SQL注入攻击代码

    //过滤注入
    function filter_injection(&$request)
    {
        $pattern = "/(select[s])|(insert[s])|(update[s])|(delete[s])|(from[s])|(where[s])|(truncate[s])|(drop[s])|(table[s])|(grant[s])|(load_file[s])|(outfile[s])/i";
        foreach($request as $k=>$v)
        {
            if(preg_match($pattern,$k,$match))
            {
                die("SQL Injection denied!");
            }
    
            if(is_array($v))
            {
                filter_injection($request[$k]);
            }
            else
            {
                if(preg_match($pattern,$v,$match))
                {
                    die("SQL Injection denied!");
                }
            }
        }
    }
    JavaScript检测SQL注入式攻击代码:
    <script>
    var url = location.search;
    var re=/^?(.*)(select%20|insert%20|delete%20from%20|drop%20table|update%20truncate%20)(.*)$/gi;
    var e = re.test(url);
    if(e) {
        alert("地址中含有非法字符~");
    }
    <script>

    版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
    本文标题:PHP用户输入安全过滤和注入攻击检测
    本文链接:http://www.cnblogs.com/sochishun/p/8459562.html
    本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
    发表日期:2018年2月22日

  • 相关阅读:
    php单元测试
    git配置本地环境(phpstudy/tortoisegit/git等)
    xp/win7中系统安装memcached服务,卸载memcached服务,以及删除memcached服务
    memcached装、启动和卸载
    如何安装memcached
    三元运算符、逻辑运算符
    移动端页面怎么适配ios页面
    javascript正则表达式——元字符
    一个div添加多个背景图片
    GNU Screen使用入门
  • 原文地址:https://www.cnblogs.com/sochishun/p/8459562.html
Copyright © 2020-2023  润新知