Frame Buster Buster… diperlukan kode buster


422

Katakanlah Anda tidak ingin situs lain "membingkai" situs Anda di <iframe>:

<iframe src="http://example.org"></iframe>

Jadi, Anda memasukkan JavaScript penghilang bingkai dan penghilang bingkai ke semua halaman Anda:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Luar biasa! Sekarang Anda "gagal" atau keluar dari iframe yang mengandung secara otomatis. Kecuali satu masalah kecil.

Ternyata, kode penghilang bingkai Anda dapat rusak , seperti yang ditunjukkan di sini :

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

Kode ini melakukan hal berikut:

  • menambahkan penghitung setiap kali browser mencoba bernavigasi menjauh dari halaman saat ini, melalui window.onbeforeunloadpengendali acara
  • mengatur timer yang menyala setiap milidetik melalui setInterval(), dan jika itu melihat penghitung bertambah, mengubah lokasi saat ini ke server kontrol penyerang
  • server itu menyajikan halaman dengan kode status HTTP 204 , yang tidak menyebabkan browser bernavigasi ke mana pun

Pertanyaan saya adalah - dan ini lebih merupakan teka-teki JavaScript daripada masalah sebenarnya - bagaimana Anda bisa mengalahkan penghancur bingkai?

Saya memiliki beberapa pemikiran, tetapi tidak ada yang berhasil dalam pengujian saya:

  • berusaha menghapus onbeforeunloadacara melalui onbeforeunload = nulltidak berpengaruh
  • menambahkan proses yang alert()dihentikan biarkan pengguna tahu itu terjadi, tetapi tidak mengganggu kode dengan cara apa pun; mengklik OK memungkinkan penghilang berlanjut seperti biasa
  • Saya tidak bisa memikirkan cara untuk menghapus setInterval()timer

Saya bukan programmer JavaScript, jadi inilah tantangan saya untuk Anda: hei buster, bisakah Anda memecahkan frame-busting buster?


6
Saya tidak yakin frame-buster-buster benar-benar berfungsi ... ketika saya mencoba mengujinya (mengalihkan ke handler yang saya atur untuk mengembalikan 204), itu mencegah saya dari menavigasi ke mana pun di luar halaman - termasuk mengetikkan barang di bilah alamat! Saya harus menutup tab browser dan membuka yang baru untuk pergi ke mana saja. Jadi dengan kata lain, saya tidak yakin ini perlu solusi, karena frame-buster-buster yang ingin ditangkap adalah ... rusak sejak awal. :) (Entah itu atau saya mengacaukan pengujian saya, yang tidak pernah bisa terjadi ...);)
Matt Winckler

16
Matt, kode frame-buster-buster yang diposting di atas pasti berfungsi. A .. eh .. teman .. milikku .. memberitahuku .. tentang itu. Atau sesuatu. :)
Jeff Atwood

10
Jeff, apakah Anda menguji dengan kedua jendela pada domain yang sama? Sepertinya Anda karena jika Anda tidak maka pembatasan keamanan akan mencegah Anda memodifikasi 'onBeforeUnload'
James

29
Di samping catatan: Saat memposting contoh, silakan gunakan domain seperti yang example.orgditentukan dalam RFC 2606 ietf.org/rfc/rfc2606.txt
Christoph

3
Mengenai tema umum kontra-kontra-penanggulangan: galactanet.com/comic/view.php?strip=209
Joey

Jawaban:


149

Saya tidak yakin apakah ini layak atau tidak - tetapi jika Anda tidak dapat merusak frame, mengapa tidak hanya menampilkan peringatan. Sebagai contoh, Jika halaman Anda bukan "halaman atas" buat metode setInterval yang mencoba untuk memecahkan bingkai. Jika setelah 3 atau 4 mencoba halaman Anda masih bukan halaman atas - buat elemen div yang mencakup seluruh halaman (kotak modal) dengan pesan dan tautan seperti ...

Anda melihat halaman ini dalam bingkai jendela yang tidak sah - (Blah blah ... masalah keamanan potensial)

klik tautan ini untuk memperbaiki masalah ini

Bukan yang terbaik, tapi saya tidak melihat cara apa pun mereka bisa skrip jalan keluar dari itu.


2
Saya sudah mencoba ini dan ini berhasil. Sepotong lain yang saya suka tentang solusi ini adalah bahwa hal itu membawa kepada pengguna situs seperti apa dia sebelum pergi ke konten Anda. Kode Contoh: if (parent.frames.length> 0) {top.location.replace (document.location); setTimeout (function () {if (parent.frames.length> 0) {document.location = " google.com ";}}, 10); }
Paus

Tidak hanya ini cara yang baik untuk menghindari penyalahgunaan, itu cukup ramah untuk situs yang mungkin ingin membingkai situs Anda hanya untuk mengintipnya, meskipun tidak mengizinkannya. Idealnya, saya pikir tangkapan layar dari beranda situs harus digunakan, dengan beberapa penjelasan mengapa itu tidak dapat digunakan di iframe yang dilapis di atas.
wheresrhys

33
Begitulah cara Facebook melakukannya.
shamittomar

2
tapi mungkin ini dapat dieksploitasi jika situs penghancur pada gilirannya akan membuat anti anti anti palsu ... (tidak tahu berapa banyak anti kita sampai sekarang) lighbox div untuk dirinya sendiri menghadirkan tautan phishing atau apa pun ... tbc
yunzen

7
Gagasan lain adalah menghapus halaman sepenuhnya dengan sesuatu seperti document.write("");(setelah Anda memastikan bahwa itu sedang dibingkai
gabeio

211

6
luar biasa, mendukung ini di browser .exe adalah cara untuk pergi tanpa keraguan. Ketika Anda mengatakan "sebagian besar browser", yang mana yang spesifik? Saya tidak dapat menemukan sumber yang baik untuk apa pun kecuali IE8.
Jeff Atwood

2
Inilah halaman pengujian: enhie.com/test/clickjack . Chrome 4.1.249.1042 mendukung. Opera 10.50 mendukung. Firefox 3.6.2 belum mendukung. Safari 4.0.3 mendukung.
EricLaw

1
Firefox 3.6.9 akan mendukungnya secara asli ( hackademix.net/2010/08/08/31/... ) dan setiap pemasangan Firefox dengan NoScript telah memilikinya sejak awal 2009 ( hackademix.net/2009/01/29/x-frame- options-in-firefox )
ssokolow

4
Yang terbaik untuk menggabungkan ini dengan framebuster javascript.
Jesse Weigert

1
Atau kombinasikan ini dengan jawaban Desember '12 di halaman ini: stackoverflow.com/a/13708510/328397
goodguys_activate

34

Kami telah menggunakan pendekatan berikut di salah satu situs web kami dari http://seclab.stanford.edu/websec/framebusting/framebust.pdf

<style>
 body { 
 display : none   
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>

3
Bingo! Tidak yakin mengapa ini tidak lebih dipilih karena itu adalah jawaban terbaik (di sebelah jawaban X-Frame-Options, tetapi yang terbaik untuk menggabungkan keduanya)
Jesse Weigert

1
Jawaban atau milik saya ini harus dipilih :)

Saya suka ide Anda menggunakan ini dan X-Frame-Options: deny answer.
Max West

Ini membutuhkan JS, yang merupakan IMHO beban yang cukup besar.
Navin

1
+1 - Ini adalah jawaban terbaik ketika X-FRAME-OPTIONS tidak dapat digunakan. (Misalnya, ketika Anda perlu mengizinkan atau menolak secara bersyarat tergantung pada pengarah.)
Jay Sullivan

29

Datang dengan ini, dan tampaknya berfungsi setidaknya di Firefox dan browser Opera.

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}

2
kedua solusi Jani dan Jeff (setelah diedit) benar dan bekerja dengan setara; memberi Jani penerimaan karena solusinya bekerja dengan benar tanpa mengedit apa pun
Jeff Atwood

29
Ini hanya akan berfungsi jika dua jendela dari domain yang sama; kejadian langka ketika Anda ingin melarikan diri dari bingkai.
James

Jika ada frame bersarang yang terlibat, Anda harus berjalan di rantai bingkai dan menghapus semua onbeforeunloadpenangan, tidak hanya yang di atas!
Christoph

12
klarifikasi penting: ini bekerja untuk saya karena iframe src = sedang diset secara dinamis, dan dengan demikian kebijakan lintas domain TIDAK berlaku. JP benar, dalam src statis = ini tidak akan berfungsi.
Jeff Atwood

5
ok sekarang bisakah seseorang membuat frame buster buster buster buster?
Epaga

23

Mempertimbangkan standar HTML5 saat ini yang memperkenalkan sandbox untuk iframe, semua kode penghilang bingkai yang disediakan di halaman ini dapat dinonaktifkan ketika penyerang menggunakan sandbox karena membatasi iframe dari yang berikut:

allow-forms: Allow form submissions.
allow-popups: Allow opening popup windows.
allow-pointer-lock: Allow access to pointer movement and pointer lock.
allow-same-origin: Allow access to DOM objects when the iframe loaded form same origin
allow-scripts: Allow executing scripts inside iframe
allow-top-navigation: Allow navigation to top level window

Silakan lihat: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox

Sekarang, pertimbangkan penyerang menggunakan kode berikut untuk meng-host situs Anda di iframe:

<iframe src="URI" sandbox></iframe>

Kemudian, semua kode penghilang bingkai JavaScript akan gagal.

Setelah memeriksa semua kode frame busing, hanya pertahanan ini yang berfungsi dalam semua kasus:

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

yang awalnya diusulkan oleh Gustav Rydstedt, Elie Bursztein, Dan Boneh, dan Collin Jackson (2010)


19

Setelah merenungkan ini sebentar, saya percaya ini akan menunjukkan kepada mereka siapa bosnya ...

if(top != self) {
  window.open(location.href, '_top');
}

Menggunakan _topsebagai parameter target untuk window.open()akan meluncurkannya di jendela yang sama.


6
if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}

6

Saya akan berani dan melemparkan topi saya ke atas cincin yang satu ini (kuno seperti itu), melihat berapa banyak downvotes yang bisa saya kumpulkan.

Ini adalah upaya saya, yang sepertinya berfungsi di mana saja saya telah mengujinya (Chrome20, IE8 dan FF14):

(function() {
    if (top == self) {
        return;
    }

    setInterval(function() {
        top.location.replace(document.location);
        setTimeout(function() {
            var xhr = new XMLHttpRequest();
            xhr.open(
                'get',
                'http://mysite.tld/page-that-takes-a-while-to-load',
                false
            );
            xhr.send(null);
        }, 0);
    }, 1);
}());

Saya menempatkan kode ini di <head>dan memanggilnya dari akhir <body>untuk memastikan halaman saya diberikan sebelum mulai berdebat dengan kode berbahaya, tidak tahu apakah ini pendekatan terbaik, YMMV.

Bagaimana cara kerjanya?

... Saya mendengar Anda bertanya - jawaban jujurnya adalah, saya tidak begitu tahu. Butuh banyak fudging untuk membuatnya bekerja di mana-mana yang saya uji, dan efek pastinya sedikit berbeda tergantung di mana Anda menjalankannya.

Inilah pemikiran di baliknya:

  • Atur fungsi untuk dijalankan pada interval serendah mungkin. Konsep dasar di balik salah satu solusi realistis yang saya lihat adalah mengisi penjadwal dengan lebih banyak peristiwa daripada frame buster-buster miliki.
  • Setiap kali fungsi diaktifkan, coba dan ubah lokasi bingkai atas. Persyaratan yang cukup jelas.
  • Juga jadwalkan fungsi untuk segera dijalankan yang akan membutuhkan waktu lama untuk diselesaikan (dengan demikian menghalangi frame buster-buster agar tidak mengganggu perubahan lokasi). Saya memilih XMLHttpRequest sinkron karena itu satu-satunya mekanisme yang dapat saya pikirkan yang tidak memerlukan (atau setidaknya meminta) interaksi pengguna dan tidak mengunyah waktu CPU pengguna.

Untuk saya http://mysite.tld/page-that-takes-a-while-to-load(target XHR) saya menggunakan skrip PHP yang terlihat seperti ini:

<?php sleep(5);

Apa yang terjadi?

  • Chrome dan Firefox menunggu selama 5 detik saat XHR selesai, kemudian berhasil mengalihkan ke URL halaman yang dibingkai.
  • Pengalihan IE segera

Tidak bisakah Anda menghindari waktu tunggu di Chrome dan Firefox?

Sepertinya tidak. Pada awalnya saya mengarahkan XHR ke URL yang akan mengembalikan 404 - ini tidak berfungsi di Firefox. Kemudian saya mencoba sleep(5);pendekatan yang akhirnya saya dapatkan untuk jawaban ini, kemudian saya mulai bermain-main dengan panjang tidur dengan berbagai cara. Saya tidak dapat menemukan pola nyata untuk perilaku tersebut, tetapi saya menemukan bahwa jika terlalu pendek, khususnya Firefox tidak akan bermain bola (Chrome dan IE tampaknya berperilaku cukup baik). Saya tidak tahu apa definisi "terlalu pendek" secara nyata, tetapi 5 detik sepertinya bekerja setiap saat.


Jika ada ninja Javascript yang lewat ingin menjelaskan sedikit lebih baik apa yang terjadi, mengapa ini (mungkin) salah, tidak dapat diandalkan, kode terburuk yang pernah mereka lihat dll. Saya akan dengan senang hati mendengarkan.


Tampaknya Anda dapat menghapus semua kalimat yang mengkhawatirkan
mplungjan

6

Mulai 2015, Anda harus menggunakan frame-ancestorsarahan CSP2 untuk ini. Ini diimplementasikan melalui header respons HTTP.

misalnya

Content-Security-Policy: frame-ancestors 'none'

Tentu saja, belum banyak browser yang mendukung CSP2, jadi sebaiknya sertakan X-Frame-Optionsheader lama :

X-Frame-Options: DENY

Saya akan menyarankan untuk memasukkan keduanya, jika tidak, situs Anda akan terus rentan terhadap serangan Clickjacking di browser lama, dan tentu saja Anda akan mendapatkan framing yang tidak diinginkan bahkan tanpa niat jahat. Sebagian besar browser melakukan pembaruan secara otomatis akhir-akhir ini, namun Anda masih cenderung membuat pengguna korporat terjebak pada versi Internet Explorer lama karena alasan kompatibilitas aplikasi lama.


1
Semua browser utama sekarang mendukung CSP. Ini adalah jawaban yang benar di tahun 2019 dan masa depan yang bisa diduga.
Stephen R

5

Ok, jadi kita tahu bahwa itu ada dalam bingkai. Jadi kami location.href ke halaman khusus lain dengan path sebagai variabel GET. Kami sekarang menjelaskan kepada pengguna apa yang sedang terjadi dan memberikan tautan dengan opsi target = "_ TOP". Ini sederhana dan mungkin akan berfungsi (belum mengujinya), tetapi membutuhkan beberapa interaksi pengguna. Mungkin Anda bisa menunjukkan situs yang menyinggung kepada pengguna dan membuat aula malu clicker ke situs Anda di suatu tempat .. Hanya sebuah ide, tapi itu bekerja malam hari ..


5

Semua solusi yang diusulkan secara langsung memaksa perubahan di lokasi jendela atas. Bagaimana jika pengguna menginginkan frame ada di sana? Misalnya frame teratas di gambar hasil mesin pencari.

Saya menulis prototipe di mana secara default semua input (tautan, formulir, dan elemen input) dinonaktifkan dan / atau tidak melakukan apa-apa saat diaktifkan.

Jika bingkai yang mengandung terdeteksi, input dibiarkan dinonaktifkan dan pesan peringatan ditampilkan di bagian atas halaman. Pesan peringatan berisi tautan yang akan membuka versi halaman yang aman di jendela baru. Ini mencegah halaman dari digunakan untuk clickjacking, sementara masih memungkinkan pengguna untuk melihat konten dalam situasi lain.

Jika tidak ada bingkai yang terdeteksi, input diaktifkan.

Ini kodenya. Anda perlu mengatur atribut HTML standar ke nilai aman dan menambahkan atribut tambahan yang berisi nilai aktual. Ini mungkin tidak lengkap dan untuk keamanan tambahan atribut tambahan (saya berpikir tentang penangan acara) mungkin harus diperlakukan dengan cara yang sama:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
  <head>
    <title></title>
    <script><!--
      function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {
        for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {
          var element = array[ elementIndex ];
          var actualValue = element.getAttribute( actualValueAttributeName );
          if ( actualValue != null ) {
            element[ attributeName ] = actualValue;
          }

          if ( additionalProcessor != null ) {
            additionalProcessor( element );
          }
        }
      }

      function detectFraming() {
        if ( top != self ) {
          document.getElementById( "framingWarning" ).style.display = "block";
        } else {
          replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );

          replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {
            replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );
          });
        }
      }
      // -->
    </script>
  </head>
  <body onload="detectFraming()">
    <div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;">
      <div>
        <b>SECURITY WARNING</b>: Acme App is displayed inside another page.
        To make sure your data is safe this page has been disabled.<br>
        <a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a>
      </div>
    </div>
    <p>
      Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a>
    </p>
    <form name="acmeForm" action="#" acme:action="real-action.html">
      <p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p>
      <p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p>
    </form>
  </body>
</html>

Masalahnya adalah pembuat bingkai dapat menggunakan posisi: mutlak untuk menempatkan tombol aktif di atas tombol tidak aktif Anda dan pengguna hanya akan melihat halaman web Anda dan berpikir mereka mengklik tombol ANDA.
jmucchiello

Pesan peringatan masih akan ditampilkan, tetapi tentu saja mudah untuk menutup tautan ke halaman aman seperti yang Anda sarankan. Tetapi mengapa harus melalui semua kesulitan membingkai halaman saya untuk membuat orang mengklik tombol yang familier jika Anda hanya dapat menyalin halaman dan mencapai efek yang sama? Kode di atas terutama mencegah clickjacking. Jika Anda menampilkan halaman saya tanpa terlihat di atas halaman lain, tidak mungkin untuk meminta tindakan di situs saya.
Johan Stuyts

Jika ini ditempatkan dalam bingkai zona terbatas IE8 atau bingkai kotak pasir Chrome, Javascript tidak akan pernah berjalan. Saya ingin tahu modifikasi apa yang diperlukan dalam kasus-kasus tersebut
goodguys_activate

4

Ya, Anda dapat memodifikasi nilai penghitung, tetapi itu jelas merupakan solusi yang rapuh. Anda dapat memuat konten Anda melalui AJAX setelah Anda menentukan bahwa situs tersebut tidak berada dalam bingkai - juga bukan solusi yang hebat, tetapi mudah-mudahan menghindari menembakkan peristiwa sebelum unload (saya berasumsi).

Sunting: Ide lain. Jika Anda mendeteksi Anda berada dalam bingkai, minta pengguna untuk menonaktifkan javascript, sebelum mengklik tautan yang membawa Anda ke URL yang diinginkan (melewati querystring yang memungkinkan halaman Anda memberi tahu pengguna bahwa mereka dapat mengaktifkan kembali javascript setelah mereka ada).

Sunting 2: Go nuklir - jika Anda mendeteksi Anda berada dalam bingkai, cukup hapus konten isi dokumen Anda dan cetak beberapa pesan yang tidak menyenangkan.

Sunting 3: Dapatkah Anda menyebutkan dokumen paling atas dan mengatur semua fungsi menjadi nol (bahkan yang anonim)?


Outlook (sebelumnya Hotmail) 'pergi nuklir' jika tidak bisa keluar dari bingkai - ini menempatkan seluruh konten di <body>dalam <plaintext>tag diatur ke display: none. Ini cukup efektif.
sampai

4

Jika Anda menambahkan lansiran tepat setelah kode buster, maka lansiran akan menghentikan utas javascript, dan itu akan membiarkan halaman dimuat. Inilah yang dilakukan oleh StackOverflow, dan ia meledak dari iframe saya, bahkan ketika saya menggunakan frame busting buster. Ini juga berfungsi dengan halaman pengujian sederhana saya. Ini hanya diuji di Firefox 3.5 dan IE7 di windows.

Kode:

<script type="text/javascript">
if (top != self){
  top.location.replace(self.location.href);
  alert("for security reasons bla bla bla");
}
</script>

3

Saya pikir Anda hampir sampai. Sudahkah Anda mencoba:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

atau, sebagai alternatif:

window.parent.prevent_bust = 0;

Catatan: Saya sebenarnya tidak menguji ini.


1
Saya telah mengedit contoh kode Anda (tes untuk orang tua tampaknya gagal) tetapi versi yang diedit TIDAK berfungsi!
Jeff Atwood

1
Keren. Selalu sulit untuk menjawab dengan kode yang belum diuji - saya melakukannya untuk setidaknya mendapatkan ide - dan biarkan penanya yang buruk men-debug. :)
Jeff Meatball Yang

12
Tidak akan berfungsi jika orang tua berada di domain yang berbeda, yang mungkin terjadi!
Josh Stodola

2

Bagaimana dengan memanggil buster berulang kali juga? Ini akan menciptakan kondisi balapan, tetapi orang mungkin berharap bahwa buster keluar di atas:

(function() {
    if(top !== self) {
        top.location.href = self.location.href;
        setTimeout(arguments.callee, 0);
    }
})();

2

Jika Anda melihat nilai yang dikembalikan oleh setInterval()mereka biasanya satu digit, jadi Anda biasanya dapat menonaktifkan semua interupsi seperti itu dengan satu baris kode:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)


0

setInterval dan setTimeout membuat interval yang bertambah secara otomatis. Setiap kali setTimeout atau setInterval dipanggil, angka ini naik satu, sehingga jika Anda memanggil setTimeout, Anda akan mendapatkan nilai saat ini, tertinggi.

   var currentInterval = 10000;
   currentInterval += setTimeout( gotoHREF, 100 );
   for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );
   // Include setTimeout to avoid recursive functions.
   for( i = 0; i < currentInterval; i++ )     top.clearTimeout( i );

   function gotoHREF(){
           top.location.href = "http://your.url.here";
   }

Karena hampir tidak pernah ada 10.000 setInterval dan setTimeout yang bekerja secara simultan, dan karena setTimeout mengembalikan "interval atau batas waktu terakhir dibuat +1", dan karena top.clearInterval masih dapat diakses, ini akan mengalahkan serangan topi hitam ke bingkai situs web yang dijelaskan di atas.


0

Gunakan htaccess untuk menghindari frameset jacking tinggi, iframe dan konten seperti gambar.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]

Ini akan menampilkan halaman hak cipta alih-alih yang diharapkan.


Ini bergantung pada pengarah yang a) tidak selalu disetel (karena pengaturan atau ekstensi peramban atau hanya karena halaman pengarah menggunakan HTTPS tanpa menggunakan <meta name="referrer" …/>dan b) juga diatur saat mengklik tautan, jadi Anda juga melarang tautan ke halaman Anda dan memutuskan Web.
Martin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.