Görsel Hotlinking Neden Sorun Yaratır ve Nasıl Önlenir
Sunucunuzdaki bir görseli başka bir site doğrudan URL üzerinden kendi sayfasında gösteriyorsa, o görseli indiren her ziyaretçi sizin bant genişliğinizi tüketir. Görsel onların sitesinde görünür, maliyet size yansır. Hotlinking (doğrudan bağlantı) tam olarak budur: başka bir sitenin, dosyayı kopyalamak yerine sizin sunucunuzu kaynak olarak işaret etmesi.
Birkaç görsel için bu durum göz ardı edilebilir. Ancak viral içerik üretiyorsanız, bir e-ticaret kataloğunuz varsa ya da büyük boyutlu görseller yayınlıyorsanız, hotlinking bant genişliği faturanızı beklenmedik biçimlerde artırabilir. Sorunu fark etmek genellikle gecikmeli olur; çoğunlukla anormal bir trafik artışı ya da hosting panelinizden gelen bir uyarı sayesinde anlarsınız.
Korunma yöntemleri iki katmanda toplanır: sunucu yapılandırması ve CDN kuralları. İkisini de yanlış kurmak bazı meşru istekleri engelleyebilir; doğru kurmak ise kaynak sızıntısını büyük ölçüde kapatır.
Hotlinking tam olarak nasıl çalışır?
Bir tarayıcı görsel yüklemek için HTTP isteği gönderdiğinde, bu isteğe Referer başlığı eklenir. Başlık, isteğin hangi sayfadan geldiğini belirtir. Kendi sitenizden gelen isteklerde bu değer sizin alan adınızdır; başka bir siteden geliyorsa o sitenin adresidir. Hotlinking tespiti bu bilgiye dayanır.
Sorun şu: Referer başlığı her zaman gelmez. Kullanıcı, tarayıcı ayarlarına bağlı olarak başlığı gizleyebilir; bazı güvenlik araçları onu siler; HTTPS'ten HTTP'ye geçişlerde başlık düşer. Dolayısıyla hotlink koruması her koşulda tam sonuç vermez. Yönlendirme başlığı gelmediğinde ne yapılacağına dair bir kural yazmazsanız, bu istekler büyük olasılıkla kabul edilir.
Gerçek hotlinking çoğunlukla bilinçli bir tercihtir. Biri görsel URL'nizi alır, <img src="https://siteniz.com/gorseller/urun.jpg"> şeklinde kendi sayfasına yazar ve geçer. Görselin sahibi olduğunuzu bilseler bile kaynak kullanımını düşünmeyebilirler; kendi sayfalarının görünür olması onlar için yeterlidir.
Bant genişliği maliyeti ve performans üzerindeki etki
Hotlinking'in etkisi, kaç kişinin o görseli yüklediğiyle doğrudan orantılıdır. 500 KB'lık bir ürün görseli başka bir sitede yüksek trafikle görüntülenirse, sunucunuzdan ciddi miktarda çıkış trafiği gerçekleşir. Hosting planınızda çıkış trafiği sınırlıysa aşımda fatura gelir ya da bant genişliği kısılır.
Yalnızca para sorunu değildir. Kendi ziyaretçileriniz sunucuya istek gönderdiğinde, hotlinker'ların tükettiği bant genişliği nedeniyle yanıt süreleri uzayabilir. Yoğun hotlinking altında sunucu, kendi sayfalarınızı yüklemek için ayrılması gereken kaynağı başka sitelerin görselleri için harcar.
CDN kullananlar için tablo biraz farklıdır. CDN, orijin sunucunun önünde yer aldığından hotlink istekleri çoğunlukla edge sunucusundan yanıtlanır ve orijin sunucuya ek yük bindirmez. Ancak CDN çıkış trafiği için de ödeme yapılır; maliyet, sağlayıcının fiyatlandırmasına göre değişir. Boşa harcanan trafik olduğu gerçeği her iki durumda da geçerlidir.
.htaccess ile hotlink koruması
Apache tabanlı bir sunucuda en yaygın yöntem .htaccess dosyasına mod_rewrite kuralları eklemektir. Aşağıdaki yapılandırma, siteniz dışından gelen görsel isteklerini reddeder:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?siteniz\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|svg)$ - [F,L]
Kuralları sırayla açıklamak gerekirse: RewriteEngine On modülü etkinleştirir. İlk RewriteCond satırı boş Referer değerlerini dışarıda bırakır; bu sayede doğrudan adres çubuğundan yapılan istekler engellenmez. İkinci koşul kendi alan adınızdan gelen isteklere izin verir. RewriteRule ise eşleşen görsel uzantıları için 403 Forbidden döndürür.
[F,L] bayrakları kritik ayrıntıdır. F isteği reddeder; L kural zincirini orada durdurur. İkisini birlikte yazmak gerekir, aksi takdirde sonraki kurallar çalışmaya devam edebilir.
Nginx kullanıyorsanız yapılandırma farklı bir sözdizimi gerektirir:
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
valid_referers none blocked ~\.siteniz\.com;
if ($invalid_referer) {
return 403;
}
}
valid_referers none blocked ifadesi, boş ve sunucu tarafından silinmiş Referer değerlerini geçerli sayar; yalnızca açıkça başka bir siteden geldiği belli olan istekler reddedilir.
Boş Referer başlıklı istekleri de engellemek isteyebilirsiniz. O durumda ilk RewriteCond satırını kaldırın. Ancak bu tercih, sözlükler, PDF okuyucular ve bazı mobil tarayıcılar gibi başlık göndermeyen meşru kaynakları da keser. Kararı sitenizin gerçek kullanım şekline göre verin.
Engelleme yerine başka görsel göstermek
Sadece 403 döndürmek yerine hotlink isteğine özel bir görsel gösterebilirsiniz. Klasik tercih, alan adınızı içeren küçük bir "bu görsel izinsiz kullanılıyor" mesajlı dosya sunmaktır. Apache için şu kural yeterlidir:
RewriteRule \.(jpg|jpeg|png|gif|webp)$ /hotlink-engel.png [R,L]
Bir avantajı var: hotlinker'ın sitesinde bozuk görsel yerine alan adınızı gösteren bir resim çıkar; farkında olmasalar bile sitenizin adı yayılır. Dezavantajı şudur - sunucunuz yine de o isteğe yanıt verir ve bant genişliği tüketir, yalnızca asıl görsel yerine daha küçük bir dosya gönderir.
Amaç yalnızca bant genişliğini korumaksa 403 döndürmek daha verimlidir. Görünürlük kazandırmak istiyorsanız yönlendirme tercih edilebilir. İki hedef birbiriyle çelişir; ikisini aynı anda elde etmek mümkün değildir.
CDN katmanında hotlink koruması
Sunucu düzeyindeki kural çalışır, ancak isteğin CDN edge sunucusuna ulaşmasını engellemez. Yalnızca orijin sunucuya gelen yükü azaltır. Hotlink isteklerini CDN katmanında kesmek daha verimlidir: istek edge'de düşer, orijin sunucuya hiç gitmez ve CDN çıkış trafiği de azalır.
Çoğu CDN sağlayıcısı "hotlink protection" adıyla hazır bir özellik sunar. Etkinleştirdiğinizde izin verilen Referer alan adlarını belirtirsiniz; geri kalanlar otomatik reddedilir. Ayar genellikle kontrol panelinden yapılır ve .htaccess değişikliği gerektirmez.
Daha ayrıntılı kural yazıyorsanız CDN'in firewall ya da WAF özelliğini kullanabilirsiniz. Temel mantık şudur: istek URL'si görsel uzantısıyla bitiyorsa ve Referer başlığı kendi alan adınızı içermiyorsa engelle. CDN'in kural motoruna bağlı olarak düzenli ifade desteği de gelir.
Signed URL ya da token tabanlı kimlik doğrulama başka bir seçenektir. Görsel URL'sine zaman sınırlı bir token eklenir; bu token olmadan istek reddedilir. Uygulaması daha karmaşıktır, ancak hotlinking'e karşı en sağlam engeli oluşturur. E-ticaret ürün görselleri veya korunan içerik için anlamlıdır; standart blog görselleri için genellikle fazla karmaşıktır.
İzin verilen referrerları yönetmek
Hotlink koruması kurulurken en sık yapılan hata, geniş bir engel listesi oluşturmak yerine izin verilenler listesini dar tutmaktır. Bunun anlamı şudur: yalnızca açıkça tanımladığınız alan adlarına izin verilir, diğer her şey reddedilir.
Kendi alt alan adlarınızı unutmak yaygındır. www.siteniz.com'u listeye aldınız, ancak blog.siteniz.com ya da m.siteniz.com dışarıda kaldıysa bu alt alan adlarından gelen görsel istekleri de reddedilebilir. Düzenli ifadeyle tüm alt alanları bir arada kapsamak daha sağlam bir yaklaşımdır:
RewriteCond %{HTTP_REFERER} !^https?://([a-z0-9-]+\.)?siteniz\.com/ [NC]
Sosyal medya önizlemelerini de göz önünde bulundurun. Bağlantı paylaşıldığında bazı platformlar önizleme için görsel isteği gönderir ve Referer başlığı her zaman gelmez. Sosyal medya önizlemelerinin doğru çalışmasını istiyorsanız boş Referer değerlerine izin verin.
Harici ortaklarınız varsa - görsellerinizi meşru biçimde kullanan medya siteleri ya da iş ortakları - bunları da listeye ekleyin. Whitelist'i zaman içinde güncel tutun; ortaklık bitmişse ilgili alan adını kaldırın.
Koruma ne zaman gereksiz ya da ters etki yaratır?
Görseller küçükse ve sitenizin trafiği düşükse, hotlinking'in somut bir maliyet etkisi olmaz. Koruma kurmak için harcanan zaman, sağlayacağı kazanımın önüne geçebilir.
İzin verilmesi gereken kaynakları yanlış yapılandırırsanız meşru kullanıcılar zarar görür. Örneğin e-posta bülteninizde görsel URL'si kullandıysanız, e-posta istemcileri genellikle Referer başlığı göndermez. Sıkı bir kural bu görselleri bültenlerinizde kırar. RSS okuyucular için de aynı durum geçerlidir; çoğu istemci başlık göndermez.
Arama motoru tarama botları da Referer başlığı göndermez ya da kendi alan adlarını gönderir. Görsellerinizin arama motoru indeksine girmesini istiyorsanız bu botların erişimini kesmemelisiniz. Çoğu durumda boş Referer değerlerine izin vermek yeterlidir; botlar zaten kendine özgü User-Agent değerleri kullanır ve istenirse bu değere göre ayrı bir kural yazılabilir.
CDN önbelleği sıcakken orijin sunucuya istek gelmez; soğuk başlangıçta ya da TTL dolduğunda gelir. .htaccess kuralı yalnızca orijin sunucuya ulaşan istekleri keser, önbellekten servis edilenleri etkilemez. Tam koruma için CDN katmanında kural tanımlamak tercih edilir.
Hotlinking'e karşı alınan önlemin değeri, bant genişliği maliyetinizle ve görsel büyüklüğünüzle orantılıdır. Hafif trafik alan küçük bir site için basit bir .htaccess kuralı yeterlidir; yüksek çözünürlüklü görseller veya yoğun trafik çeken siteler için CDN düzeyinde kural daha güvenilir bir çözüm sunar.
Korumanın çalışıp çalışmadığını test etmek için farklı bir alan adı üzerinde yazılmış küçük bir HTML dosyasından görsel URL'nizi çağırın; isteğin döndürdüğü durum kodunu kontrol edin. 403 görüyorsanız kural işliyor demektir. CDN kullanıyorsanız edge günlüklerinde engellenen istekleri takip edebilirsiniz.
İzin verilenler listesini kısa bir yorum satırıyla belgelemek küçük ama değerli bir alışkanlıktır. Ay sonra kuralı düzenlemek istediğinizde hangi alan adını neden eklediğinizi hatırlamak için tek bir satır bile yeterlidir.