Bagaimana saya menghindari larangan pada API Pesan melalui dokumentasi Vkontakte

Halo seluruh komunitas Habro. Bagi saya, artikel pertama ini ditulis di bawah euforia tertentu, jadi tolong jangan menilai artikel ini terlalu ketat untuk bagian sastra. Tapi yah, lebih sedikit kata dan mulai berbisnis.

Bagaimana semua ini dimulai


Kita semua tahu bahwa VC memiliki API, dan saya yakin sebagian besar orang mencoba menggunakannya untuk tujuan mereka sendiri. Secara pribadi, saya punya banyak proyek yang terkait dengannya: potongan-potongan 5 bot kuat, kompilasi dataset skala besar dari posting grup, dll. Dan tidak mengherankan bahwa teman-teman saya bertanya kepada saya beberapa kali untuk mengunduh lagu dari lampiran dialog, foto, atau menyimpan teks korespondensi dengan beberapa orang dalam file terpisah.

Tapi begitu "itu" datang, dan sejak saat itu implementasi permintaan kecil seperti itu tidak lagi menjadi tugas sepele:

gambar

Jadi, beberapa hari yang lalu, untuk menghilangkan masalah ini sekali dan untuk semua, saya memutuskan untuk menulis pembungkus saya melalui permintaan http, berpura-pura menjadi pengguna biasa, sehingga memiliki alat kuat yang sama dengan API resmi untuk bagian pesan.

Mari kita mulai bisnis


Jadi, saya mulai dengan otorisasi. Berbekal sniffer https dan Firefox, saya dapat melewati semua "langkah" otorisasi dan mendapatkan cookie final. Mulai sekarang, hanya tinggal memahami bagaimana pertanyaan dibuat. Ditemukan bahwa sebagian besar data diterima oleh permintaan POST dari https://vk.com/wkview.php , hanya parameter untuk situasi yang berbeda berubah setiap kali. Saya berhasil menulis fungsi untuk memompa sepenuhnya semua jenis investasi, tetapi kami tidak akan membahasnya secara terperinci, karena pada suatu saat semuanya berubah secara dramatis.
Tautan ke file untuk menerima cookie otorisasi (saya menulisnya hanya untuk otentikasi dua faktor, karena biayanya kebanyakan orang)

Penemuan tak terduga


Saya sedang mengerjakan laptop ketika seorang teman mendatangi saya dan bertanya apa yang saya lakukan. Karena saya tidak bisa menjelaskan kepadanya seluruh masalah dengan cepat di jari saya, saya membuka dokumentasi resmi di bagian pesan, dan tertegun ketika saya melihat apa yang ada di bawah deskripsi utama dari metode "terlarang" ini:

gambar

Tidak, Anda mengerti saya dengan benar, saya bukan yang pertama lihat saja peluang ini. Saya menggunakannya berkali-kali dengan metode lain, tetapi saya bahkan tidak bisa berpikir bahwa fungsi "permintaan sampel" akan tetap dengan metode bagian pesan. Dan yang lebih kuat lagi adalah kejutan saya ketika saya mengacaukan lalu lintas. Ini hanya permintaan API biasa, hanya di situs, yang hanya sedikit berbeda dengan nama parameter dalam formulir web dan memiliki semacam hash-ID.

gambar

Dalam beberapa menit, saya menyadari bahwa hash-ID hanyalah sebuah string yang terletak di atribut hash data dari tag tombol, dan setelah beberapa menit saya sudah berusaha keras untuk mengimplementasikan emulasi "permintaan pengujian" dan tidak sepenuhnya percaya bahwa itu akan berhasil. Setelah semua, pasti permintaan ini memiliki semacam batasan pada jumlah atau sesuatu seperti itu. Tapi apa yang mengejutkan saya ketika skrip 30 baris ini (tidak termasuk penerimaan cookie), yang ditulis di atas lutut saya, mampu memompa satu setengah ribu gambar dari lampiran dialog dalam 4 menit.

gambar

Saya menerapkan kode yang digunakan
import requests, pickle, re, json

with open('cookies_vk_auth.pickle', 'rb') as handle:
    cookies_final = pickle.load(handle)

session = requests.Session()
peer_id = int(input('  :  '))

response = session.get(f'https://vk.com/dev/messages.getHistoryAttachments', cookies=cookies_final)
hash_data =  re.findall(r'data-hash="(\S*)"', response.text)[0]

session = requests.Session()
response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)

count=20

for i in range(200):
    response_json = json.loads(json.loads(response.text[4:])['payload'][1][0])['response']['items']

    for photo in response_json:
        ph = photo['attachment']['photo']['sizes'][-1]['url']
        r = session.get(ph, timeout=10)
        
        if r.status_code == 200:
            with open(f'D://dev/'+str(ph.split('/')[-1]), 'wb') as f:
                f.write(r.content)

    m_id = photo['message_id']
    response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_start_from={m_id}&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)


Saya sangat terkesan bahwa pada titik ini saya memutuskan untuk menenangkan diri dan mencoba menerapkan beberapa metode lain (tiba-tiba saya keliru). Saya mengambil metode Sejarah dan hasilnya mirip. Hanya saya harus mengatur penundaan 0,1 detik sehingga server tidak memberikan kesalahan tentang terlalu banyak permintaan. (Jika seseorang mengulangi, harap diingat bahwa ketika mengubah metode Anda juga perlu mengubah url ke dokumentasi, dari mana data hash berasal). Artinya, metode ini sangat memungkinkan untuk mengakses bagian pesan melalui dokumentasi resmi, hanya menggunakan kata sandi dan login pengguna. Untuk keandalan, saya mencoba melakukan langkah yang sama pada akun lain dan mendapatkan hasil yang sama.

Untuk meringkas


Jadi, saya pikir, semua orang telah menyadari bahwa ini adalah pelanggaran dalam perlindungan data pribadi kami, yang telah menggantung dalam dokumentasi selama setahun dan tidak diketahui berapa banyak orang yang telah menggunakannya. Selain itu, celah ini sangat besar, dan harus segera ditutup. Dan untuk membuktikan sekali lagi bahwa ini seharusnya tidak bekerja dengan cara ini, saya akan mengutip pengembang VK sendiri:
Jika Anda berencana untuk mulai mengembangkan messenger, setelah 15 Februari 2019, Anda perlu mendapatkan akses tes di Dukungan, yang menyiratkan pekerjaan metode bagian Pesan dengan kunci administrator dari aplikasi Standalone Anda.

Artinya, bahkan untuk mendapatkan token aplikasi internal yang akan memiliki akses ke korespondensi pengguna, Anda memerlukan izin pribadi dari VK, apalagi akses dengan kata sandi dan login biasa.

Pendapat pribadi saya


Larangan bagian pesan tidak membawa perubahan mendasar pada keamanan pengguna. Dia hanya menunjuk perbatasan dan memotong sekelompok "peretas" yang, tanpa mengerti apa yang sedang mereka lakukan, bisa mendapatkan akses penuh ke data. Bagi orang-orang lain, lebih berpengalaman dalam pemrograman, mendapatkan akses ke korespondensi hanyalah masalah waktu. Dan di bagian pertama artikel, saya buktikan dengan contoh saya sendiri, setelah membuat program untuk memompa lampiran, bahwa kemunculan perpustakaan yang bisa berpura-pura menjadi pengguna tidak jauh. Mungkin saya sendiri yang akan mengakhiri, dan pengembang VK harus siap untuk ini dan menemukan cara untuk mengenali aktivitas pengguna yang terlalu mencurigakan jika privasi data kami benar-benar penting bagi mereka.

PS
, ) , .

All Articles