Haruskah variabel sesi dihindari?

36

Saya dulu sangat bergantung pada variabel sesi di masa lalu, tetapi baru-baru ini menemukan banyak dari mereka tidak perlu, menggunakan hal-hal seperti parameter string kueri sebagai gantinya.

Seorang kolega saya menolak untuk menggunakan variabel sesi. Apakah ini tujuan yang realistis dan haruskah variabel sesi dihindari karena alasan praktis? Dapatkah variabel sesi dihindari sepenuhnya (kecuali cookie sesi untuk memungkinkan login) dan apakah ini menghasilkan desain yang lebih baik?

Beberapa alasan yang dimiliki kolega saya karena tidak menggunakannya:

  • Sifat variabel sesi yang tidak diketik
  • Time-out sesi menyebabkan hilangnya negara
  • Sifat lingkup global dari variabel sesi
  • Memuat server yang kehilangan sesi yang hilang (khusus Net?)
  • Kolam aplikasi / server memulai kembali
  • Mereka tidak perlu
Tjaart
sumber
3
using things like query string parameters instead- Dengan kasing yang satu ini, selalu selalu gunakan parameter string kueri jika memungkinkan. Menggunakan sesi untuk tipe parameter itu rapuh dan dapat memperkenalkan bug aneh ketika pengguna membuka banyak tab.
Izkata
2
rekomendasi pribadi - jangan menerima saran dari kolega Anda karena dia jelas tidak tahu apa yang dia bicarakan. Batas waktu sesi? Apakah dia tidak menyadari durasi sesi dikendalikan oleh aplikasi web?
GrandmasterB
2
@GrandmasterB Ahem. Entah tidak tahu apa yang mereka lakukan atau telah dibakar oleh masing-masing poin selama karir mereka (saya sendiri telah mencapai sekitar 4 dari mereka) dan tahu cara yang lebih tepat untuk berurusan dengan keadaan sementara.
Ed James
Bisakah seseorang tolong jelaskan hubungan antara status sesi dan membuka banyak tab? Saat Anda membuka tab baru, apakah itu atau sekarang berisi keadaan dari tab sebelumnya? Terima kasih.
Ray

Jawaban:

41

Jika Anda memiliki variabel sesi dalam aplikasi Anda, tanyakan pada diri sendiri ini:

Ketika saya mengklik tombol kembali browser saya, nilai apa yang saya inginkan dari variabel saya?

Jika jawabannya "nilai saat ini", variabel sesi mungkin berguna. Contohnya adalah kereta belanja: Anda tidak mengharapkan hal-hal dihapus dari keranjang belanja saat Anda kembali ke sejarah. Itu selalu dalam kondisi saat ini.

Jika jawabannya "nilai sebelumnya", Anda tidak boleh menggunakan variabel sesi. Penggunaan buruk yang saya lihat termasuk memasukkan parameter di antara halaman. Jika saya mengklik tombol kembali untuk kembali ke halaman, halaman tersebut tidak perlu mendapatkan parameter yang benar. Juga, jika saya membuka dua tab, bagaimana situs saya akan berperilaku?

Mendapatkan perilaku tombol kembali dengan benar sama sekali bukan be-all-and-end-all, tetapi ini membantu Anda berpikir tentang situs web sebagai aplikasi tanpa negara. Secara umum, saya menemukan penggunaan yang tepat dari variabel sesi menjadi sedikit dan jauh di antara keduanya.

Tim
sumber
Saya setuju. Setelah Anda memikirkan semantik yang diinginkan dengan banyak tab, biasanya menjadi jelas jika variabel sesi atau parameter permintaan adalah pilihan yang tepat.
CodesInChaos
Saya telah melihat persis jenis kesalahan ini dengan variabel sesi, dan diakui belajar dengan cara yang sulit.
Tjaart
Ketika pengguna menekan tombol kembali, apakah mereka mengharapkan barang tetap di keranjang belanja sampai sesi mereka berakhir atau mereka ingin barang tetap sampai mereka dikeluarkan? Menggunakan beberapa mekanisme kegigihan lainnya (seperti database) akan memungkinkan kegigihan di luar sesi tunggal dan tombol kembali Anda akan tetap berfungsi seperti yang diharapkan pengguna.
Lawtonfogle
25

Protokol HTTP tidak memiliki kewarganegaraan. Sesi adalah cara untuk mempertahankan status klien di seluruh permintaan HTTP. Anda dapat memilih untuk melakukannya dengan penanganan sesi bawaan platform atau melakukannya sendiri dengan parameter string kueri. Bagaimanapun beberapa konsep sesi diperlukan untuk banyak tugas.

Kolega Anda mungkin tidak menyukai implementasi tertentu, atau belum menggunakan sesi untuk tujuan yang dimaksudkan. Jika Anda perlu menyimpan informasi tentang koneksi klien tertentu di seluruh permintaan HTTP, Anda memerlukan beberapa bentuk kegigihan sesi.

Masalah-masalah berikut ini spesifik untuk implementasi:

Sifat variabel sesi yang tidak diketik

Sifat lingkup global dari variabel sesi

Muat server penyeimbang kehilangan sesi

Kolam aplikasi / server memulai kembali

Sebagai contoh, saya paling sering bekerja di PHP dan menyimpan informasi sesi saya di database relasional. Jadi variabel sesi saya diketik. Load balancing dan server restart tidak menyebabkan masalah sesi.

Yang ini lebih menarik:

Time-out sesi menyebabkan hilangnya negara

Sesi paling sering disimpan melalui cookie. Ini dapat dihapus oleh klien kapan saja. Tetapi mereka juga dapat dipertahankan melalui parameter string kueri dan karenanya tidak pernah kehabisan waktu pada klien. Waktu tunggu server terserah Anda. Jadi, bahkan masalah ini adalah implementasi khusus.

Mari kita tidak membuang seluruh konsep sesi hanya karena kita tidak suka implementasi tertentu. Kerangka kerja aplikasi web yang baik akan memfasilitasi penggunaan sesi dengan benar untuk mempertahankan login pengguna atau mempertahankan hal lain yang khusus untuk kunjungan pengguna saat ini. Catatan basis data pengguna dapat (dan harus) digunakan untuk menyimpan hal-hal khusus untuk mereka ketika login. Pengunjung anonim, bagaimanapun, mungkin memiliki informasi sementara yang juga layak dipertahankan dalam sesi mereka, seperti daftar pendek dari halaman terbaru yang dikunjungi atau preferensi untuk sembunyikan pemberitahuan yang telah mereka lihat. Umumnya hanya informasi sementara yang lebih kecil yang sesuai untuk penyimpanan sesi.

Matt S
sumber
Sejujurnya saya memiliki pengalaman terbatas dengan kerangka kerja selain .Net. .Net berhenti memaksakan nilai batas waktu untuk sesi Anda. Variabel sesi juga menggelembung ke kode sisi server sebagai kamus yang tidak diketik. Saya biasanya membungkus kamus ini dengan kelas yang diketik dengan benar, jadi saya juga tidak melihat ini sebagai masalah. Anda menyebutkan bahwa Anda menyimpan informasi sesi Anda dalam database. Di ASP .Net, penyimpanan ditangani sebaliknya, baik di klien .Net, dalam basis data (dikelola secara otomatis) atau dalam layanan jendela terpisah.
Tjaart
Bisakah Anda memberikan beberapa contoh tujuan yang dimaksudkan untuk sesi?
Tjaart
@ Metroart: Saya sedikit memperluas paragraf terakhir. Semoga itu bisa membantu.
Matt S
14

Yang lain telah membuat banyak poin bagus (yang saya akan hindari mengulangi), tetapi ada satu aspek dari teknik teman Anda yang belum dibahas: keamanan .

Tidak mungkin mengetahui kerentanan seperti apa yang Anda buka tanpa melihat kode, tapi inilah beberapa hal yang dapat saya pikirkan di atas kepala saya.

  • Fiksasi sesi : Serangan dahsyat yang sedikit lebih mudah jika Anda bisa membuat pengguna mengeklik tautan yang sudah memiliki info yang diperlukan di URL (daripada mencoba membuat pengguna menggunakan mesin yang cookie-nya diatur dengan tepat).
  • Injeksi SQL (atau input jahat lainnya) : Jangan pernah percaya apa pun yang berasal dari pengguna. Variabel sesi memiliki keuntungan karena tidak pernah meninggalkan server, sehingga pengguna tidak dapat langsung mengubahnya. Meskipun Anda harus membersihkan data sebelum memasukkannya ke dalam sesi, Anda selalu dapat mempercayai nilai yang Anda dapatkan setelahnya. Jika semuanya diteruskan melalui string kueri, Anda memiliki BANYAK validasi yang perlu Anda lakukan untuk memastikan bahwa Anda tidak menerima input berbahaya.
  • Merusak data dengan menggunakan input yang dipalsukan : Mirip dengan injeksi SQL, berapa banyak data yang Anda bolak-balik? Seberapa penting itu? Bisakah saya mengubah perilaku aplikasi Anda dengan mengubah nilai dalam string kueri? Bisakah saya merusak data di server Anda dengan mengubah nilai? Jika saya berhasil merusak data di server, apakah ini akan memengaruhi pengguna lain? (Jika jawaban Anda adalah "tidak", respons saya adalah "apakah Anda yakin? Anda memiliki banyak tempat yang perlu Anda periksa.").

Semua ini masih bisa terjadi ketika Anda menggunakan Sesi, tetapi mereka bisa jauh lebih mudah jika teman Anda tidak tahu apa yang dia lakukan.

riwalk
sumber
2

Variabel sesi seperti variabel global Basic yang lama sampai tingkat tertentu. Beban ada pada pengguna untuk melacak mereka, apa yang ada di dalamnya, ruang lingkup mereka dan bagaimana mereka digunakan; sama seperti di versi lama BASIC. Yang sedang berkata, mengapa seseorang benar-benar diskon penggunaan mekanisme yang jelas dirancang untuk menjadi bagian integral dan sangat penting dari model pemrograman (ASP, MVC dll)?

Satu-satunya hal buruk yang saya temui dalam menggunakan variabel Sesi adalah bahwa hal itu menempatkan beban pada Anda untuk melacaknya, pastikan mereka dipenuhi dengan data yang relevan dan membuangnya.

Bukankah itu yang kita lakukan saat memprogram?

Mac
sumber
1

Saya dulu berpikir seperti kolega Anda karena beberapa pengalaman buruk saya mengalami masalah debugging terkait dengan variabel sesi, yang sebenarnya hanya ketidakmampuan di bagian saya. Ya, Anda dapat bertahan sampai batas tertentu tanpa variabel sesi, menggunakan string kueri, bidang tersembunyi dalam formulir, dan hal-hal lain. Namun itu sangat cepat menjadi rumit untuk melakukannya dengan cara ini jika aplikasi Anda memiliki sesuatu di luar aliran logika paling dasar untuk menentukan keadaan. Ada juga risiko keamanan menampilkan bagian dalam aplikasi Anda melalui string kueri dan bidang tersembunyi, yang semuanya dapat berfungsi sebagai vektor serangan.

Ketika bekerja dengan variabel sesi Anda hanya perlu melacak kapan mereka ditetapkan dan tidak disetel, karena ini akan menentukan aliran logika aplikasi. Ini seperti manajemen memori dalam bahasa seperti C.

Perhatikan bahwa ini hanya dari pengalaman saya bekerja dengan PHP pada proyek yang relatif kecil tanpa kerangka kerja, hal-hal mungkin berbeda pada platform lain tapi saya pikir prinsip umum masih berlaku.

primehunter326
sumber
2
Bagaimana Anda mendapatkan beberapa semantik tab dengan benar saat menggunakan sesi untuk keadaan yang terlibat dalam aliran kontrol Anda? Sesi bekerja dengan baik untuk login dan pengaturan seperti properti, tetapi mereka tidak memiliki semantik yang tepat untuk sebagian besar penggunaan lainnya.
CodesInChaos
Saya tidak yakin, apa yang saya posting didasarkan pada pengalaman saya sendiri yang diakui terbatas membangun aplikasi web berbasis database di PHP / MySQL. Bagaimana beberapa tab di browser biasanya ditangani (Saya berasumsi itu yang Anda maksud)?
primehunter326
@ primehunter326 Dengan params rute atau string kueri atau bidang formulir tersembunyi.
Casey
0

Seperti yang dinyatakan sebelumnya, HTTP adalah Stateless dan Session Variable memecahnya. Desain HTTP menjadi tanpa kewarganegaraan membantu caching sumber daya. Untuk sumber daya yang tersedia untuk umum.

Dimungkinkan untuk merancang situs web tanpa variabel sesi tetapi lebih sulit. Yang paling sulit (IMHO) adalah login / logout yang mewah, skema otentikasi HTTP tidak menyediakan alat yang diperlukan untuk mengotentikasi melalui formulir HTML (Anda dapat meretas sesuatu dengan javascript - XHR ke https: // untel: [email protected] ) dan bahkan lebih sulit untuk keluar dan menjadi browser yang kompatibel. ada beberapa diskusi daftar mailling w3 tentang itu tetapi jika saya ingat dengan benar ide itu dibatalkan.

Selebihnya, Anda harus bisa hidup tanpa variabel Sesi. Anda akan memiliki beberapa status pada database, file atau di mana saja tetapi penggunaan untuk variabel Sesi harus jarang.

Jika pengguna Anda memiliki kereta belanja, itu hanya sesi variabel jika pengguna seharusnya dapat menjelajah di dua komputer / browser tanpa berbagi kereta.

Mathieu
sumber