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日

posted on 2018-02-22 17:27  sochishun  阅读(452)  评论(0编辑  收藏  举报