Sprawdzanie poprawności obrazów zakodowanych w base64

Buduję aplikację, która pozwala użytkownikowi naPOST Dane płótna HTML5, które są następnie kodowane w base64 i wyświetlane wszystkim użytkownikom. Rozważam parsowanie danych do rzeczywistego pliku .png i przechowywanie na serwerze, ale trasa base64 pozwala mi przechowywać obrazy w bazie danych i minimalizować żądania. Obrazy są wyjątkowe, niewiele, a strona nie będzie często odświeżana.

Trochę jQuery pobierze dane płótna,data:image/png;base64,iVBORw... i przekazuje go do skryptu PHP, który otacza go w ten sposób:<img src="$data"></img>

Jednak bezpieczeństwo jest kamieniem węgielnym i należy zweryfikować dane płótna base64, aby zapobiec przechodzeniu złośliwych danych wPOST żądanie. Moją główną troską jest zapobieganie wstrzykiwaniu zewnętrznych adresów URL do<img> tag i prośba o załadowanie strony.

Obecnie mam takie ustawienie:

$data = (isset($_POST['canvas']) && is_string($_POST['canvas'])) ? $_POST['canvas'] : null;
$base = str_replace('data:image/png;base64,', '', $data);
$regx = '~^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$~'

if ((substr($data, 0, 22)) !== 'data:image/png;base64,')
{
  // Obviously fake, doesn't contain the expected first 22 characters.
  return false;
}

if ((base64_encode(base64_decode($base64, true))) !== $base64)
{
  // Decoding and re-encoding the data fails, something is wrong
  return false;
}

if ((preg_match($regx, $base64)) !== 1) 
{
  // The data doesn't match the regular expression, discard
  return false;
}

return true;

Chcę się upewnić, że moja obecna konfiguracja jest wystarczająco bezpieczna, aby zapobiec wstawianiu zewnętrznych adresów URL do<img> tag, a jeśli nie, co można zrobić, aby dodatkowo zweryfikować dane obrazu?

questionAnswers(6)

yourAnswerToTheQuestion