<img> Durad(8) logo </img>   Durad(8)

Cross-Origin Resource Policy (CORP) као ефикасна заштита од хотлинкинга (енгл. hotlinking)

написано: 2022-06-29

Пар пута годишње проверавам садржај на серверу, унапређујем и тестирам шта год ми падне на памет. Једна од ствари о којима бринем је спречавање хотлинкинга тј. спречавање аутора на интернет презентацији, коју ћемо да зовемо "АБВ" у даљем тексту, да оставља директне везе до слика са моје презентације и тиме користи моје ресурсе на својој локацији. Циљ је да спречимо АБВ да потроши сав месечни проток код вашег пружалаца услуга зато што не добијамо тј. не можемо сви да приуштимо 1 терабајт протока месечно (које АБВ може да потроши уместо мене). На крају крајева: изазов је подесити овај механизам стога је забавно у старту.

HTTP_REFERER и REQUEST_FILENAME методе

Апач код за .htaccess је релативно прост, уколико знате шта вам је неопходно:

<IfModule mod_rewrite.c>
  RewriteCond %{HTTP_REFERER}     !^$
  RewriteCond %{REQUEST_FILENAME} -f
  RewriteCond %{REQUEST_FILENAME} \.(jpe?g?|gif|png|svg?z|webp|avif|jxl)$ [NC]
  RewriteCond %{HTTP_REFERER}     !^https?://([^.]+\.)?ВАШ_ДОМЕН\. [NC]
  RewriteRule \.(jpe?g?|gif|png|webp|svg?z)$ - [F,NC,L]
</ifModule>

Уколико се не пошаље захтев са ваше локације или затражите наведени тип датотеке, нећете моћи да учитате садржај на АБВ презентацији. Ова правила садрже 2 критеријума по којима се блокира приказ садржаја на АБВ локацији стога је приступ поприлично добар.

Cross-Origin-Resource-Policy

Друга опција је коришћење Cross-Origin-Resource-Policy заглавља. Практично, ово заглавље контролише проверу извора тренутне везе у односу на извор захтева тј. да ли АБВ тражи ресурс са АБВ или са ВАШ_ДОМЕН.

Оно што ми је занимљиво јесте да се ова метода може користити за блокирање хотлинкинга и то у значајно мање корака. За простије, статичне презентације, ово је можда и боље решење него први метод. За комплексније презентације и прогресивне веб апликације је ово теже подесити стога захтева одређено искуство са серверима.

Најпростије решење је дефинисање заглавља следећом линијом:

Header always set Cross-Origin-Resource-Policy same-origin

Код је сличан и за енџиникс (енгл. nginx)

add_header 'Cross-Origin-Resource-Policy' 'same-origin';

као и за lighttpd, кроз mod_setenv

setenv.add-response-header = ( "Cross-Origin-Resource-Policy" => "same-origin" )

Када подесите заглавље, тестирање у Хромијуму даје следећи резултат када АБВ покуша да учита слику са моје локације:

Да би користио овај ресурс из другог извора, сервер може да ублажи заглавље одговора у вези са смерницама за ресурсе из различитих извора:
Cross-Origin-Resource-Policy: same-site - Одаберите ову опцију ако се ресурс и документ приказују са истог сајта.
Cross-Origin-Resource-Policy: cross-origin - Одаберите ову опцију само ако произвољни веб-сајт који обухвата овај ресурс не представља безбедносни ризик.

Сервер шаље статус 403 што може бити корисно за дневник дешавања. Поприлично згодно зар не?