PHP中判断一段信息是否被BASE64编码加密过的办法
标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;
网上比较普遍的方法是先base64_decode,然后base64_encode,再看这个和原字符串是不是相等。但是这个方法不能百分之准确的判定。
function checkStringIsBase64($str){ return $str == base64_encode(base64_decode($str)) ? true : false; }
测试如下图:
比如$str="QQ14";的时候并不是base64字符串,应该返回false,但是实际上返回的是true.
网上还有一种方法,遍历字符串看是不是在base64编码的字符里面,
base64有大小写英文字母,0-9的数字,还加 + / =
如下:
但是有些字符本来就是base64编码的字符中包含的,也会出现判断不准确的时候。
在试验的过程中发现.长度为1的非base64编码字符串在base64解码后的内容是空,长度为2以上非base64编码的字符串解码后是显示乱码,此时灵感一来。就根据空、乱码来判断是否base64编码。
以下是根据字符串是否utf8编码来判断的:
//判断否为UTF-8编码 function is_utf8($str){ $len = strlen($str); for($i = 0; $i < $len; $i++){ $c = ord($str[$i]); if($c > 128){ if(($c > 247)){ return false; }elseif($c > 239){ $bytes = 4; }elseif($c > 223){ $bytes = 3; }elseif ($c > 191){ $bytes = 2; }else{ return false; } if(($i + $bytes) > $len){ return false; } while($bytes > 1){ $i++; $b = ord($str[$i]); if($b < 128 || $b > 191){ return false; } $bytes--; } } } return true; } //判断是否base64加密 function is_base64($str){ //这里多了个纯字母和纯数字的正则判断 if(@preg_match('/^[0-9]*$/',$str) || @preg_match('/^[a-zA-Z]*$/',$str)){ return false; }elseif(is_utf8(base64_decode($str)) && base64_decode($str) != ''){ return true; } return false; }
以上代码可以判断百分之99字符串是否base64编码,前提字符串编码是在UTF8下。
is_base64(‘1’) //false
is_base64(1)//false
is_base64(base64_encode(‘测试下’))//true
当然如果是简单用途,比如判断一串域名是否是被BASE加密过,那就可以变通的判断传递过来的字符串中有没有包括符合"."域名中肯定有点,而被BASE64加密过的域名则没有点号
if(strpos($url,'.') == false) //域名中没包括点号就判断位被base64加密过,进行解码
{
$url = base64_decode($url);
}
else
{
echo "没加密过";
}
- 最新评论