Bagaimana saya bisa mencegah pengguna listrik memanggil fungsi ajax saya?

12

Saya memiliki situs yang menggunakan panggilan ajax untuk melakukan sejumlah fungsi. Mereka memiliki panggilan browser web kembali ke skrip - ajax.php. Meskipun saya menggunakan data posting untuk mengirimkan data dan membatasi perintah yang dapat dipanggil oleh skrip ajax, sebenarnya tidak ada yang mencegah pengguna spoofing panggilan ajax untuk mencoba memanipulasi situs. Apakah ada beberapa cara untuk mencegah pengguna melakukan spoof panggilan? Apakah ada cara untuk memastikan bahwa panggilan ajax sebenarnya berasal dari situs web saya dan bukan dari beberapa skrip atau situs lain?

Atau apakah saya hanya perlu memeriksa syarat-syarat batas dalam skrip php dan mencegah pengguna melakukan spoofing hal-hal yang tidak boleh mereka lakukan, tetapi mengizinkan mereka untuk spoof di mana mereka diizinkan.

Daniel Bingham
sumber
Apakah panggilan ajax benar-benar tidak diautentikasi? Apakah Anda membuat sesi untuk masing-masing? Apakah ada pola penyalahgunaan? Dan apakah manipulasi khusus masalah atau lebih banyak jumlah beban yang ditambahkan ke situs?
artlung
Bisakah Anda memposting lebih spesifik? Apa yang dilakukan panggilan AJAX? Apa yang mereka manipulasi? Masalah apa yang terjadi jika skrip dipanggil di luar AJAX?
DisgruntledGoat
Saya tidak benar-benar bertanya tentang keadaan tertentu, tetapi lebih kepada solusi umum yang berlaku untuk banyak keadaan. Jika ada solusi seperti itu, yang sepertinya tidak ada.
Daniel Bingham

Jawaban:

12

Saya tidak berpikir ada cara untuk melakukan ini dengan andal, karena informasi apa pun yang Anda kirimkan dapat dipalsukan, tergantung seberapa pintar pengguna itu.

Jika Anda hanya ingin blok sederhana orang-orang yang menelepon bukan dari halaman Anda, maka Anda dapat memeriksa pengarah, menggunakan cookie atau menambahkan bidang tersembunyi acak yang dikirim oleh halaman panggilan yang kedaluwarsa setelah waktu tertentu. Tapi ini mudah dipalsukan jika pengguna benar-benar ditentukan.


sumber
2
+1 .. seperti halnya mustahil untuk membuat orang menyimpan salinan lokal apa pun yang ditampilkan oleh browser mereka. Ini lebih merupakan kontes untuk melihat apakah Anda bisa membuat mereka menyerah dan pindah ke hal lain sebelum mereka mengetahuinya.
Pos Tim
6

Singkatnya, tidak. Setiap permintaan yang dibuat ke URL melalui GET atau POST dapat dilakukan oleh siapa saja yang menggunakan perangkat lunak apa pun. Sebenarnya, permintaan AJAX benar-benar tidak berbeda dengan memuat URL secara langsung, kecuali dengan yang terakhir data yang dikembalikan ditampilkan di browser seperti halaman web.

Inilah alasan mengapa Anda harus selalu memvalidasi data yang dikirimkan di server, terlepas apakah Anda melakukan validasi Javascript atau tidak.

Tidak jelas persis apa yang dilakukan skrip sisi server dan apa yang salah, tetapi jika pengguna dapat "memanipulasi situs" dengan memanggil skrip Anda dengan data yang buruk maka Anda salah melakukannya.

Mungkin solusi terbaik adalah dengan memperkenalkan beberapa bentuk otentikasi.

DisgruntledGoat
sumber
3

Jadi pada dasarnya Anda ingin membatasi ajax.php hanya untuk menanggapi permintaan AJAX?

Saya bukan pakar php, tetapi sepertinya memungkinkan untuk menentukan apakah permintaan yang diberikan berasal dari AJAX atau permintaan browser "biasa" dengan memeriksa nilainya $_SERVER['HTTP_X_REQUESTED_WITH'].

Sumber

mereka memanggil saya
sumber
2
Poin yang bagus, dengan asumsi pelaku tidak menggunakan ajax atau memalsukan header HTTP itu
Adam
1

Seperti orang lain tunjukkan ... panggilan ajax hanyalah penerima $ _GET atau $ _POST, jadi pendekatan saya selalu memperlakukan mereka seperti saya akan halaman tindakan dan menyaring / membersihkan input. Jika Anda memiliki variasi kecil dari apa yang Anda harapkan seperti satu bulan misalnya, dan Anda tahu itu selalu dalam format "Jan, Feb, Mar ...", Anda bisa mengatur array nilai yang diharapkan dan memfilternya. Perangkap apa pun yang tidak cocok dan opsional melemparkan sesuatu seperti "Bzzt ... terima kasih sudah bermain ..."

Saya tidak bisa memikirkan contoh di mana skrip Ajax saya harus lebih aman daripada pengiriman formulir.

HTH

digit1001
sumber
+1 untuk "Bzzt" - yang menjadi jauh lebih lucu dalam konteks "Bzzt - terima kasih telah bermain!" diikuti oleh perlahan memudar menjadi hitam disertai dengan larangan tiga jam ditegakkan oleh cookie yang ditetapkan pada mesin pengguna (saya yakin mereka akan mendapatkan pesan)
danlefree
0

Saya pikir sebagian besar solusi Anda akan membatasi lalu lintas dari sidik jari pengguna tertentu. Mungkin hash alamat IP, string Agen Pengguna dan data yang dikirim.

Juga, mengikat halaman yang memanggil ajax ke data yang dikembalikan ajax lebih dekat bisa membantu. Jadi pada halaman yang dipermasalahkan, pada pemuatan halaman mengirimkan kunci sesi yang baik untuk Xsesi, untuk setiap permintaan ajax, JavaScript Anda harus melewati kunci itu kembali atau ajax akan mengembalikan kegagalan. Setelah halaman Anda mencapai X+1panggilan ajax, paksa pengguna untuk melakukan beberapa tindakan (mungkin captcha? Bahkan mungkin sesuatu seperti mousemoveatau tapperistiwa tergantung pada UA) sebelum mengirim kunci sesi baru ke bawah kabel (keluar dari band dari ajax asli) kemudian restart proses.

Meskipun ketika saya memikirkannya, mungkin saja bagian dari masalah Anda adalah lemahnya validasi dari parameter yang dikirim. Jika orang hanya bisa bermain dengan parameter yang dikirim dan mendapatkan kembali data yang valid maka membuatnya lebih sulit untuk dilakukan. Cara melakukannya tergantung pada nilai-nilai apa yang dikirim oleh klien, dan kejahatan seperti apa yang bisa dilakukan oleh aktor yang buruk dengan mengirimkan nilai-nilai buruk.

artlung
sumber