Secara khusus ini berkaitan dengan saat menggunakan cookie sesi klien untuk mengidentifikasi sesi di server.
Apakah jawaban terbaik untuk menggunakan enkripsi SSL / HTTPS untuk seluruh situs web, dan Anda memiliki jaminan terbaik bahwa tidak ada orang di tengah serangan yang dapat mengendus cookie sesi klien yang ada?
Dan mungkin yang terbaik kedua untuk menggunakan semacam enkripsi pada nilai sesi itu sendiri yang disimpan di cookie sesi Anda?
Jika pengguna jahat memiliki akses fisik ke mesin, mereka masih dapat melihat sistem file untuk mengambil cookie sesi yang valid dan menggunakannya untuk membajak sesi?
SSL hanya membantu dengan serangan sniffing. Jika penyerang memiliki akses ke mesin Anda, saya akan berasumsi bahwa mereka juga dapat menyalin cookie aman Anda.
Setidaknya, pastikan cookie lama kehilangan nilainya setelah beberapa saat. Bahkan serangan pembajakan yang berhasil akan digagalkan ketika cookie berhenti bekerja. Jika pengguna memiliki cookie dari sesi yang masuk lebih dari sebulan yang lalu, buat mereka memasukkan kembali sandi mereka. Pastikan bahwa setiap kali pengguna mengklik link "log out" situs Anda, bahwa UUID sesi lama tidak akan pernah dapat digunakan lagi.
Saya tidak yakin apakah ide ini akan berhasil tetapi begini: Tambahkan nomor seri ke cookie sesi Anda, mungkin string seperti ini:
SessionUUID, Serial Num, Tanggal / Waktu Sekarang
Enkripsi string ini dan gunakan sebagai cookie sesi Anda. Ubah nomor seri secara teratur - mungkin saat cookie berumur 5 menit dan kemudian terbitkan ulang cookie. Anda bahkan dapat menerbitkannya kembali di setiap tampilan halaman jika Anda mau. Di sisi server, simpan catatan nomor seri terakhir yang Anda keluarkan untuk sesi itu. Jika seseorang pernah mengirim cookie dengan nomor seri yang salah itu berarti penyerang mungkin menggunakan cookie yang mereka intersep sebelumnya sehingga membatalkan sesi UUID dan meminta pengguna untuk memasukkan kembali kata sandi mereka dan kemudian menerbitkan kembali cookie baru.
Ingatlah bahwa pengguna Anda mungkin memiliki lebih dari satu komputer sehingga mereka mungkin memiliki lebih dari satu sesi aktif. Jangan melakukan sesuatu yang memaksa mereka untuk masuk lagi setiap kali mereka berpindah antar komputer.
sumber
Pernahkah Anda mempertimbangkan untuk membaca buku tentang keamanan PHP? Sangat dianjurkan.
Saya telah banyak berhasil dengan metode berikut untuk situs yang tidak bersertifikat SSL.
Larang beberapa sesi dalam akun yang sama, pastikan Anda tidak memeriksa ini hanya berdasarkan alamat IP. Melainkan memeriksa dengan token yang dihasilkan saat login yang disimpan dengan sesi pengguna di database, serta alamat IP, HTTP_USER_AGENT, dan sebagainya
Menggunakan hyperlink berbasis Relasi Menghasilkan tautan (mis. Http://example.com/secure.php?token=2349df98sdf98a9asdf8fas98df8 ) Tautan ditambahkan dengan string MD5 asin acak x-BYTE (ukuran yang lebih disukai), setelah pengalihan halaman dibuat secara acak token sesuai dengan halaman yang diminta.
Cookie otentikasi sesi seumur hidup. Seperti yang diposting di atas, cookie yang berisi string aman, yang merupakan salah satu referensi langsung ke validitas sesi adalah ide yang bagus. Buat itu kedaluwarsa setiap x Menit, terbitkan ulang token itu, dan sinkronkan kembali sesi dengan Data baru. Jika ada kesalahan kecocokan dalam data, logout pengguna, atau minta mereka mengautentikasi ulang sesi mereka.
Saya sama sekali bukan ahli dalam hal ini, saya memiliki sedikit pengalaman dalam topik khusus ini, semoga beberapa di antaranya dapat membantu siapa pun di luar sana.
sumber
Apa yang dilakukannya adalah menangkap informasi 'kontekstual' tentang sesi pengguna, potongan informasi yang seharusnya tidak berubah selama masa aktif satu sesi. Seorang pengguna tidak akan berada di depan komputer di AS dan di China pada saat yang bersamaan, bukan? Jadi, jika alamat IP tiba-tiba berubah dalam sesi yang sama yang sangat menyiratkan upaya pembajakan sesi, jadi Anda mengamankan sesi dengan mengakhiri sesi dan memaksa pengguna untuk mengautentikasi ulang. Ini menggagalkan upaya peretasan, penyerang juga dipaksa untuk masuk alih-alih mendapatkan akses ke sesi. Beri tahu pengguna tentang upaya tersebut (ajax sedikit), dan vola, Pengguna yang diberi tahu + sedikit jengkel dan sesi / informasi mereka dilindungi.
Kami memasukkan Agen Pengguna dan X-FORWARDED-FOR untuk melakukan yang terbaik untuk menangkap keunikan sesi untuk sistem di belakang proxy / jaringan. Anda mungkin dapat menggunakan lebih banyak informasi daripada itu, merasa bebas untuk menjadi kreatif.
Ini tidak 100%, tapi sangat efektif.
Masih ada lagi yang dapat Anda lakukan untuk melindungi sesi, kedaluwarsa, ketika pengguna meninggalkan situs web dan kembali memaksa mereka untuk masuk lagi mungkin. Anda dapat mendeteksi pengguna yang keluar dan kembali dengan mengambil HTTP_REFERER kosong (domain diketik di bilah URL), atau periksa apakah nilai di HTTP_REFERER sama dengan domain Anda atau tidak (pengguna mengeklik tautan eksternal / dibuat untuk membuka situs).
Kedaluwarsa sesi, jangan biarkan sesi tetap valid tanpa batas.
Jangan bergantung pada cookie, cookie dapat dicuri, itu salah satu vektor serangan untuk pembajakan sesi.
sumber
$_SESSION['ident'] = $aip . $bip . $agent;
akan sama amannya.Coba protokol Secure Cookie yang dijelaskan dalam makalah ini oleh Liu, Kovacs, Huang, dan Gouda:
Sebagaimana tercantum dalam dokumen:
Adapun kemudahan penerapan:
Singkatnya: ini aman, ringan, bekerja dengan baik untuk saya.
sumber
Tidak ada cara untuk mencegah pembajakan sesi 100%, tetapi dengan beberapa pendekatan kita dapat mengurangi waktu bagi penyerang untuk membajak sesi.
Metode untuk mencegah pembajakan sesi:
1 - selalu gunakan sesi dengan sertifikat ssl;
2 - kirim cookie sesi hanya dengan httponly disetel ke true (mencegah javascript untuk mengakses cookie sesi)
2 - gunakan sesi regenerasi id saat login dan logout (catatan: jangan gunakan sesi regenerasi pada setiap permintaan karena jika Anda memiliki permintaan ajax berturut-turut maka Anda memiliki kesempatan untuk membuat beberapa sesi.)
3 - atur batas waktu sesi
4 - simpan agen pengguna browser dalam variabel $ _SESSION dan bandingkan dengan $ _SERVER ['HTTP_USER_AGENT'] di setiap permintaan
5 - tetapkan token cookie, dan setel waktu kedaluwarsa cookie itu ke 0 (hingga browser ditutup). Buat kembali nilai cookie untuk setiap permintaan. (Untuk permintaan ajax jangan membuat ulang cookie token). EX:
catatan: jangan membuat ulang cookie token dengan permintaan ajax catatan: kode di atas adalah contoh. catatan: jika pengguna logout maka token cookie harus dihancurkan serta sesi
6 - Ini bukan pendekatan yang baik untuk menggunakan ip pengguna untuk mencegah pembajakan sesi karena beberapa ip pengguna berubah dengan setiap permintaan. YANG MEMPENGARUHI PENGGUNA YANG VALID
7 - secara pribadi saya menyimpan data sesi dalam database, terserah Anda metode apa yang Anda adopsi
Jika Anda menemukan kesalahan dalam pendekatan saya, mohon perbaiki saya. Jika Anda memiliki lebih banyak cara untuk mencegah sesi hyjaking tolong beri tahu saya.
sumber
Pastikan Anda tidak menggunakan integer incremting untuk ID sesi. Jauh lebih baik menggunakan GUID, atau string karakter panjang yang dibuat secara acak.
sumber
Ada banyak cara untuk membuat perlindungan terhadap pembajakan sesi, namun semuanya mengurangi kepuasan pengguna atau tidak aman.
Pemeriksaan IP dan / atau X-FORWARDED-FOR. Ini berfungsi, dan cukup aman ... tapi bayangkan penderitaan pengguna. Mereka datang ke kantor dengan WiFi, mereka mendapatkan alamat IP baru dan kehilangan sesi. Harus masuk lagi.
Cek Agen Pengguna. Sama seperti di atas, versi baru browser keluar, dan Anda kehilangan satu sesi. Selain itu, ini sangat mudah untuk "diretas". Sangat mudah bagi peretas untuk mengirim string UA palsu.
token localStorage. Saat log-on, buat token, simpan di penyimpanan browser, dan simpan ke cookie terenkripsi (dienkripsi di sisi server). Ini tidak memiliki efek samping bagi pengguna (Penyimpanan lokal tetap ada melalui peningkatan browser). Ini tidak seaman - karena hanya keamanan melalui ketidakjelasan. Selain itu, Anda dapat menambahkan beberapa logika (enkripsi / dekripsi) ke JS untuk lebih mengaburkannya.
Penerbitan ulang cookie. Ini mungkin cara yang tepat untuk melakukannya. Triknya adalah dengan hanya mengizinkan satu klien untuk menggunakan cookie pada satu waktu. Jadi, pengguna aktif akan mendapatkan cookie yang diterbitkan ulang setiap jam atau kurang. Cookie lama tidak valid jika cookie baru dikeluarkan. Peretasan masih mungkin dilakukan, tetapi jauh lebih sulit untuk dilakukan - baik peretas maupun pengguna yang valid akan mendapatkan akses ditolak.
sumber
Mari kita pertimbangkan bahwa selama fase login klien dan server dapat menyetujui nilai garam rahasia. Setelah itu server memberikan nilai hitungan dengan setiap pembaruan dan mengharapkan klien untuk merespons dengan hash (garam rahasia + hitungan). Pembajak potensial tidak memiliki cara apa pun untuk mendapatkan nilai garam rahasia ini dan karenanya tidak dapat menghasilkan hash berikutnya.
sumber
AFAIK objek sesi tidak dapat diakses di klien, karena disimpan di server web. Namun, id sesi disimpan sebagai Cookie dan memungkinkan server web melacak sesi pengguna.
Untuk mencegah pembajakan sesi menggunakan id sesi, Anda dapat menyimpan string hash di dalam objek sesi, dibuat dengan menggunakan kombinasi dua atribut, addr jarak jauh dan port jarak jauh, yang dapat diakses di server web di dalam objek permintaan. Atribut ini mengikat sesi pengguna ke browser tempat pengguna masuk.
Jika pengguna masuk dari browser lain atau mode penyamaran di sistem yang sama, alamat IP akan tetap sama, tetapi porta akan berbeda. Oleh karena itu, ketika aplikasi diakses, pengguna akan diberikan ID sesi yang berbeda oleh server web.
Di bawah ini adalah kode yang telah saya implementasikan dan uji dengan menyalin id sesi dari satu sesi ke sesi lainnya. Ini bekerja dengan cukup baik. Jika ada celah, beri tahu saya cara Anda mensimulasikannya.
Saya menggunakan algoritma SHA-2 untuk melakukan hash nilai menggunakan contoh yang diberikan di SHA-256 Hashing di baeldung
Menantikan komentar Anda.
sumber
Untuk mengurangi risiko, Anda juga dapat mengaitkan IP asal dengan sesi. Dengan cara itu, penyerang harus berada dalam jaringan pribadi yang sama untuk dapat menggunakan sesi tersebut.
Memeriksa tajuk rujukan juga bisa menjadi opsi tetapi lebih mudah dipalsukan.
sumber
Lindungi oleh:
sumber