php 常用过滤类

436 查看

//$str = '汉hah子abc---ABC123_-';
//
////if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312汉字字母数字下划线正则表达式
//if(!preg_match('#^[\x{4e00}-\x{9fa5}A-Za-z0-9_-]+$#u',$str))   //UTF-8汉字字母数字下划线正则表达式
//{
//    echo "<font color=red>您输入的[".$str."]含有违法字符</font>";
//}else{
//    echo "<font color=green>您输入的[".$str."]完全合法,通过!</font>";
//}
//
//exit;


//$email='afs###%-##@s.com';
//$result=filter_var($email,FILTER_VALIDATE_EMAIL);
//
//$str = 'abcDFSDF哈哈1323@#%#$%#%$^&&*^&*';
//$sss = filter_var($str, FILTER_SANITIZE_STRIPPED);
//
//var_dump($sss);
//exit;


/**
 * @brief Filter 过滤
 */
class Filter
{
    /**
     * @brief 过滤字符串的长度
     * @param string $str 被限制的字符串
     * @param int $length 限制的字节数
     * @return string 空:超出限制值; $str:原字符串;
     */
    public static function limitLen($str,$length)
    {
        if($length !== false)
        {
            $count = IString::getStrLen($str);
            if($count > $length)
            {
                return '';
            }
            else
            {
                return $str;
            }
        }
        return $str;
    }

    /**
     * @brief 对字符串进行过滤处理
     * @param  string $str      被过滤的字符串
     * @param  string $type     过滤数据类型 值: int, float, string, text, bool, url
     * @param  int    $limitLen 被输入的最大字符个数 , 默认不限制;
     * @return string 被过滤后的字符串
     * @note   默认执行的是string类型的过滤
     */
    public static function act($str,$type = 'string',$limitLen = false)
    {
        if(is_array($str))
        {
            $resultStr = array();
            foreach($str as $key => $val)
            {
                $key = self::act($key, $type, $limitLen);
                $val = self::act($val, $type, $limitLen);
                $resultStr[$key] = $val;
            }
            return $resultStr;
        }
        else
        {
            switch($type)
            {
                case "int":
                    return intval($str);
                    break;

                case "float":
                    return floatval($str);
                    break;

                case "text":
                    return self::text($str,$limitLen);
                    break;

                case "bool":
                    return (bool)$str;
                    break;

                case "url":
                    return self::clearUrl($str);
                    break;

                case "filename":
                    return self::fileName($str);
                    break;

                // 严格过滤字符串
                case "strict":
                    return self::strict($str);

                // 检测邮箱地址
                case "email":
                    return self::email();

                // 检测http网址
                case "http":
                    return self::http();

                default:
                    return self::string($str,$limitLen);
                    break;
            }
        }
    }

    /**
     * @brief  对字符串进行严格的过滤处理
     * @param  string  $str      被过滤的字符串
     * @param  int     $limitLen 被输入的最大长度
     * @return string 被过滤后的字符串
     * @note 过滤所有html标签和php标签以及部分特殊符号
     */
    public static function string($str,$limitLen = false)
    {
        $str = trim($str);
        $str = self::limitLen($str,$limitLen);
        $str = htmlspecialchars($str,ENT_NOQUOTES);
        return self::addSlash($str);
    }

    /**
     * @brief 对字符串进行普通的过滤处理
     * @param string $str      被过滤的字符串
     * @param int    $limitLen 限定字符串的字节数
     * @return string 被过滤后的字符串
     * @note 仅对于部分如:<script,<iframe等标签进行过滤
     */
    public static function text($str,$limitLen = false)
    {
        $str = self::limitLen($str,$limitLen);
        $str = trim($str);

        require_once(dirname(__FILE__)."/htmlpurifier/HTMLPurifier.standalone.php");
        $cache_dir=IWeb::$app->getRuntimePath()."htmlpurifier/";

        if(!file_exists($cache_dir))
        {
            IFile::mkdir($cache_dir);
        }
        $config = HTMLPurifier_Config::createDefault();

        //配置 允许flash
        $config->set('HTML.SafeEmbed',true);
        $config->set('HTML.SafeObject',true);
        $config->set('Output.FlashCompat',true);

        //配置 缓存目录
        $config->set('Cache.SerializerPath',$cache_dir); //设置cache目录

        //允许<a>的target属性
        $def = $config->getHTMLDefinition(true);
        $def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');

        //过略掉所有<script>,<i?frame>标签的on事件,css的js-expression、import等js行为,a的js-href
        $purifier = new HTMLPurifier($config);
        return self::addSlash($purifier->purify($str));
    }

    /**
     * @brief 增加转义斜线
     * @param string $str 要转义的字符串
     * @return string 转义后的字符串
     */
    public static function addSlash($str)
    {
        if(is_array($str))
        {
            $resultStr = array();
            foreach($str as $key => $val)
            {
                $resultStr[$key] = self::addSlash($val);
            }
            return $resultStr;
        }
        else
        {
            return addslashes($str);
        }
    }

    /**
     * @brief 去掉转义斜线
     * @param string $str 要转义的字符串
     * @return string 去掉转义的字符串
     */
    public static function stripSlash($str)
    {
        if(is_array($str))
        {
            $resultStr = array();
            foreach($str as $key => $val)
            {
                $resultStr[$key] = self::stripSlash($val);
            }
            return $resultStr;
        }
        else
        {
            return stripslashes($str);
        }
    }

    /**
     * @brief 检测文件是否有可执行的代码
     * @param string  $file 要检查的文件路径
     * @return boolean 检测结果
     */
    public static function checkHex($file)
    {
        $resource = fopen($file, 'rb');
        $fileSize = filesize($file);
        fseek($resource, 0);
        // 读取文件的头部和尾部
        if ($fileSize > 512)
        {
            $hexCode = bin2hex(fread($resource, 512));
            fseek($resource, $fileSize - 512);
            $hexCode .= bin2hex(fread($resource, 512));
        }
        // 读取文件的全部内容
        else
        {
            $hexCode = bin2hex(fread($resource, $fileSize));
        }
        fclose($resource);
        /* 匹配16进制中的 <% (  ) %> */
        /* 匹配16进制中的 <? (  ) ?> */
        /* 匹配16进制中的 <script  /script>  */
        if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054.*?2F5343524950543E)|(3C736372697074.*?2F7363726970743E)/is", $hexCode))
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    /**
     * 清理URL地址栏中的危险字符,防止XSS注入攻击
     * @param string $url
     * @return string
     */
    public static function clearUrl($url)
    {
        $string = filter_var($url, FILTER_VALIDATE_URL);
//        if(preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?\/?/i', $url)){
//            echo $string;
//            exit;
//        }

        return $string;

        //return str_replace(array('\'','"','&#',"\\","<",">"),'',$url);
    }


    /**
     * @brief 严格过滤字符串 ( 准许特殊字符 ._-)
     * @param string $string 参数字符串
     * @return string
     */
    public static function strict($string)
    {
        // |^[\w\.\s<>=\!\x{4e00}-\x{9fa5}]+$|u
        if(preg_match('#^[\w\.\s\-\x{4e00}-\x{9fa5}]+$#u', $string) == true)
        {
            return $string;
        }
        return false;
    }

    /**
     * @brief 检测邮箱地址是否合法( 正则加 DNS验证 )
     * @param $string
     * @return string
     */
    public static function email($string)
    {
        $string = filter_var($string, FILTER_VALIDATE_EMAIL);
        $preg_email = '/^([a-z0-9_]|-|.)+@(([a-z0-9_]|-)+.){1,2}[a-z]{2,4}$/i';
        if(!empty($string) && preg_match($preg_email, $string) == true){
            $checkString = array_pop(explode("@", $string));
            if(true == checkdnsrr($checkString, 'MX')){
                return $string;
            }
        }
        return false;
    }



}


// $strictString = Filter::strict('asdfasdfasdf哈ss..哈身A-bsc12345_份卡萨打飞机');
// $email = Filter::email('asdfsadfdasdssssfdfdeerew#126.com');

$url = Filter::clearUrl('://jzsfdasfsadf');
var_dump($url);
exit;