php 过滤请求参数防止xss和sql注入 2023-06-03

2023-06-02  本文已影响0人  阿然学编程
/**
 * @param $params
 * @return array|string|string[]|null
 */
function filter_input_params($params)
{
    // 定义各种正则表达式,用于过滤危险输入
    $filter_arr = array(
        // 过滤 HTML 标签
        '/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU',
        // 过滤 JavaScript 事件
        '/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU',
        // 过滤 SQL 注入字符
        '/select\b|and\b|or\b|like\b|regexp\b|from\b|where\b|update\b|insert\b|exec\b|order\s*by|having\b|drop\b|delete\b|\(|\)|\[|\]|\||<|>|;|:|&|\'|\"|%|\+|-|_|=|\*|\\\\|union|into|load_file|outfile|dump/is',
        // 过滤参数中的 URL,不过建议使用专门的 URL 过滤函数或第三方库
        '/(^|[^\\w])(https?:\\/\\/[^\\s]+)([^\\w]|$)/i',
        // 过滤ASCII码大于127的非法字符
        '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u',
        // 过滤不可见字符(制表符(Tab)、回车符(CR)、换行符(LF)等)
        '/\p{Cc}+/u'
    );
    if (is_array($params)) {
        array_walk_recursive($params, function (&$v) use ($filter_arr) {
            if (!is_numeric($v)) {
                if (filter_var($v, FILTER_VALIDATE_URL)) {
                    $v = filter_var($v, FILTER_SANITIZE_URL);
                } elseif (filter_var($v, FILTER_VALIDATE_EMAIL)) {
                    $v = filter_var($v, FILTER_SANITIZE_EMAIL);
                } else {
                    $v = strip_tags($v); // 过滤 HTML 标签
                    $v = preg_replace($filter_arr, '', $v); // 去除危险字符
                }
                $v = trim($v);
            }
        });
    } else {
        if (!is_numeric($params)) {
            if (filter_var($params, FILTER_VALIDATE_URL)) {
                $params = filter_var($params, FILTER_SANITIZE_URL);
            } elseif (filter_var($params, FILTER_VALIDATE_EMAIL)) {
                $params = filter_var($params, FILTER_SANITIZE_EMAIL);
            } else {
                $params = strip_tags($params); // 过滤 HTML 标签
                $params = preg_replace($filter_arr, '', $params); // 去除危险字符
            }
            $params = trim($params); // 去除空格
        }
    }
    return $params;
}
上一篇下一篇

猜你喜欢

热点阅读