Я создаю приложение, которое позволяет пользователю POST
данные холста HTML5, которые затем закодированы в base64 и отображаются всем пользователям. Я рассматриваю разбор данных в реальном .png файле и хранении на сервере, но путь base64 позволяет мне сохранять изображения в базе данных и минимизировать запросы. Изображения уникальны, немногие, и страница не будет обновляться часто.
Немного jQuery возьмет данные холста data:image/png;base64,iVBORw...
и передает его вместе с PHP скрипт, который обертывает его так: <img src="$data"></img>
Однако безопасность является краеугольным камнем и требует проверки данных canvas base64, чтобы предотвратить передачу вредоносных данных в запрос POST
. Моя основная проблема заключается в том, чтобы запретить вставлять внешние URL-адреса в тег <img>
и запрашиваться при загрузке страницы.
В настоящее время у меня есть такая настройка:
$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;
Я хочу убедиться, что моя текущая настройка достаточно безопасна, чтобы предотвратить добавление внешних URL-адресов в тег <img>
, а если нет, что можно сделать для дальнейшей проверки данных изображения?