Кажется, здесь есть некоторая путаница, и, учитывая, насколько вводят вас в заблуждение ваши ссылки, я могу понять.
Испорченный холст
"Tainting the canvas" - это безопасность операция, которая блокирует .toDataURL()
и любой другой метод экспорта, такой как .toBlob()
, .captureStream()
или 2D-контекст .getImageData()
.
. Есть только несколько случаев, когда эта операция выполняется:
-
Ресурсы из разных источников : это наиболее распространенное явление в сети. Сайт A нарисовал ресурс, как изображение с Сайт B , на холсте. Если Сайт B не сообщил браузеру, что он разрешает Сайт A - прочитать этот контент, передав соответствующие заголовки Allow-Origin Затем браузер должен «испортить» холст.
Это защищает только ресурс . В этом случае к сайту A не добавляется никакой реальной безопасности.
утечка информации : это скорее исключение, но все же это предмет. Браузеры могут самостоятельно решить, что некоторые действия могут привести к утечке информации о конфиденциальности их пользователя. Например, наиболее распространенный случай - «испортить» холст, когда на холсте нарисовано изображение SVG, содержащее . Поскольку этот тег может отображать HTML, он также может пропускать, например, какую ссылку посещали. Браузеры должны позаботиться об анонимизации этих ресурсов, но, тем не менее, Safari по-прежнему портит любое такое изображение SVG, Chrome с ошибками по-прежнему портит те, которые обслуживаются из blob:
URI, IE испортил любое изображение SVG (не только с ), и все в какой-то момент испортили холст при использовании некоторых внешних элементов filter
.
Утечка информации II : Существует также кое-что, с чем не может бороться ни один браузер при чтении растрового изображения, созданного на холсте. Каждое аппаратное и программное обеспечение будет давать немного разные результаты, когда его попросят выполнить одинаковые операции рисования. Это можно использовать для отпечатка пальца текущего браузера. Таким образом, некоторые расширения браузера также блокируют эти методы или возвращают фиктивные результаты.
Теперь, ничто из этого не защищает от вредоносных изображений.
Изображения, содержащие вредоносный код
Типы изображений, которые могут содержать вредоносный код, обычно используют уязвимости в синтаксических анализаторах и средствах визуализации изображений. Я не думаю, что современные парсеры или средства визуализации по-прежнему уязвимы для таких атак, но даже несмотря на то, что был такой, который использовался бы веб-браузером, тогда, когда он обращается к холсту, уже слишком поздно. Извращение холст ничего не защитит.
Одна вещь, о которой вы, возможно, слышали, это stegosploit . Это состоит в сокрытии вредоносного кода в изображении, но холст HTML там использовался для декодирования этого вредоносного кода. Поэтому, если у вас нет сценария для извлечения и выполнения вредоносного сценария, он не представляет большого риска, и на самом деле, если вы действительно его экспортируете, есть хорошие шансы, что эти встроенные данные будут потеряны.
Риски, связанные с загрузкой контента на сервер
При загрузке чего-либо на ваш сервер существует много рисков. Я не могу подчеркнуть это достаточно, но Читать OW ASP рекомендации внимательно.
Особые риски при загрузке data:
URL
data:
URL - хороший вектор для XSS-атак . Действительно, очень вероятно, что вы создадите код HTML напрямую, используя этот data:
URL. Если вы не применили правильные шаги санации, вы можете загрузить скрипт злоумышленника вместо изображения:
const dataURIFromServer = `data:image/png,"' onerror="alert('nasty script ran')"`;
const makeImgHTML = ( uri ) => `<img src="${uri}">`;
document.getElementById('container').innerHTML = makeImgHTML(dataURIFromServer);
<div id="container"></div>
Последнее слово в data:
URLs
data:
URL-адреса служат для хранения данных в URL-адресе, чтобы их можно было передавать напрямую без необходимости использования сервера.
Хранение URL-адреса data:
на сервере неэффективно.
Для представления двоичных данных эти данные должны быть закодированы в base64, чтобы все небезопасные символы можно было по-прежнему представлять в большинстве кодировок. Эта операция приведет к росту примерно на 34% от исходного размера данных, и вам придется хранить его как строку, что неудобно для большинства баз данных.
Действительно, data:
URL-адреса взяты из другая эпоха. Там действительно мало случаев, когда вы хотите его использовать. Большая часть того, что вы хотите сделать с URL-адресом data:
, вы должны делать это с BLOB-объектами и URL-адресом blob:
. Например, загрузите ваше изображение как Blob прямо на ваш сервер. Используйте метод canvas .toBlob()
, если вам нужно экспортировать его содержимое. Используйте img.src = URL.createObjectURL(file)
, если вы хотите представить изображение, выбранное вашим пользователем.
TL; DR
- В вашем сценарии toDataURL()
само по себе будет не создавайте никаких рисков и не предотвратите их.
- Используйте хорошо известные методы для очистки загрузок ваших пользователей (никогда им не доверяйте и помните, что они могут даже не быть используя пользовательский интерфейс для общения с сервером).
- Избегайте data:
URL. Они неэффективны.