HTML пÑедоÑÑавлÑÐµÑ Ð°ÑÑибÑÑ crossorigin
Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñажений, коÑоÑÑе в ÑоÑеÑании Ñ ÑооÑвеÑÑÑвÑÑÑим заголовком CORS позволÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¸Ð·Ð¾Ð±ÑажениÑ, опÑеделÑннÑе ÑлеменÑом <img>
, загÑÑженнÑе из внеÑниÑ
иÑÑоÑников, в <canvas>
, как еÑли Ð±Ñ Ð¾Ð½Ð¸ бÑли загÑÑÐ¶ÐµÐ½Ñ Ð¸Ð· ÑекÑÑего иÑÑоÑника.
ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± иÑполÑзовании аÑÑибÑÑа crossorigin
ÑмоÑÑиÑе в Ñазделе аÑÑибÑÑÑ Ð¿Ð°ÑамеÑÑов CORS.
ÐоÑколÑÐºÑ Ð¿Ð¸ÐºÑели в ÑаÑÑÑовом изобÑажении canvas могÑÑ Ð¿Ð¾ÑÑÑпаÑÑ Ð¸Ð· ÑазлиÑнÑÑ Ð¸ÑÑоÑников, вклÑÑÐ°Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ видео, полÑÑеннÑе Ñ Ð´ÑÑÐ³Ð¸Ñ Ñ Ð¾ÑÑов, неизбежно могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑÑÑ.
Ðак ÑолÑко Ð²Ñ ÑиÑÑеÑе на Ñ Ð¾Ð»ÑÑе лÑбÑе даннÑе, коÑоÑÑе бÑли загÑÑÐ¶ÐµÐ½Ñ Ð¸Ð· дÑÑгого иÑÑоÑника без одобÑÐµÐ½Ð¸Ñ CORS, Ñ Ð¾Ð»ÑÑ ÑÑановиÑÑÑ Ð¸ÑпоÑÑеннÑм. ÐÑпоÑÑеннÑй Ñ Ð¾Ð»ÑÑ - ÑÑо ÑоÑ, коÑоÑÑй болÑÑе не ÑÑиÑаеÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑм, и лÑбÑе попÑÑки полÑÑиÑÑ Ð´Ð°Ð½Ð½Ñе изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñ Ð¾Ð»ÑÑа вÑзовÑÑ Ð¸ÑклÑÑение.
ÐÑли иÑÑоÑником внеÑнего ÑодеÑжимого ÑвлÑеÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ HTML <img>
или SVG <svg>
, Ñо попÑÑка извлеÑÐµÐ½Ð¸Ñ ÑодеÑжимого Ñ
олÑÑа не допÑÑкаеÑÑÑ.
ÐÑли внеÑнее ÑодеÑжимое поÑÑÑÐ¿Ð°ÐµÑ Ð¸Ð· изобÑажениÑ, полÑÑенного либо из HTMLCanvasElement
, либо из ImageBitMap
, и иÑÑоÑник изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ Ñем же пÑавилам пÑоиÑÑ
ождениÑ, попÑÑки пÑоÑиÑаÑÑ ÑодеÑжимое Ñ
олÑÑа блокиÑÑÑÑÑÑ.
ÐÑзов лÑбого из ÑледÑÑÑÐ¸Ñ Ð¼ÐµÑодов на иÑпоÑÑенном Ñ Ð¾Ð»ÑÑе пÑиведÑÑ Ðº оÑибке:
getImageData()
в конÑекÑÑе canvastoBlob()
на Ñамом ÑлеменÑе <canvas>
toDataURL()
на canvasÐопÑÑка обÑаÑиÑÑÑÑ Ðº ним, когда Ñ
олÑÑ Ð¸ÑпоÑÑен, пÑиведÑÑ Ðº Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾Ñибки безопаÑноÑÑи SecurityError
. ÐÑо заÑиÑÐ°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелей Ð¾Ñ Ð´Ð¾ÑÑÑпа к лиÑнÑм даннÑм Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð·Ð¾Ð±Ñажений Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии Ñ ÑдалÑннÑÑ
веб-ÑайÑов без ÑазÑеÑениÑ.
Ð ÑÑом пÑимеÑе Ð¼Ñ Ñ Ð¾Ñим ÑазÑеÑиÑÑ Ð¸Ð·Ð²Ð»ÐµÑение изобÑажений из внеÑнего иÑÑоÑника и ÑÐ¾Ñ Ñанение Ð¸Ñ Ð² локалÑном Ñ ÑанилиÑе. РеализаÑÐ¸Ñ ÑÑого ÑÑебÑÐµÑ Ð½Ð°ÑÑÑойки ÑеÑвеÑа, а Ñакже напиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° Ð´Ð»Ñ Ñамого веб-ÑайÑа.
ÐонÑигÑÑаÑÐ¸Ñ Ð²ÐµÐ±-ÑеÑвеÑаÐеÑвое, ÑÑо нам нÑжно, - ÑÑо ÑеÑвеÑ, наÑÑÑоеннÑй на ÑазмеÑение изобÑажений Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ Access-Control-Allow-Origin
, наÑÑÑоеннÑм на ÑазÑеÑение доÑÑÑпа к Ñайлам изобÑажений из ÑазнÑÑ
иÑÑоÑников.
ÐавайÑе пÑедположим, ÑÑо Ð¼Ñ Ð¾Ð±ÑлÑживаем Ð½Ð°Ñ ÑÐ°Ð¹Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Apache. РаÑÑмоÑÑим ÑÑандаÑÑнÑй Ñайл конÑигÑÑаÑии ÑеÑвеÑа Apache HTML5 Ð´Ð»Ñ Ð¾Ð±Ñазов CORS, показаннÑй ниже:
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
ÐкÑаÑÑе, ÑÑо наÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ ÑеÑÐ²ÐµÑ Ð½Ð° ÑазÑеÑение гÑаÑиÑеÑÐºÐ¸Ñ Ñайлов (ÑÐµÑ , ÑÑо Ñ ÑаÑÑиÑениÑми ".bmp", ".cur", ".gif", ".ico", ".jpg", ".jpeg", ".png", ".svg", ".svgz" и ".webp") Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа из лÑбой ÑоÑки инÑеÑнеÑа.
РеализаÑÐ¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÑÐ¾Ñ ÑанениÑТепеÑÑ, когда ÑеÑÐ²ÐµÑ Ð½Ð°ÑÑÑоен Ñак, ÑÑÐ¾Ð±Ñ ÑазÑеÑиÑÑ Ð¸Ð·Ð²Ð»ÐµÑение изобÑажений из ÑазнÑÑ Ð¸ÑÑоÑников, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ напиÑаÑÑ ÐºÐ¾Ð´, коÑоÑÑй позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑÐ¾Ñ ÑанÑÑÑ Ð¸Ñ Ð² локалÑном Ñ ÑанилиÑе, как еÑли Ð±Ñ Ð¾Ð½Ð¸ обÑлÑживалиÑÑ Ð¸Ð· Ñого же домена, на коÑоÑом вÑполнÑеÑÑÑ ÐºÐ¾Ð´.
ÐлÑÑевÑм моменÑом ÑвлÑеÑÑÑ Ð¸ÑполÑзование аÑÑибÑÑа crossorigin
пÑÑÑм ÑÑÑановки crossOrigin
в ÑлеменÑе HTMLImageElement
, на коÑоÑÑй бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑжено изобÑажение. ÐÑо даÑÑ Ð±ÑаÑзеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ð° запÑÐ¾Ñ Ð´Ð¾ÑÑÑпа к дÑÑÐ³Ð¾Ð¼Ñ Ð¸ÑÑоÑÐ½Ð¸ÐºÑ Ð¿Ñи попÑÑке загÑÑзиÑÑ Ð´Ð°Ð½Ð½Ñе изобÑажениÑ.
Ðод, коÑоÑÑй запÑÑÐºÐ°ÐµÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ (Ñкажем, когда полÑзоваÑÐµÐ»Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÐµÑ ÐºÐ½Ð¾Ð¿ÐºÑ "ÐагÑÑзиÑÑ"), вÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
function startDownload() {
let imageURL =
"https://cdn.glitch.com/4c9ebeb9-8b9a-4adc-ad0a-238d9ae00bb5%2Fmdn_logo-only_color.svg?1535749917189";
downloadedImg = new Image();
downloadedImg.crossOrigin = "Anonymous";
downloadedImg.addEventListener("load", imageReceived, false);
downloadedImg.src = imageURL;
}
ÐдеÑÑ Ð¼Ñ Ð¸ÑполÑзÑем жÑÑÑко закодиÑованнÑй URL-адÑÐµÑ (imageURL
), но он запÑоÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑÑпаÑÑ Ð¾ÑкÑда Ñгодно. ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¸Ð·Ð¾Ð±ÑажениÑ, Ð¼Ñ ÑоздаÑм новÑй обÑÐµÐºÑ HTMLImageElement
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа Image()
. ÐаÑем изобÑажение наÑÑÑаиваеÑÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÑазÑеÑиÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¸Ð· дÑÑгого иÑÑоÑника. ÐÐ»Ñ ÑÑого его аÑÑибÑÑ crossOrigin
ÑÑÑанавливаеÑÑÑ Ð½Ð° "Anonymous"
(Ñо еÑÑÑ ÑазÑеÑение неавÑоÑизованной загÑÑзки изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· пеÑекÑÑÑÑного иÑÑоÑника). ÐбÑабоÑÑик ÑобÑÑий добавлÑеÑÑÑ Ðº ÑобÑÑÐ¸Ñ load
, запÑÑÐºÐ°ÐµÐ¼Ð¾Ð¼Ñ Ð½Ð° ÑлеменÑе изобÑажениÑ, ÑÑо ознаÑаеÑ, ÑÑо даннÑе изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð±Ñли полÑÑенÑ.
ÐаконеÑ, аÑÑибÑÑ src
изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑÑанавливаеÑÑÑ Ð² URL-адÑÐµÑ Ð·Ð°Ð³ÑÑжаемого изобÑажениÑ; ÑÑо иниÑииÑÑÐµÑ Ð½Ð°Ñало загÑÑзки.
Ðод, обÑабаÑÑваÑÑий недавно загÑÑженнÑе изобÑажениÑ, наÑ
одиÑÑÑ Ð² меÑоде imageReceived()
:
function imageReceived() {
let canvas = document.createElement("canvas");
let context = canvas.getContext("2d");
canvas.width = downloadedImg.width;
canvas.height = downloadedImg.height;
context.drawImage(downloadedImg, 0, 0);
imageBox.appendChild(canvas);
try {
localStorage.setItem("saved-image-example", canvas.toDataURL("image/png"));
} catch (err) {
console.log("Error: " + err);
}
}
imageReceived()
вÑзÑваеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑобÑÑÐ¸Ñ "load"
в ÑлеменÑе HTMLImageElement
, коÑоÑÑй полÑÑÐ°ÐµÑ Ð·Ð°Ð³ÑÑженное изобÑажение. ÐÑо ÑобÑÑие ÑÑабаÑÑваеÑ, как ÑолÑко вÑе загÑÑженнÑе даннÑе ÑÑановÑÑÑÑ Ð´Ð¾ÑÑÑпнÑми. Ðн наÑинаеÑÑÑ Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑлеменÑа <canvas>
, коÑоÑÑй Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² URL-адÑÐµÑ Ð´Ð°Ð½Ð½ÑÑ
и полÑÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к конÑекÑÑÑ 2D-ÑендеÑинга Ñ
олÑÑа (CanvasRenderingContext2D
) в пеÑеменной context
.
Ð Ð°Ð·Ð¼ÐµÑ Ñ
олÑÑа наÑÑÑаиваеÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ Ð¿Ð¾Ð»ÑÑеннÑм изобÑажением, заÑем изобÑажение ÑиÑÑеÑÑÑ Ð½Ð° Ñ
олÑÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ drawImage()
. ÐаÑем Ñ
олÑÑ Ð²ÑÑавлÑеÑÑÑ Ð² докÑменÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¾Ð±Ñажение бÑло видно.
ТепеÑÑ Ð¿ÑиÑло вÑÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно ÑоÑ
ÑаниÑÑ Ð¸Ð·Ð¾Ð±Ñажение локалÑно. ÐÐ»Ñ ÑÑого Ð¼Ñ Ð¸ÑполÑзÑем меÑ
анизм локалÑного Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Web Storage API, доÑÑÑп к коÑоÑÐ¾Ð¼Ñ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ ÑеÑез localStorage
глобалÑно. ÐеÑод canvas toDataURL()
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² data:// URL, пÑедÑÑавлÑÑÑий изобÑажение PNG, коÑоÑое заÑем ÑоÑ
ÑанÑеÑÑÑ Ð² локалÑном Ñ
ÑанилиÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ setItem()
.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ Ð¸Ð»Ð¸ пеÑеделаÑÑ ÑÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð½Ð° Glitch.
СмоÑÑиÑе ÑакжеRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4