快捷搜索:   nginx

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.

20161112135920404.png


网上还有一种方法,遍历字符串看是不是在base64编码的字符里面,

base64有大小写英文字母,0-9的数字,还加 + / =

如下:

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '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 "没加密过";

}

顶(3)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论