Jika saya memahami ini dengan benar, sepertinya Anda mengatur token untuk setiap permintaan. Dugaan saya adalah bahwa halaman lama masih memiliki token lama. Saya akan memeriksa untuk melihat apakah token telah disetel sebelum menghapusnya secara otomatis.
if (isset($_SESSION['token'])){
//do nothing
} else{
$_SESSION['token'] = md5(rand());
}
Sunting Untuk menjawab pertanyaan Anda.
Daripada hanya menggunakan satu kunci "token", buat kunci untuk setiap sesi browser.
$_SESSION[$sessionId] = md5(rand());
Triknya tentu saja akan mencari tahu kapan itu terjadi karena jika Anda tidak dapat menggunakan session, Anda benar-benar tidak akan tahu apakah permintaan tersebut berasal dari tab baru atau yang lama. Anda bisa menggunakan string kueri untuk meneruskan parameter ini. Pada dasarnya semua permintaan harus memiliki parameter ini jika tidak, Anda tidak mengaitkan sesi dengannya.
misalnya
http://www.yoursite.com/somepage.php?sessionid=<some generated id>
Pada akhirnya, pengguna dapat mempermainkan ini, tetapi saya tidak yakin ada jalan lain untuk itu.
Edit 2 Ok, inilah pemikiran saya tentang bagaimana Anda harus melakukan ini. Pakar keamanan di luar sana, jangan ragu untuk memecat saya jika saya salah, seperti yang saya katakan sebelumnya, saya bukan ahli, tetapi sepertinya saya tidak akan keluar dari ini tanpa menyarankan sesuatu;-)
Masalah dengan CSFR adalah bahwa beberapa pengguna jahat, Bob, dapat membuat elemen di situs lain yang menyebabkan browser Alice membuat permintaan ke beberapa situs lain dan, karena Alice sebelumnya masuk dan informasi itu disimpan sebagai cookie atau Alice dikenali melalui sesi, situs mengeksekusi permintaan seolah-olah Alice telah memintanya. Misalnya, jika bank Alice adalah http://www.mybank.com , lalu Bob dapat membuat postingan forum yang berisi
<img srg="http://www.mybank.com/transferfunds.php?amount=1000&receiver=Bob" />
Bank Alice akan mengenali browsernya sebagai yang mengajukan permintaan, mengira itu dia. Ada beberapa hal penting yang harus terjadi (bersama-sama, salah satu dari kegagalan ini akan menyebabkan serangan gagal) untuk menjadikan ini serangan yang layak (ini adalah kunci untuk memahami cara mencegahnya):
- Alice harus login ke situs banknya agar bank mengingatnya. Ini bisa terjadi baik dalam cookie ("ingat saya") atau melalui session. Namun, jika dia menutup browsernya (mengakhiri sesi) atau menghapus cookie-nya, tidak ada ancaman karena situs bank tidak akan mengenalinya dan akan menolak permintaan tersebut.
- Bob harus dapat menyediakan semua parameter yang diperlukan untuk permintaan tersebut, jika tidak, situs web bank akan menolak permintaan tersebut.
Untuk memberikan beberapa gagasan tentang "status" di atas protokol stateless (HTTP), Anda benar-benar tidak dapat menghindari risiko dalam (1). Kecuali Anda membuat orang selalu mengklik "log out" atau menutup jendela mereka dll, tidak ada yang dapat Anda lakukan untuk menyimpan informasi di browser atau sesi. Namun, Anda dapat mencegah (2) menjadi masalah. Solusi saya untuk ini (dan saya yakin ada banyak lainnya) adalah menghasilkan hash, seperti yang Anda lakukan dan menyimpannya dalam sesi.
Misalnya,
$_SESSION['token'] = md5(rand());
Kemudian, yang Anda lakukan adalah menambahkan token itu ke semua tautan internal Anda.
http://www.mysite.com/secure.php?token=giuwnrefviunslfghahgliuwnvwrgbaasd
Anda TIDAK PERNAH simpan token itu di memori browser:yaitu cookie. Saat permintaan dibuat, sebelum Anda melakukan apa pun, Anda memeriksa token
//note, you'll want to sanitize user input, I'm just being brief
if ($_GET['token'] != $_SESSION['token']){
//User either attempted to enter a link on their own or it's a CSRF attack
header('HTTP/1.1 403 Forbidden');
}else{
//do whatever needs to be done
}
Kuncinya adalah semua tautan di situs Anda akan menyertakan token. Namun, Bob tidak tahu apa itu token karena tidak disimpan dalam cookie di browser. Jika dia mencoba membuat tautan ke salah satu halaman Anda, itu akan berisi kunci yang salah, atau tidak akan berisi kunci apa pun dan Anda dapat menolaknya. (Agar adil, ada kemungkinan dia bisa menebak dengan benar token untuk pengguna tertentu yang kebetulan melihat kodenya, tapi dia kemungkinan besar akan meledak.)
Tidak perlu menetapkan batas waktu untuk token karena token akan dilenyapkan saat browser ditutup dan perlu dibuat ulang saat pengguna mengunjungi situs.