Pertanyaan Keamanan saat menggunakan GWT RPC


Saya memiliki POJO di Google Web Toolkit seperti ini yang dapat saya ambil dari server.

class Person implements Serializable {
  String name;
  Date creationDate;
}

Ketika klien membuat perubahan, saya menyimpannya kembali ke server menggunakan GWT RemoteServiceServlet seperti ini:

rpcService.saveObject(myPerson,...)

Masalahnya adalah bahwa pengguna seharusnya tidak dapat mengubah creationDate. Karena metode RPC benar-benar hanya HTTP POST ke server, dimungkinkan untuk memodifikasi creationDate dengan mengubah permintaan POST.

Solusi sederhana adalah membuat serangkaian fungsi RPC seperti changeName(String newName), dll, tetapi dengan kelas dengan banyak bidang akan membutuhkan banyak metode untuk setiap bidang, dan tidak akan efisien untuk mengubah banyak bidang sekaligus.

Saya suka kesederhanaan memiliki POJO tunggal yang dapat saya gunakan baik di server dan klien GWT, tetapi perlu cara untuk melakukannya dengan aman. Ada ide?

EDIT

Saya mengirim kembali dengan karunia untuk mencoba dan melihat apakah ada ide lain. Mungkin pertanyaan awal saya terlalu terfokus pada spesifikasi GWT. Sungguh saya pikir ini adalah pertanyaan umum untuk setiap sistem yang menggunakan JavaBeans untuk melewatkan data antara lingkungan aman (kontainer servlet) dan tidak aman (web browser).

EDIT 2

Juga, untuk menjadi jelas, saya menggunakan lapangan creationDate sebagai contoh masalah. Pada kenyataannya kode yang saya kerjakan lebih rumit dengan banyak bidang yang berbeda.


5
2018-05-21 19:19


asal


Jawaban:


Saya menyarankan Anda untuk menyimpan metode RPC tunggal Anda, dan gunakan POJO / bean mapper seperti Dozer atau Gilead.

  • Dengan Dozer, Anda membuat pemetaan kelas yang digunakan untuk menyalin properti dari satu objek ke objek lainnya. Jika Anda tidak menentukan properti dalam pemetaan kelas, itu tidak akan disalin.
  • Dengan Gilead, @ReadOnly transportasi anotasi harus cukup.

Itu manfaat sampingan adalah bahwa Anda tidak perlu mengubah lapisan akses data Anda (misalkan Anda memilikinya). Tidak masalah jika Anda menggunakan ORM atau tidak, dengan database relasional atau tidak.


3
2018-05-22 06:11



Jika klien tidak dapat mengubah creationDate dan membiarkannya berubah, ubah serialisasi Anda (misalnya SQL Anda UPDATE pernyataan) untuk tidak menyimpan bidang tertentu. Itu hanya harus diatur dari INSERT (di mana ia berasal dari server titik akhir RPC, atau server database Anda jika Anda menetapkan default otomatis).


3
2018-05-21 19:45



Saya akan menggunakan pendekatan berbasis izin:

  • Tetapkan peran kepada pengguna (misalnya pengguna admin, pengguna yang masuk, pengguna tamu, ...), dan
  • mengaitkan peran tersebut dengan izin (misalnya. dapat membaca nama orang, dapat memodifikasi nama orang - mungkin lebih lanjut membatasi hal itu kepada orang tertentu, dll.)

Pada setiap permintaan dari klien, lakukan pemeriksaan pada server, jika pengguna diizinkan untuk melakukan tindakan itu. Dalam kasus "tanggal pembuatan", ini mungkin tidak pernah diizinkan untuk siapa pun. Begitu

  • jika permintaan berisi tanggal pembuatan, Anda dapat menunjukkan pesan kesalahan atau mengabaikan permintaan ...
  • jika permintaan tidak berisi tanggal pembuatan (kasus biasa), Anda membuat tanggal di server - atau jika orang tersebut sudah memiliki tanggal pembuatan, gunakan kembali itu.

Klien biasanya akan menentukan orang itu dengan semacam ID (bisa nihil untuk orang yang baru dibuat), yang dapat digunakan server untuk mencari orang yang ada. Merusakkan ID tidak masalah, karena pengguna hanya dapat mengubah data yang ditentukan oleh izinnya.

Kasus spesial:

Jika Anda benar-benar harus menggunakan tanggal pembuatan disediakan klien, karena Anda ingin tahu sedikit lebih banyak persis ketika pengguna telah mengklik, satu-satunya hal yang dapat Anda lakukan adalah memeriksa bahwa tanggal pembuatan yang disediakan berada di antara permintaan sebelumnya dan permintaan saat ini. Namun, Anda harus memperhitungkan perbedaan jam antara server dan klien. Dan Anda tidak bisa menjamin ketepatannya.


1
2018-05-25 17:15



Mengapa tidak membuat ladang menjadi pribadi dan hanya menyediakan getCreationDate () dan tidak setCreationDate ()?


1
2018-05-29 00:55



Anda hanya bisa mengabaikan nilai untuk bidang yang tidak dapat diubah.
Jika itu tidak mungkin karena bagaimana mekanisme ketekunan Anda diatur di server, maka ketika permintaan sampai ke server, ambil contoh lain dari POJO dari penyimpanan persisten dan isi kolom yang tidak dapat diubah dengan yang baru saja Anda dapatkan. Cara orang itu merusak beberapa bidang yang tidak Anda pedulikan.

Tentu saja enkripsi bisa menjadi solusi juga untuk membantu menghindari gangguan.


1
2018-05-31 02:29



Bagilah benda-benda Anda menjadi dua bagian. Satu hanya berisi bidang yang dapat diedit oleh klien. Kirim kedua objek ke klien tetapi hanya simpan objek yang dapat diedit ketika klien mengembalikannya. Anda dapat menggunakan warisan di sini untuk membuat hidup Anda lebih sederhana.

Jika alat pemetaan Anda tidak membelok seperti yang Anda inginkan, terapkan copy() metode yang menyalin semua bidang dari satu objek ke yang lain. Kemudian Anda dapat memuat objek baru dari database Anda, salin kolom yang dapat diedit ke dalamnya dan kemudian simpan objek yang dimodifikasi.


1
2018-05-31 07:24



Yah ... solusi akademis (yaitu secara teoritis mungkin, tetapi cukup tidak praktis) mungkin untuk hash negara objek menggunakan kunci publik throw-away yang kunci privat ada di server. Mungkin seperti ini:

  1. server menghasilkan pasangan kunci publik-swasta
  2. server mengirim kunci publik bersama dengan data nyata ke klien
  3. klien menghitung hash dari status objek penuh bersama dengan kunci publik
  4. klien mengirim objek dan hash ke server
  5. server menghitung ulang hash untuk mengkonfirmasi integritas paket

Dengan asumsi kunci-pasangan diubah di setiap requset dan bahwa pengguna tidak dapat mengganggu proses hashing (yang dia bisa, tetapi mungkin cukup sulit untuk membuatnya berguna dalam beberapa kasus penggunaan), server akan dapat mendeteksi perubahan dalam status objek dilakukan setelah hash telah dihitung pada klien.

Sekali lagi, pertimbangkan ini tidak lebih dari percobaan pikiran ... Saya tidak akan menyarankan Anda menerapkan pendekatan semacam itu. Secara umum, Anda harus dapat menjamin logika pada klien belum dirusak sebelum Anda dapat mengamankan data.


0
2018-05-21 19:39