How to check if a string is base64 valid in PHP

后端 未结 18 1268
执笔经年
执笔经年 2020-12-13 03:41

I have a string and want to test using PHP if it\'s a valid base64 encoded or not.

相关标签:
18条回答
  • 2020-12-13 04:04

    If data is not valid base64 then function base64_decode($string, true) will return FALSE.

    0 讨论(0)
  • 2020-12-13 04:05

    I tried the following:

    • base64 decode the string with strict parameter set to true.
    • base64 encode the result of previous step. if the result is not same as the original string, then original string is not base64 encoded
    • if the result is same as previous string, then check if the decoded string contains printable characters. I used the php function ctype_print to check for non printable characters. The function returns false if the input string contains one or more non printable characters.

    The following code implements the above steps:

    public function IsBase64($data) {
        $decoded_data = base64_decode($data, true);
        $encoded_data = base64_encode($decoded_data);
        if ($encoded_data != $data) return false;
        else if (!ctype_print($decoded_data)) return false;
    
        return true;
    }
    

    The above code will may return unexpected results. For e.g for the string "json" it will return false. "json" may be a valid base64 encoded string since the number of characters it has is a multiple of 4 and all characters are in the allowed range for base64 encoded strings. It seems we must know the range of allowed characters of the original string and then check if the decoded data has those characters.

    0 讨论(0)
  • 2020-12-13 04:05

    I code a solution to validate images checking the sintaxy

    $image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABfVBMVEUAAAAxMhQAoIpFLCTimAE2IRs0IBodEg4OJyEAnYcAmoUAjnoALyn5rgNJLydEKyM5lWFFLCTuogI/JyBAKCHZnQoAlIAAkn48JR6fYgCIVACDUACPbAsAW06IWgAaDw0jFQscEQ4Am4XIfQDGewDhlwHelQEAi3gAe2oAd2cAXE8gFBAeEg8AVEgAtJwAsZn/vhMAuJ//xyMAu6BfQTf/wxv9wRlcPjVhQjj/vBBdQDb/xR9oSD1iRDlWOjH9xSL/uQr+twhkRTplRjxZPDPZpydILydAQD+pezNjRTNQNS3tuCZGLSX4sQn/tQTllgDhkgAArZUAqJFvTUD/wRgGtpp2m0aPaTl+azOIcjGkhS6OaS1ONCvNnirHmSrnsifHnSfFjyemfCfcqSa/jyLwuR/ptB/MmRxiPhnpqRX1sxHzqwnCfgb+tQTYjALnmQH2qQDzpQDejgAnsYQnsYNwTkBlRTtfQi9eQS+1kCy2kSuFYSuEYSvkpRfrqxQPeVhkAAAALnRSTlMADPz0qnhzNBPry5kH/vr36ubKxLy4sKmifVVNQT84Ih4Y2aWloqKMgHdJPDwse8ZSvQAAAbVJREFUOMuV0uVzggAYx3Gsbca6u3vDqSDqBigD25nrLrvX+bfvMSeId9vnBXD3+97zCuQ/ZhUDvV1dvQOKWfFdIWOZHfDMyhRi+4ibZHZLwS5Dukea97YzzAQFYEgTdtYm3DtkhAUKkmFI0mTCCFmH8ICbsEBRhmEWwi080U+xBNwApZlgqX7+rummWJcLEkAQLhdLdWt4wbSXOqX1Hu784uKc8+jpU8o7zQva7RSnb8BR9nZesGF/oelLT2X1XNL0q31dcOGDPnwKO7eBMxw+pD8FF2a8N9vcyfttKbh9O+HwG+8MLxiL3+FXDsc9Du4djiv8Lj7GC0bTMTx6dGzEgfH4KIrH0qO8YDyQjESMvyLJwDjCs5DaKsvlzOV3ah4RkFcCM+wlckRoymcG107ntRn4ppAmSzar9Tvh830lrFbbItJM0meDBcCzT4KIFfLOzB7IdMphFzUxWMjnC4MToqNkbWVY1RPw+wM9quHVSY1gnhyShlCd4aHo9xcfDTptSKnebPxjh0Kooewgmz2ofKFStaS+z2l1Nfv79c+gqlaog6io4HI1UKItKKuBVNuCFPmDH12fd4lDaGbkAAAAAElFTkSuQmCC';
    $allowedExtensions = ['png', 'jpg', 'jpeg'];
    
    // check if the data is empty
    if (empty($image)) {
        echo "Empty data";
    }
    
    // check base64 format
    $explode = explode(',', $image);
    if(count($explode) !== 2){
        echo "This string isn't sintaxed as base64";
    }
    //https://stackoverflow.com/a/11154248/4830771
    if (!preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $explode[1])) {
        echo "This string isn't sintaxed as base64";
    }
    
    // check if type is allowed
    $format = str_replace(
            ['data:image/', ';', 'base64'], 
            ['', '', '',], 
            $explode[0]
    );
    if (!in_array($format, $allowedExtensions)) {
        echo "Image type isn't allowed";
    }
    echo "This image is base64";
    

    But a safe way is using Intervention

    use Intervention\Image\ImageManagerStatic;
    try {
        ImageManagerStatic::make($value);
        return true;
    } catch (Exception $e) {
        return false;
    }
    
    0 讨论(0)
  • 2020-12-13 04:06

    This code should work, as the decode function returns FALSE if the string is not valid:

    if (base64_decode($mystring, true)) {
        // is valid
    } else {
        // not valid
    }
    

    You can read more about the base64_decode function in the documentation.

    0 讨论(0)
  • 2020-12-13 04:07

    You can use this function:

     function is_base64($s)
    {
          return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
    }
    
    0 讨论(0)
  • 2020-12-13 04:09

    if u are doing api calls using js for image/file upload to the back end this might help

    function is_base64_string($string)  //check base 64 encode 
    {
      // Check if there is no invalid character in string
      if (!preg_match('/^(?:[data]{4}:(text|image|application)\/[a-z]*)/', $string)){
        return false;
      }else{
        return true;
      }
    
    }
    
    0 讨论(0)
提交回复
热议问题