Вы нарушаете законы спецификации, которые гласят, что если вы используете drawImage
с изображением, которое не имеет того же происхождения, что и документ холста, тогда устанавливается флаг orgin-clean ложно. С этого момента вы не можете использовать toDataURL
. Полные слова спецификации по этому вопросу: здесь.
Причиной такой безопасности является предотвращение утечки информации. Чтобы понять, почему это плохо, рассмотрим следующую гипотетическую ситуацию:
Скажем, вы в рабочей сети и у вас есть доступ к внутренним, частным сайтам компании и вашему (частному!) Жесткому диску из вашего браузера. Частные сайты могут быть похожи на www.internal.myCompany.com
, а ваш жесткий диск будет доступен по URL-адресам, таким как file:///C:/SomeOfMyPhotos/
.
Теперь предположим, что вы посетили веб-сайт со скрытым холстом и во время просмотра сайта этот холст постоянно вызывал drawImage()
на этот холст с URL-адресами, которые, как он предполагал, могли существовать. Эти URL будут такими же, как изображение на частном поддомене:
www.internal.myCompany.com/secret/secret-plans.jpg
Или изображение на жестком диске:
file:///C:/SomeOfMyPhotos/thatEmbarassingPhoto.png
Вредоносный сайт будет пытаться использовать различные комбинации приватных URL-адресов, пока не найдет тот, который на самом деле является файлом. Тогда он будет рисовать его на холсте. Затем он получит imageData
с холста и отправит его на сервер.
Вуаля! Они украли ваши секретные планы и ваши неловкие фотографии, но без вашего согласия.
Теперь мы знаем, что приведенный выше сценарий не очень вероятен: в конце концов, секретные планы почти всегда в формате PNG, тогда как смущающие фотографии почти всегда в формате JPG. Но вполне вероятно, что подобные ситуации могут произойти, поэтому последствия для безопасности должны это учитывать.