При попытке загрузить изображение в виде большого двоичного объекта из ответа сервера я столкнулся с проблемой, что Angular2 (7) считает предоставленный URL-адрес небезопасным. При поиске решения широко предлагаемое решение - использовать DomSanitizer
для обхода защиты.
См. Пример из @Amirreza здесь, но также и в других сообщениях StackOverflow предлагается то же решение.
На странице угловой документации для DomSanitizer
пишут следующее:
bypassSecurityTrustUrl ()
ВНИМАНИЕ: вызов этого метода с ненадежными пользовательскими данными подвергает ваше приложение угрозам безопасности XSS!
Мне кажется, что это небезопасно, если только вы действительно не уверены, что источнику изображения можно доверять!
Вам следует учитывать, что даже если источник исходит от вашего собственного сервера, он мог быть загружен пользователем, и можно было бы воспользоваться таким решением, загрузив вредоносное изображение.
Лучше и безопаснее конвертировать BLOB-объект (изображение) в URL-адрес данных (строку base64) и установить его в качестве src
для вашего элемента изображения.
URL-адреса данных обычно считаются безопасными (MDN) :
Кодирование данных в формате base64
Строки base64, как правило, безопасны по URL-адресу, поэтому их можно использовать для кодирования данных в URL-адресах данных.
Это решение также предлагается в блоге здесь и даже в другом ответе от @Powkachu, но в этом ответе ошибка заключается в том, что идентификатор протокола base64 добавляется дважды ( the FileReader::readAsDataURL
уже возвращает это в результате ) и излишне передается в bypassSecurityTrustUrl
из дезинфицирующего средства.
Правильное, безопасное и более простое решение будет выглядеть так:
let mySrc;
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
// result includes identifier 'data:image/png;base64,' plus the base64 data
mySrc = reader.result;
}
Где blob - это Blob
, а mySrc
- это dataUrl (строка base64), которая теперь может быть немедленно установлена как image src.
Здесь скрипка в простом Javascript , чтобы продемонстрировать работу этого решения без Angular.