Вам нужно извлечь данные изображения base64 из этой строки, декодировать его, а затем вы можете сохранить его на диск, вам не нужен GD, поскольку он уже является png.
$data = 'data:image/png;base64,AAAFBfj42Pj4';
list($type, $data) = explode(';', $data);
list(, $data) = explode(',', $data);
$data = base64_decode($data);
file_put_contents('/tmp/image.png', $data);
И как однострочный:
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));
Эффективный метод для извлечения, декодирования и проверки ошибок:
if (preg_match('/^data:image\/(\w+);base64,/', $data, $type)) {
$data = substr($data, strpos($data, ',') + 1);
$type = strtolower($type[1]); // jpg, png, gif
if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
throw new \Exception('invalid image type');
}
$data = base64_decode($data);
if ($data === false) {
throw new \Exception('base64_decode failed');
}
} else {
throw new \Exception('did not match data URI with image data');
}
file_put_contents("img.{$type}", $data);
Вы не можете. Когда вы каким-либо образом отказываетесь от доступа к URL-адресу загрузки Cloud Storage, вы полностью доверяете этому пользователю. Они могут поделиться этим с кем угодно. Если вы не доверяете этому пользователю, не сообщайте ему URL.
Если вам не нравится, как это работает, не используйте URL-адреса загрузки и разрешайте только безопасные загрузки через Firebase SDK. В этот момент вы доверяете пользователю, который не будет брать контент, загружать его в другое место и генерировать URL-адрес.