Buduję aplikację, która pozwala użytkownikowi uzyskać dane kanonu 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ą unikalne, kilka, a strona nie będzie często odświeżana.Sprawdzanie poprawności obrazów zakodowanych w Base64
Trochę jQuery odbędzie dane płótnie, data:image/png;base64,iVBORw...
i przekazuje je dalej do skryptu PHP, który owija go tak: <img src="$data"></img>
jednak bezpieczeństwo jest fundamentem i trzeba sprawdzić poprawność danych base64 płócienne zapobiegające odejście złośliwe dane w żądaniu POST
. Moim głównym zmartwieniem jest zapobieganie wstrzykiwaniu zewnętrznych URL-i do tagu <img>
i żądanie przy ładowaniu strony.
Obecnie ma konfigurację takiego:
$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ć, moja obecna konfiguracja jest wystarczająco bezpieczny, aby zapobiec zewnętrznych odnośników przed włożona do tagu <img>
, a jeśli nie, to co można zrobić w celu dalszego sprawdzania poprawności danych obrazu?
To było wspaniałe! Przyjęty. 'imagepng' spowoduje, że podany argument nie jest prawidłowym zasobem obrazu, jeśli dane obrazu nie są poprawne, więc zawinąłem tę funkcję w instrukcji' if', aby ją złapać, jeśli się nie powiedzie. – ssh2ksh
Możesz użyć 'imagecreatefrompng ($ base64)' jeśli return false, oznacza nie obrazek – mghhgm