Bagaimana cara membiarkan crawler menjalankan javascript di halaman?

Saya ingin menerapkan beberapa mekanisme anti-perayapan untuk melindungi data di situs saya. Setelah membaca banyak topik terkait di SO, saya akan fokus pada "menerapkan javascript yang berjalan".

Rencana saya adalah:

  1. Terapkan fungsi khusus F (mis. MD5SUM) dalam file javascript C

    Input: string cookie dari pengguna saat ini (cookie berubah di setiap respons)

    Output: string verifikasi V

  2. Kirim V bersama parameter lainnya ke antarmuka backend sensitif untuk meminta data berharga

  3. Server backend memiliki fungsi validasi T untuk memeriksa apakah V benar

Bagian yang sulit adalah bagaimana mengaburkan F. Jika crawler dapat dengan mudah memahami F, mereka akan mendapatkan V tanpa C dan melewati javascript.

Memang ada banyak obfuscator js, tetapi saya akan mencapai tujuan tersebut dengan mengimplementasikan fungsi generator G yang tidak muncul di C.

G(K) menghasilkan F, dimana K adalah bilangan bulat besar. F seharusnya cukup rumit, sehingga penulis perayap harus memerlukan waktu berjam-jam untuk memahami F. Mengingat K' yang lain, G(K') = F', F' akan terlihat seperti fungsi baru dalam beberapa hal, dan sekali lagi, penulis perayap perlu waktu berjam-jam untuk memecahkannya.

Implementasi yang mungkin dari G mungkin berupa pemetaan dari bilangan bulat ke rangkaian digital dari banyak gerbang logika yang terhubung (seperti labirin). Menggunakan tata bahasa javascript untuk merepresentasikannya sebagai F. Karena F harus dijalankan dalam javascript, crawler harus menjalankan PhantomJS. Selain itu, saya dapat memasukkan mode tidur di F untuk memperlambat crawler sementara pengguna normal hampir tidak menyadari penundaan 50-100 ms.

Saya tahu ada sekelompok metode untuk mendeteksi crawler. Mereka akan diterapkan. Mari kita bahas topik "menerapkan javascript yang berjalan". Bisakah Anda memberi saya saran? Apakah ada solusi yang lebih baik?


person ShenLei    schedule 28.07.2017    source sumber
comment
Perayap yang baik akan melewati semuanya... Lindungi data Anda melalui mekanisme login   -  person Salketer    schedule 28.07.2017
comment
@Salketer Maksud Anda captcha (atau login dengan captcha)? Login bisa teratasi, itu hanya permintaan http.   -  person Ryosaku    schedule 28.07.2017
comment
@Salketer Ya. Semua permintaan di posting saya dalam keadaan login. Tidak ada permintaan anonim karena antarmuka sensitif hanya dapat diakses oleh pengguna yang login.   -  person ShenLei    schedule 28.07.2017


Jawaban (1)


Menggunakan login untuk mencegah seluruh dunia melihat data adalah salah satu pilihan.

Jika Anda tidak ingin pengguna yang masuk mengambil semua data yang Anda sediakan untuk mereka, Anda dapat membatasi jumlah permintaan per menit untuk pengguna tersebut, sehingga menambahkan penundaan pada pemuatan halaman Anda jika sudah tercapai. Karena pengguna login, Anda dapat dengan mudah melacak permintaan di sisi server meskipun mereka berhasil mengubah cookie/Penyimpanan Lokal/IP/Browser dan yang lainnya.

Anda dapat menggunakan gambar untuk beberapa teks, yang akan memaksa mereka menggunakan mekanisme yang banyak sumber dayanya untuk menerjemahkan informasi yang dapat digunakan.

Anda dapat menambahkan teks tersembunyi, ini bahkan akan mencegah penyalinan/penempelan pengguna (Anda menggunakan bentang yang diisi dengan 3-4 huruf acak pada setiap 3-4 huruf asli dan menjadikannya ukuran font 0). Dengan cara itu mereka tidak terlihat, namun tetap disalin, dan kemungkinan besar akan diambil dari crawler.

Menolak sambungan dari tanda header HTTP perayap yang dikenal, meskipun perayap mana pun dapat menirunya. Dan Greasemonkey atau ekstensi scripting bahkan dapat mengubah browser biasa menjadi crawler sehingga kejadiannya sangat kecil.

Sekarang, untuk memaksa menggunakan javascript

Masalahnya adalah Anda tidak bisa memaksakan eksekusi javascript apa pun. Apa yang dilakukan javascript dapat dilihat oleh semua orang yang memiliki akses ke halaman tersebut, jadi jika itu adalah semacam hash MD5 yang ingin Anda capai, ini dapat diimplementasikan dalam bahasa apa pun.

Hal ini terutama tidak mungkin dilakukan karena crawler memiliki akses ke semua yang dapat diakses oleh javascript klien.

Pemaksaan untuk menggunakan crawler berkemampuan javascript dapat dielakkan, dan bahkan jika tidak, dengan daya komputasi yang tersedia bagi siapa pun saat ini, sangat mudah untuk meluncurkan instance PhantomJS... Dan seperti yang saya katakan di atas, siapa pun yang memiliki sedikit pengetahuan javascript dapat dengan mudah mengotomatiskan klik di situs web Anda menggunakan browser mereka, yang akan membuat semuanya tidak terdeteksi.

Apa yang harus dilakukan

Satu-satunya cara antipeluru untuk mencegah perayap mengambil data Anda, dan mencegah otomatisasi apa pun adalah dengan menanyakan sesuatu yang hanya dapat dilakukan oleh manusia. Captcha terlintas di benak saya.

Pikirkan tentang pengguna Anda yang sebenarnya

Hal pertama yang harus Anda ingat adalah jika situs web Anda mulai mengganggu untuk digunakan oleh pengguna biasa, mereka tidak akan kembali. Harus mengetikkan captcha 8 karakter pada setiap permintaan halaman hanya karena MUNGKIN ada seseorang yang ingin memompa data akan menjadi hal yang sangat membosankan bagi siapa pun. Selain itu, memblokir agen browser yang tidak dikenal dapat mencegah pengguna sah mengakses situs web Anda karena alasan X atau Y mereka menggunakan browser yang aneh.

Dampaknya terhadap pengguna sah Anda, dan waktu yang Anda perlukan untuk bekerja keras melawan crawler mungkin terlalu tinggi untuk menerima bahwa beberapa crawling akan terjadi. Jadi pilihan terbaik Anda adalah menulis ulang TOS Anda untuk secara eksplisit melarang perayapan dalam bentuk apa pun, mencatat setiap akses http setiap pengguna, dan mengambil tindakan bila diperlukan.

Penafian: Saya menghapus lebih dari seratus situs web setiap bulan, mengikuti tautan eksternal sehingga totalnya sekitar 3000 domain. Pada saat posting, tidak satupun dari mereka yang menolak, padahal mereka menggunakan satu atau lebih teknik di atas. Ketika kesalahan scrapping terdeteksi, tidak butuh waktu lama untuk memperbaikinya...

Satu-satunya hal adalah merangkak dengan hormat, tidak merayapi secara berlebihan atau membuat terlalu banyak permintaan dalam jangka waktu yang singkat. Melakukan hal itu saja akan menghindari anti crawler paling populer.

person Salketer    schedule 28.07.2017
comment
Terima kasih atas balasan baik Anda. Saya akan memilih +1 untuk mendapatkan wawasan, tetapi jawabannya di luar topik. Saya ingin membangun beberapa firewall untuk melindungi crawler. Yang pertama adalah memaksa crawler untuk menjalankan PhantomJS. Memang, mereka dapat mensimulasikan perilaku pengguna, tetapi mereka akan membayar lebih dari sekadar urlopen. Jika mereka tidak dapat memahami apa yang dilakukan js saya, mereka harus menjalankannya dari waktu ke waktu. Perlindungan lainnya, seperti penghitungan backend/captcha, merupakan firewall tambahan di balik perlindungan ini. - person ShenLei; 29.07.2017
comment
Apa yang saya katakan adalah tidak diperlukan phantomJS, mereka cukup menggunakan javascript firewall Anda dan menjalankannya di crawler nodeJS mereka. Sama sekali tidak ada cara pasti untuk memaksa phantomJS. Hanya ada cara untuk membuat pemeliharaan/biaya Anda lebih tinggi. Itu semua tergantung pada mengapa data Anda sangat pribadi. - person Salketer; 29.07.2017
comment
Dan meskipun ini tidak menjawab pertanyaan Anda di bagian Bagaimana caranya, menurut saya ini masih dalam topik karena sangat menjelaskan mengapa Anda TIDAK BISA melakukannya. - person Salketer; 29.07.2017
comment
Mungkin saya tidak mengungkapkannya dengan jelas. Saya ingin memaksa crawler untuk menjalankan program js saya di browser asli apa pun atau PhantomJS atau node.js atau eksekutor/simulator js lainnya. - person ShenLei; 29.07.2017
comment
Mungkin saya tidak mengungkapkannya dengan jelas. Kalau javascript bisa, ActionScript, C#, C++, C, Python, PHP, Go dan teman-teman semua juga bisa. - person Salketer; 29.07.2017
comment
Yap, itulah bagian intinya! Jika javascript bisa melakukannya, maka bahasa lain juga bisa. Namun, Anda harus memahami apa yang dilakukan js saya, lalu Anda dapat menulis ulang dalam bahasa lain. Masalahnya, jika js saya sulit dipahami, biaya penulisan ulang tidak dapat diterima. Belum lagi F bisa saja berubah. Itu sebabnya generator G(K) sangat penting. - person ShenLei; 29.07.2017