💻 Bilgisayar

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="https://ubenzer.com/wp-content/uploads/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} ^/wp-content/uploads/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)$ https://ubenzer.com/wp-content/uploads/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. (Dikkat: Hareken çeken el içerir. 😀 )

İ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/wp-content/uploads/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.

Bant Genişliği Hırsızlarına Hotlink Koruması 25 yorum aldı.

  1. !^http://(. \.)?ubenzer.com$ [NC]
    burada ubenzer ile .com arasında ters slash işareti kullanılmamış ama diğer adreslerde ters slash işareti kullanmılmış. Bunun sebebi nedir ?
    ?facebook\.com/
    ?google\.com/

  2. @Selim: İyi yakalamışsın, teşekkür ederim.

    Oradaki ters slash işareti .’nın regular expression olarak algılanmaması için bir kaçma (escape) işareti. Yani onu tüm satırlarda eklemeliyiz.

    Kodu güncelledim.

  3. Merhaba Umut, bu konuda araştırma yaparken siteni buldum. Benim sorunum şu sitemde haberler ya da makaleleri facebookta paylaştığımda eklemiş olduğum resimler çıkmıyor sadece sol blokta bulunan firma logoları çıkıyor. Bu sorunu çözemedim, yukarıdaki kodlarıda denedim ama sonuç alamadım. Benm sitemdeki sorun ne olabilir? Host sağlayıcıma sordum hotlink koruması varmı diye bakalım nediyecekler. Seninde fikirini alayım istedim.

    İyi çalışmalar.

  4. @Mehmet: Valla yazıda yazanlar dışında bir öneri getiremeyeceğim maalesef. Düşünüdm ama aklıma başka bir şey gelmedi.

    İyi geceler

  5. yaralı bir yazı olmuş. sormak istediğim bişey var. örneğin wordpresste resimler wp-content/uploads/yıl/ay/ şeklinde oluşuyor. .htaccsess te resim klasörümüzü/wp-content/uploads olarak göstersek tüm alt klasörlerde dahil olurlmu. yoksa sadece uploads klasörümü geçerli olur. klasör içerisindeki tük klasörleride göstermek gerekirmi. Eğer öyleyse her ay htaccess aç klasör adı ekle. ölüm… bir çözümü varsa biligilendirir seiniz sevinirim.

    1. .htaccess dosyaların etki alanı şu şekilde:

      1. Eğer bir klasörün içinde .htaccess varsa o etkilidir.
      2. Eğer bir klasörde .htaccess yoksa ama üst klasörlerinden birinde bir .htaccess dosyası varsa o etkilidir.
      (bu muhtemelen daha ayrıntılıdır ama tam uzmanı değilim)

      Bu yüzden en üst klasöre koyulacak bir.htacess yeterli olacaktır. Benim wordpress'im için bu, public_html'e denk geliyor.

      Buraya engelleme kodunu yazınca, değil sadece uploads, wp-includes'in içindeki resimler bile korumaya alınıyor. Tek bir exception/ayrılcalık tanımamız gerekiyor, o da hotlink resimlerinin olduğu klasör ki, hotlink resimlerini de hotlinkten korumayalım. Bu kod parçası da yazıda var zaten.

      Sonuç olarak, en tepeye bir tane konulsa yeterlidir, tek tek gerek yok. 🙂

      1. Öncelikle mesajıma cevap verdiğiniz için teşekkür ederim. Sorunu yardımınızla çözdüm.
        Ben buradaki adresi

        RewriteCond %{REQUEST_URI} ^/wp-content/uploads/hotlink

        engellenecek klasör olarak anladım. hotlinklerde gösterilecek resimleride buraya atmışım. Yani korumak istediğim resimlerin bulunduğu alana. Dolayısı ile hem korumak isterken hemde izin vermiş gibi bişey oldum sanırım. şimdi uploads klasörünün içine hotlink diye bi klasör açarak adresi

        RewriteCond %{REQUEST_URI} ^/wp-content/uploads/hotlink

        olarak değiştirince sorun çözüldü. Aynı problemli yaşıyanlar olursa diye değinmek istedim yaşadığım probleme.

        Çok teşekkürler

  6. Umut ber merhaba,

    Öncelikle bu detaylı anlatımınız için teşekkür ederim. Resimlerimi tüm sitelerde değilde sadece belirlediğimiz sitelerde görünmemesi için ne yapabiliriz?

    Örneğin xxx.com yyy.com isimli iki sitede resimlerin görüntülenmesini engelleyebilir miyim?

    1. Mümkün, sadece kodları biraz değiştirmeniz gerekiyor. Whitelist kavramından blackliste çevirmeniz lazım çalışma mantığını. Ama elimde böyle bir kod hazır yok, deneme yanılmalar ile bulmanız lazım malesef.

  7. Bu durum çok oluyor. Zararı olduğu gibi ufakta olsa faydasıda oluyor. Genelde resmi çalan site aynı alanda faaliyet gösterilen bir site oluyor. Sizde alanınızla alakalı bir siteden backlink almış oluyorsunuz. Tabi bw ye aşırı yük bindirdiği durumlarda anlattığınız gibi önlem almak gerekir. Ama pek bir yükü yoksa bence bir şey yapmaya gerek yok.

  8. Öncelikle ayrıntılı anlatım için teşekkürler.
    Bir sorum var: Aynı uzantıyı hem küçük hem de büyük harflerle oluşturamadım. İkisi de aynı dosya olarak gözüküyor ve ad değiştirmem isteniyor. Yani ben toplam 5 adet hotlink resmi oluşturabildim. Windows ortamında hem büyük hem de küçük uzantıyı nasıl yapabilirim?

    1. Aynı isimli büyük/küçük harf farklı dosya ismi oluşturmak Windows ortamında bildiğim kadarıyla mümkün değil. Linux'te büyük/küçük harf duyarlı dosya isminde, Windows'ta ise aynı.

      1. Cevabınız için teşekkür ederim.
        Linux tabanlı bir hostum var. Kullandığım sistem ise Windows. Sorunumu şöyle hallettim:
        Bilgisayarımdaki bir klasöre küçük uzantılı resim dosyalarını, başka bir klasöre de büyük uzantılı resim dosyalarını kaydettim. Daha sonra FTP ile her iki klasörün içindeki dosyaları sitemdeki tek bir klasörün içine yükledim. Şu an sitemde tek bir klasörün içinde hem küçük hem büyük uzantılı dosyalar mevcut.

  9. Tamda aradığım şey bu kodları kendime göre düzenledim resmide ayarladıktan sonra izleyip görelim.Bol hitli bir dizi sitesi benden aldıuğı resimlerle olan bandwithimi yedi.Ayın 2.günü 200 hitli sitem bw dolduğu için kapandı.

  10. Hocam yüreğinize sağlık anlatım süper web sitemde de böyle bir sonuçla karşılaştım jpg atıyorum artık teşekkürler Hocam kolay gelsin

  11. hocam eline kolu sağlık vallahi 10 numara oldu, gencgrafiker.com'un trafiği 3 aydır 4 katına çıktı sonradan farkettim görsellerin araklandığını.

  12. teşekkürler kullandığım bir yöntem ama büyük bir sorunu var belki çözümü vardır ama ben bulamadım

    eğer kullanıcı bir defa hotlik korumasına yakalandıysa

    ""dres satırına doğrudan girildiğinde ya da sık kullanılanlardan çağrıldığında"" bile hotlink resimi görünüyor ama bir kaç kere denerse resim görünüyor

    bir çözümü varmıdır ya da daha esnek bir kod

    iyi çalışmalar

    1. Hotlink resimlerinin tarayıcı tarafından önbelleğe alınmaması ile ilgili ayarları yapmanız gerekiyor. Kod örneği sunamıyorum ancak bu başlangıç noktası ile internette araştırırsanız mutlaka bir şeyler çıkacaktır. İyi akşamlar.

      1. sanırım kod budur: "RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]"

        bir çok aramada bu sonuca ulaştım birde arama sitelerini http, https olarak iki kere eklemek yerine daha basit bir yöntem varmış onuda uyguladım

        oluşturduğum listeyi yoruma ekliyorum belki birilerinin işine yarar

        iyi çalışmalar

        RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
        RewriteCond %{HTTP_REFERER} !google\. [NC]
        RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
        RewriteCond %{HTTP_REFERER} !bing\. [NC]
        RewriteCond %{HTTP_REFERER} !msn\. [NC]
        RewriteCond %{HTTP_REFERER} !live\. [NC]
        RewriteCond %{HTTP_REFERER} !ask\. [NC]
        RewriteCond %{HTTP_REFERER} !yandex\. [NC]
        RewriteCond %{HTTP_REFERER} !altavista\. [NC]
        RewriteCond %{HTTP_REFERER} !aol\. [NC]
        RewriteCond %{HTTP_REFERER} !excite\. [NC]
        RewriteCond %{HTTP_REFERER} !mywebsearch\. [NC]
        RewriteCond %{HTTP_REFERER} !blekko\. [NC]
        RewriteCond %{HTTP_REFERER} !lycos\. [NC]
        RewriteCond %{HTTP_REFERER} !dogpile\. [NC]
        RewriteCond %{HTTP_REFERER} !webcrawler\. [NC]
        RewriteCond %{HTTP_REFERER} !infospace\. [NC]
        RewriteCond %{HTTP_REFERER} !yandex\. [NC]
        RewriteCond %{HTTP_REFERER} !search\. [NC]
        RewriteCond %{HTTP_REFERER} !goodsearch\. [NC]
        RewriteCond %{HTTP_REFERER} !excite\. [NC]
        RewriteCond %{HTTP_REFERER} !ixquick\. [NC]
        RewriteCond %{HTTP_REFERER} !baidu\. [NC]
        RewriteCond %{HTTP_REFERER} !exalead\. [NC]
        RewriteCond %{HTTP_REFERER} !gigablast\. [NC]
        RewriteCond %{HTTP_REFERER} !qrobe\. [NC]
        RewriteCond %{HTTP_REFERER} !sogou\. [NC]
        RewriteCond %{HTTP_REFERER} !soso\. [NC]
        RewriteCond %{HTTP_REFERER} !volunia\. [NC]
        RewriteCond %{HTTP_REFERER} !youdao\. [NC]
        RewriteCond %{HTTP_REFERER} !duckduckgo\. [NC]
        RewriteCond %{HTTP_REFERER} !mynet\. [NC]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir