Detect base64 encoding in PHP?

后端 未结 12 1902
鱼传尺愫
鱼传尺愫 2020-12-05 02:10

Is there some way to detect if a string has been base64_encoded() in PHP?

We\'re converting some storage from plain text to base64 and part of it lives in a cookie

相关标签:
12条回答
  • 2020-12-05 02:42

    Usually a text in base64 has no spaces.

    I used this function which worked fine for me. It tests if the number of spaces in the string is less than 1 in 20.

    e.g: at least 1 space for each 20 chars --- ( spaces / strlen ) < 0.05

    function normalizaBase64($data){
        $spaces = substr_count ( $data ," ");
        if (($spaces/strlen($data))<0.05)
        {
            return base64_decode($data);
        }
        return $data;
    }
    
    0 讨论(0)
  • May be it's not exactly what you've asked for. But hope it'll be usefull for somebody.

    In my case the solution was to encode all data with json_encode and then base64_encode.

    $encoded=base64_encode(json_encode($data));
    

    this value could be stored or used whatever you need. Then to check if this value isn't just a text string but your data encoded you simply use

    function isData($test_string){
       if(base64_decode($test_string,true)&&json_decode(base64_decode($test_string))){
          return true;
       }else{
        return false;
       }
    

    or alternatively

    function isNotData($test_string){
       if(base64_decode($test_string,true)&&json_decode(base64_decode($test_string))){
          return false;
       }else{
        return true;
       }
    

    Thanks to all previous answers authors in this thread:)

    0 讨论(0)
  • 2020-12-05 02:43

    Your best option is:

    $base64_test = mb_substr(trim($some_base64_data), 0, 76);
    return (base64_decode($base64_test, true) === FALSE ? FALSE : TRUE);
    
    0 讨论(0)
  • 2020-12-05 02:44
    function is_base64_encoded($data)
    {
        if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $data)) {
           return TRUE;
        } else {
           return FALSE;
        }
    };
    
    is_base64_encoded("iash21iawhdj98UH3"); // true
    is_base64_encoded("#iu3498r"); // false
    is_base64_encoded("asiudfh9w=8uihf"); // false
    is_base64_encoded("a398UIhnj43f/1!+sadfh3w84hduihhjw=="); // false
    

    http://php.net/manual/en/function.base64-decode.php#81425

    0 讨论(0)
  • 2020-12-05 02:44

    base64_decode() will not return FALSE if the input is not valid base64 encoded data. Use imap_base64() instead, it returns FALSE if $text contains characters outside the Base64 alphabet imap_base64() Reference

    0 讨论(0)
  • 2020-12-05 02:47

    I was about to build a base64 toggle in php, this is what I did:

    function base64Toggle($str) {
        if (!preg_match('~[^0-9a-zA-Z+/=]~', $str)) {
            $check = str_split(base64_decode($str));
            $x = 0;
            foreach ($check as $char) if (ord($char) > 126) $x++;
            if ($x/count($check)*100 < 30) return base64_decode($str);
        }
        return base64_encode($str);
    }
    

    It works perfectly for me. Here are my complete thoughts on it: http://www.albertmartin.de/blog/code.php/19/base64-detection

    And here you can try it: http://www.albertmartin.de/tools

    0 讨论(0)
提交回复
热议问题