• 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日

  • 相关阅读:
    面试90%都会翻车的高并发分布式事务,我劝你好好啃透!
    JVM最多支持多少个线程?你知道吗?
    利用注解 + 反射消除重复代码(Java项目)
    ASP.NET HTTP模拟提交通用类 GET POST
    UPW学习资料整理 .NET C# 转
    前端引擎初步设计稿 -通过配置生成动态页面 ,LandaSugar平台 .NET-C#-MVC
    分享一个ASP.NET 文件压缩解压类 C#
    验证码的种类与实现 C#封装类
    ASP.NET MVC 使用 IOC框架 AutoFac 自动释放数据库资源
    ASP.NET MVC权限验证 封装类
  • 原文地址:https://www.cnblogs.com/sochishun/p/8459562.html
Copyright © 2020-2023  润新知