Bant Genişliği Hırsızlarına Hotlink Koruması

Wikipedia der ki:

Inline linking (also known as hotlinking, leeching, piggy-backing, direct linking, offsite image grabs and bandwidth theft) is the use of a linked object, often an image, from one site into a web page belonging to a second site. The second site is said to have an inline link to the site where the object is located.

Kısa ve Öz Meali:

Hotlinking, bir sitenin başka bir sitenin (genelde resim dosyası olan) içeriğini izinsiz kullanması (bant genişliği hırsızlığı yapması) anlamına gelir.

Basit bir örnek verecek olursak: Siz web sitenize bir fotoğraf (mesela Türk bayrağı) yüklersiniz. Bu fotoğrafın adresi (siteniz.com/resim.jpg) olur. Başka bir X sitesi de, içeriğine Türk bayrağı eklemek ister. Ancak sizin fotoğrafınızın bir kopyasını kendi sunusuna atmak yerine aşağıdaki kodu kullanarak, doğrudan sizin sununuzdan çeker:

<!-- ADAMIN SİTESİNİN ADRESİNİN hirsiz.com OLDUĞUNU VARSAYARSAK -->
<img src="http://www.ubenzer.com/deepo/hotlink/hotlink.png" alt="Bayrak" />

Bunun size zararı nedir?

Bandwidth (ya da bant genişliği, BW), web sitenizin yayınlanması için anlaşma yaptığınız şirketin size (genelde) bir aylık süre zarfı içerisinde yapabileceğiniz en çok veri aktarım boyutu için koyduğu sınırdır. Sözgelimi, sizin bant genişliğiniz 500MB olsun. Web sitenizin her sayfasının 0.1MB (100KB) olduğunu varsayarsak, bir ayda en fazla 50000 sayfa görüntülenebilir. Daha sonra siteniz ay bitene kadar kapalı kalacaktır.

Başka birinin sizin alanınızdaki bir dosyayı sömürmesi de size bu noktada zararlıdır. Adam sizin kendi sunucunuza attığınız karikatürleri bir foruma gönderiyor olabilir. Forumda bu resimlerin her yüklenişi size BW gideri olarak patlayacaktır... Biraz acemiyseniz bundan haberiniz bile olmayabilir.

Hırsızlığı nasıl tespit ederiz?

HTTP protokülünde referans (referrer) denilen bir olay vardır. Basitçe özetlersek, HTTP protokolü ile bir istek yapıldığında, istekle beraber bir referans gönderilebilir. Referans "içinde bulunulan son sayfa" olarak açıklanabilir. Örneğin Facebook'ta paylaşılan bir bağlantınıza birisi tıkladığında HTTP Referrer kullanıcının Facebook'ta o anda bulunduğu sayfanın tam adresi olacaktır. Bir HTML belgesinin içindeki bir resim (img tagı) yüklenecekse, tarayıcı referrer olarak sayfanın adresini gönderecektir.

HTTP Referrer tarayıcıya bağlıdır ve çeşitli eklentilerle gönderilmemesi sağlanabilir. Eğer bir sitenin adresini adres çubuğuna elle yazarak girerseniz de HTTP referans bilgisi göndermemiş olursunuz.

Bir dosya, sizin içeriğinizi ve bant genişliğinizi sömüren sitede açılmaya çalışıldığında referans olarak bu sitenin adresi gelecektir. Böylece hırsızlığı tespit edebilirsiniz.

Nasıl çözülür?

HTTP Referrer bilgisini kontrol edebileceğiniz her yolla. Ama en basiti (linux ortamında) .htaccess dosyası ile. Sitenizin kök klasörüne aşağıdaki bilgileri içeren bir .htaccess dosyası oluşturursanız JPG, JPEG, PNG, GIF ve BMP formatındaki dış referanslar sizin istediğiniz bir dosyaya yönlenecektir.

Bu kod parçası mod_rewrite'nin açık olmasını gerektirmektedir ki, açık değilse ve siz o hosting firmasını seçtiyseniz kendinizi camdan atabilirsiniz. Yok eğer sunucunun sahibi benim diyorsanız httpd.conf dosyasında gerekli oynamaları yapıp sunucuyu yeniden başlatmalısınız.

# BEGIN Hotlink Koruması

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_URI} ^/deepo/hotlink
# Hotlink resimlerinin olduğu dizini korumasız yapmalıyız ki, sonsuz dönüye girmeyelim.
RewriteRule ^.*$ - [L]

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?ubenzer\.com [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?facebook\.com [NC]
RewriteCond %{HTTP_REFERER} !^https://(.+\.)?facebook\.com [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google\.com [NC]
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google\.com\.tr [NC]

# Yukarıdaki sitelerden biri referans olarak gelirse engelleme mekanizması çalışmaz. Kendi sitemizi
# bu alana eklemek ÖNEMLİDİR! Yoksa kendi sitemize de hırsız muamelesi uygularız.
# Facebook ve Google tarzı sitelerde de ön izlemelerin çalışması için yine mekanizmayı çalıştırmamak iyidir.

RewriteRule .*\.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)$ http://www.ubenzer.com/deepo/hotlink/hotlink.$1 [L]
# Her formatı ayrı ayrı ele almak gerekir. Hırsız PNG istediğinde siz JPG biçimi gönderirseniz her tarayıcı bunu doğru yorumlayamaz.
</IfModule>

# END Hotlink Koruması

Dosya iyi hoş da, bir anlatıversen?

Anlatalım efendim.

Öncelikle hırsızların istediği resim yerine görünecek resimlerimizi hazırlayarak jpg, gif, png ve bmp formatlarında kaydediyoruz. Daha sonra büyük-küçük harf sorunlarını engellemek için uzantıların büyük harflilerini de kaydediyoruz. (Linux sistemlerde a.JPG ile a.jpg farklı dosya olarak kabul edilir.) Kısaca aşağıdaki dosyaları hazırlıyoruz:

  • hotlink.GIF
  • hotlink.gif
  • hotlink.JPG
  • hotlink.jpg
  • hotlink.JPEG
  • hotlink.jpeg
  • hotlink.BMP
  • hotlink.bmp
  • hotlink.PNG
  • hotlink.png

Eğer ilham gelmiyorsa, benim hotlink resmimden ilham alabilirsiniz.

İkinci adımda sitenizde "hotlink korumasız" bir dizin oluşturmalısınız. Hotlink durumunda görünecek resimleri de hotlink korumasına maruz bırakırsanız insanlık sizi affetmez. Benim örneğimde bu dizin www.ubenzer.com/deepo/hotlink/. Kendi .htaccess dosyanızı bunu ele alarak değiştirin.

Üçüncü adım olarak hotlink korumasından etkilenmeyecek siteleri ayarlamalısınız. Kendi sitenizi mutlaka yazın, yoksa kendi kendinize hırsız muamelesi yaparsınız. Verdiğim örnek .htaccess dosyası tüm subdomain ve adresleri kapsayacak örneklerdir. Mesela facebook.com adresini beyaz listeye alırsanız static.ak.facebook.com da alınır.

Google ve Facebook gibi, ön izlemenin önemli olabileceği siteleri beyaz listeye almanızı ve

RewriteCond %{HTTP_REFERER} !^$

satırını kullanmanızı tavsiye ederim. Bu satır hiçbir referans olmadığında (yani adres satırına doğrudan girildiğinde ya da sık kullanılanlardan çağrıldığında) ilgili resmin görünmesini sağlayacaktır. (Aşırı koruyucu olmamak lazım bir yerde...)

Son adımda, yaptıklarınızın keyfini çıkarmak kalıyor size. Bitti bu kadardı. 😃 Hırsızlardan artakalan bant genişliğinizi güle güle kullanın.

Güncelleme: .htaccess kodlarındaki ufak bir hatayı giderdim. Yorumuyla beni uyarak Selim'e teşekkürlerimi sunarım.