Php dapatkan nilai kuki. Setcookie - Menghantar kuki. Mengalih keluar kuki dalam PHP

Keselamatan adalah bahagian penting dalam kejayaan setiap laman web. Walau bagaimanapun, meningkatkan keselamatan secara tidak betul boleh menyebabkan peningkatan kos dan kerengsaan pengguna secara keseluruhan. Dalam panduan ini, kami akan melihat masalah biasa yang dihadapi semasa bekerja dengan fail sesi dan kuki.

biskut

Kuki ialah cara untuk mengenal pasti pengguna melalui tapak. Sebagai contoh, tapak mencipta kuki dengan nama: "warna_kegemaran" dan nilai: "merah". Mulai sekarang, setiap kali anda melawat tapak, kuki akan dimuat turun dan ia akan ditetapkan bahawa warna kegemaran anda ialah merah (“warna_kegemaran” ialah “merah”). Ini agak mudah, kerana pengguna tidak perlu mendaftar dalam sistem setiap kali dia melawat tapak. Kaedah ini juga digunakan dalam pilihan "Ingat Saya", yang terdapat di banyak tapak. Walau bagaimanapun, kaedah ini juga boleh mencipta lubang serius dalam sistem keselamatan tapak.

Satu contoh tidak mengesahkan kuki yang akan dikembalikan ke tapak anda. Selepas beberapa carian mudah, saya menemui tapak web dengan skrip panel pengguna. Skrip ini mengeluarkan semua maklumat log masuk saya dalam kuki dan memuatkan nilai setiap kali tindakan itu dilaksanakan. Sebagai contoh, jika saya meninggalkan ulasan, sistem akan mengembalikan mana-mana nama saya daripada pembolehubah nama kuki. Seterusnya, menggunakan sambungan pepijat api dan beberapa peranti lain, saya bukan sahaja dapat melihat fail ini, tetapi juga mengeditnya. Oleh itu, setiap kali saya mengedit kuki yang mengandungi nama saya, tapak tersebut tidak mengesahkan ketepatan nama itu, tetapi memaparkan data. Saya juga boleh menukar ID saya. Saya akhirnya dapat mencari ID pentadbir (001) dan mendapat akses pentadbir.

Sesi

Sesi ialah pembolehubah pengenalan pengguna yang disimpan pada pelayan anda. Tidak seperti kuki, pengguna tidak boleh mengubahnya secara langsung, tetapi pada masa yang sama, risiko masih wujud. Terdapat dua ancaman utama kepada sesi: penetapan sesi dan rampasan sesi.

Merakam sesi

Penetapan sesi berlaku apabila pengguna menyambung ke sesi yang telah ditetapkan dan memuat naik maklumat mereka di sana. Dengan log masuk ke sesi yang telah ditetapkan, penyerang boleh melawati sesi ini dan mendapatkan maklumat yang dimasukkan oleh pengguna. Contoh mudah ialah mengikuti pautan ke tapak web dengan ID sesi telah ditetapkan. Contohnya, http://www.example.com/?PHPSESSID=1234. Penyerang kini menggunakan PHPSESSID yang sama untuk melihat maklumat anda.

Sesi rampasan

Rampasan sesi ialah jenis serangan kedua, yang lebih sukar untuk dipertahankan. Dalam kes ini, penyerang boleh memiliki pengecam sesi anda melalui analisis paket (data) dan pelbagai kaedah lain. Contohnya, penyerang yang disambungkan ke rangkaian anda boleh menapis semua data anda yang dihantar ke penghala anda. Selepas menerima ID sesi anda, penyerang boleh melawati ID ini untuk mendapatkan akses kepada semua maklumat anda.

Penggunaan sesi yang berkesan

Panduan ini tidak meliputi proses pengekodan skrip pendaftaran. Walau bagaimanapun, saya akan cuba menunjukkan cara untuk menjadikan skrip log masuk semasa anda lebih selamat.

Secara umum, menggunakan sesi adalah lebih selamat daripada menggunakan kuki. Ini kerana pengguna tidak boleh menukar nilai sesi semudah mereka boleh menukar nilai kuki. Inilah sebabnya saya suka menyimpan semua pembolehubah pengguna dalam pembolehubah sesi. Satu lagi perkara penting ialah jangan sekali-kali mempercayai input pengguna. Sentiasa semak maklumat pengguna terhadap nilai dalam pangkalan data MYSQL dan kemudian keluarkan ke sesi dengan sewajarnya. Pertimbangkan untuk membuat perubahan pada fungsi pendaftaran seperti berikut:

log masuk fungsi($nama pengguna, $kata laluan)
$sql = mysql_query("SELECT id, user_level FROM users WHERE password = "" . $password . "" AND username = "" . $username . "" LIMIT 1");
// Jika tiada padanan maka nama pengguna dan kata laluan tidak sepadan
if($sql === false)
{
kembali palsu;
}
lain
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$session_id = $u;
$session_username = $username;
$peringkat_sesi = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = masa();
kembali benar;
}
}

Mari analisa kod ini. Ia meminta nama pengguna dan kata laluan dan menyemak untuk melihat sama ada terdapat pengguna yang sepadan dengan kedua-dua kriteria ini. Jika tiada keputusan, gabungan nama pengguna/kata laluan yang tidak sah dijana dan ralat dijana. Jika tidak, pembolehubah sesi dibuat: user_id, user_level, user_name dan user_lastactive. Nilai ini diisi dengan data dari senarai mysql.

Anda mungkin tertanya-tanya apakah maksud fungsi "session_regenerate_id(true)". Terdahulu kita bercakap tentang penetapan sesi. Penyelesaian ini direka untuk melindungi daripada jenis serangan ini. Fungsi ini mencipta ID sesi baharu setiap kali pengguna log masuk. Dengan cara ini, jika pengguna mengklik pada pautan dengan set nilai sesi, ID sesi baharu akan dibuat dan maklumat pengguna akan ditambahkan pada sesi baharu dan bukannya yang lama. Apabila parameter yang betul (benar) dihantar melalui fungsi ini, ia memadamkan sesi lama dan memadamkan semua maklumat.

Menulis fungsi "Ingat Saya".

Kuki atau fail sesi tidak boleh mengandungi kata laluan pengguna. Ini sangat penting kerana jika fail sesi atau kuki dipintas, penyerang boleh mendapatkan kawalan penuh ke atas semua akaun. Adalah diketahui bahawa ramai pengguna menggunakan kata laluan yang sama dalam akaun yang berbeza, dan ini akan membolehkan penyerang menguasai akaun pengguna di tapak lain. Bagaimana kita boleh keluar dari kesusahan ini?

Penyelesaian kepada masalah ini ialah kunci kebenaran akses (auth_key). Kunci kebenaran akses boleh menjadi gabungan nama pengguna, kata laluan dan set aksara rawak, yang digabungkan dan disulitkan. Setiap pengguna mesti mempunyai kunci kebenaran akses unik mereka sendiri. Oleh itu, apabila kuki ditetapkan, nilai ditetapkan kepada kunci kebenaran akses. Selepas ini, nilai kunci kebenaran akses dibandingkan dengan nilai dalam senarai MySQL yang anda tambah. Mari lihat bagaimana ciri log masuk pengguna akan berubah.

akaun_aktif = benar; // Semak sama ada pengguna mahu akaun disimpan dalam cookie if($remember) ( // Jana kunci pengesahan baharu untuk setiap log masuk (jadi kunci pengesahan lama tidak boleh digunakan berbilang kali sekiranya // rampasan kuki) $cookie_auth= rand_string(10) . $username; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("KEMASKINI pengguna SET auth_key = "" . $auth_key . "" WHERE nama pengguna = "" . $nama pengguna . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Berikan pembolehubah kepada session session_regenerate_id(true); $session_id = $u; $session_username = $username; $peringkat_sesi = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = masa(); kembali benar; ) ) ) ?>

Kini ia menyemak sama ada parameter "benar" telah melalui parameter ingat fungsi log masuk. Jika ya, kuki ditetapkan untuk kunci kebenaran akses. Fungsi Rand_string mencipta rentetan dengan bilangan aksara yang telah melaluinya. Fungsi Session_encrypt menambah data sembarangan pada rantai dan menyulitkan semua maklumat menggunakan md5. Rantaian ini unik kerana ia menggunakan nama pengguna yang unik untuk setiap pengguna. Kunci kebenaran akses dalam senarai mysql kemudiannya ditetapkan kepada nilai yang dimasukkan ke dalam kuki. Walau bagaimanapun, perlindungan ini mungkin tidak mencukupi untuk tapak anda. Pertimbangkan untuk menambah berbilang kunci kebenaran akses dan berbilang kuki. Sekali lagi, fungsi ini tidak memenuhi keperluan fungsi "ingat saya". Anda juga perlu menambah fungsi permulaan.

Fungsi ini mesti diakses pada setiap halaman. Tujuannya adalah untuk menyemak kunci kebenaran akses kuki (“auth_key”). Jika kuki menggunakan fungsi isset, pengguna yang sepadan akan muncul. Sekali lagi, fungsi ini mesti diakses pada setiap halaman.

Kod ini menyemak sama ada fungsi isset digunakan. Jika fungsi ini digunakan oleh kuki, semakan akan dibuat untuk memadankan kunci kebenaran akses dengan pengguna. Jika perlawanan dibuat, fail akan mengeluarkan maklumat yang diperlukan dan mendaftarkan pengguna. Jika tidak, kuki akan dipadamkan kerana ia tidak sah.

Ciri-ciri lain

= $currenttime)( // Tetapkan masa aktif terakhir pengguna baharu $_SESSION["user_lastactive"] = $currenttime; ) else ( // Jika sesi tidak aktif terlalu lama log keluar(); ) ) ) ) ?>

Ciri log keluar adalah jelas. Fungsi ini memadamkan semua pembolehubah sesi dan kuki dan menetapkan nilai kunci kebenaran akses pengguna kepada 0. Selepas ini, kunci kebenaran akses tidak boleh digunakan lagi. Perlu diingatkan bahawa pengguna boleh menetapkan kuki mereka kepada 0 dan masih dilog masuk di bawah nama pengguna mereka. Untuk membetulkannya, semak semua maklumat yang diterima daripada kuki. Menggunakan fungsi regexp, pastikan rentetan mengandungi bilangan aksara yang sah, mengandungi aksara yang sah, dsb. Fungsi keepalive() memastikan sesi tetap hidup. Fungsi ini harus ada pada setiap halaman.

Kesimpulan & rampasan sesi

Sangat sukar untuk melindungi daripada Rampasan Sesi. Anda mungkin telah membaca beberapa nasihat tentang menggunakan gabungan alamat IP pengguna atau proses Ejen Pengguna untuk membuat teg pengenalan. Walau bagaimanapun, ini tidak berkesan untuk pengguna sebenar anda. Alamat IP pengguna sentiasa berubah. Penyedia perkhidmatan Internet utama seperti AOL menukarnya setiap beberapa minit. Ini akan menimbulkan masalah besar. Proses Ejen Pengguna juga berubah - IE7 telah mendapati bahawa ejen pengguna berubah secara berkala. Cara terbaik untuk melindungi daripada pemintasan adalah dengan mencipta sistem tongkat. Sistem ini mengeluarkan kuki pada setiap halaman pemuatan dan juga menyimpan nilai ini dalam senarai mysql anda. Nilai kuki kemudiannya dibandingkan dengan nilai jadual MySQL. Jika mereka berbeza, sesi itu akan menjadi tidak sah.

Ini adalah fungsi asas untuk bekerja dengan fail sesi dan kuki. Sudah tentu, untuk meningkatkan keselamatan, perlu menambah lebih banyak kuki untuk mengesahkan kesahihan data. Tahap perlindungan ini tidak mencukupi untuk melindungi maklumat sensitif, tetapi anda perlu bermula di suatu tempat! Dan kesimpulannya:

Sila pastikan bahawa nilai kuki adalah sah.
Jangan sekali-kali mengeluarkan kata laluan sesi atau pembolehubah kuki.

Untuk mengelakkan penetapan sesi, gunakan pengecam
session_regenerate_id.

Sehingga pelajaran seterusnya!

P.S. Saya akan menterjemahkan komen dalam kod dalam masa 24 jam :)

Dalam tutorial hari ini kita akan bercakap tentang bekerja dengan kuki dalam PHP. Mari kita mulakan dengan apa itu, mengapa ia diperlukan dan mengapa ia muncul pada mulanya.

Kuki digunakan untuk apa?

Seperti yang anda dan saya sedia maklum, dalam PHP kita boleh bekerja dengan permintaan GET dan POST. Mereka membenarkan kami menghantar data ke pelayan untuk mempengaruhi operasi kod tersebut. Kami boleh memberikan skrip log masuk dan kata laluan, ia akan menyemaknya dan membenarkan kami mengakses sebarang maklumat. Walau bagaimanapun, ini tidak akan membenarkan membuat sesi antara kami dan pelayan. Iaitu, pelayan tidak boleh "mengingat" kami, dan setiap kali kami ingin mengatakan bahawa kami adalah kami, kami perlu menghantar permintaan baharu yang berasingan dengan log masuk dan kata laluan.

Kuki dicipta sebagai penyelesaian. Ini adalah rekod dengan jenis nilai kunci, seperti tatasusunan dalam PHP, tetapi ia disimpan dalam penyemak imbas pengguna tapak. Kuki disimpan secara berasingan untuk setiap tapak. Setiap kali pengguna membuat permintaan ke tapak, penyemak imbas menyemak untuk melihat sama ada rekod ini wujud untuk tapak tersebut. Dan jika ada, maka ia menghantarnya dalam tajuk setiap permintaan ke tapak ini.

Dari mana datangnya kuki?

Kuki dicipta dalam pelayar atas "permintaan" pelayan. Pada satu ketika, kami memutuskan bahawa kami perlu membuat kuki dengan beberapa nilai dalam penyemak imbas pelawat. Untuk melakukan ini, pelayan perlu menghantar pengepala khas dalam respons kepada klien, yang menunjukkan rekod yang perlu dibuat dalam penyemak imbas untuk tapak ini.

Semua ini berlaku di latar belakang dan tidak dapat dilihat oleh pengguna. Keizinan pada mana-mana tapak web berfungsi mengikut prinsip ini. Dalam kes paling mudah, selepas anda memasukkan log masuk dan kata laluan anda di tapak, pelayan menyemak sama ada ia betul. Dan jika ya, maka pelayan boleh meminta penyemak imbas untuk menyimpan data ini dalam kuki dan menghantarnya kepadanya dengan setiap permintaan.

Iaitu, pelayan secara kasar berkata: "Hei, penyemak imbas, buat entri untuk saya dengan kunci "log masuk" dan nilai "admin", dan satu lagi dengan kunci "kata laluan" dan nilai "123". Selepas ini, penyemak imbas mula menghantar data tambahan seperti:

Log masuk: kata laluan admin: 123

Selepas ini, di tempat lain di tapak yang memerlukan kebenaran, kini boleh menyemak data ini daripada kuki tanpa memaksa pengguna mengisi borang itu semula. Dan jika mereka adalah log masuk dan kata laluan yang betul, maka berikan pengguna akses kepada sesuatu.

Tentang masa hidup

Pada masa yang sama, kuki mempunyai TTL (Masa Untuk Hidup). Iaitu, rekod ini mungkin bersifat sementara. Seumur hidup ini juga ditunjukkan oleh pelayan apabila kuki dipasang dalam penyemak imbas. Terima kasih kepada ini, anda boleh membuat sesi berlangsung setengah jam. Dan selepas masa ini, pengguna perlu log masuk semula. Anda mungkin perasan perkara ini dalam tindakan di banyak tapak.

Bagaimana untuk bekerja dengan kuki dalam PHP

Jadi, kami mempunyai pemahaman asas tentang cara kuki berfungsi. Sekarang mari kita lihat bagaimana anda boleh bekerja dengan mereka dalam PHP.

Mari buat fail dalam projek kami yang dipanggil viewCookies.php. Mari letakkan kod berikut di dalamnya.

Seperti yang sepatutnya anda duga sekarang, $_COOKIE ialah satu lagi tatasusunan global dalam PHP, serupa dengan tatasusunan $_DAPAT Dan $_POST. Hanya ia menyimpan semua kuki yang dihantar oleh penyemak imbas sebagai sebahagian daripada permintaan semasa.

Mari lihat bagaimana skrip ini berfungsi dengan membuka halaman dalam penyemak imbas: http://myproject.loc/viewCookies.php

Seperti yang kita lihat, tatasusunan ini kosong pada masa ini. Mari kita isi :) Untuk melakukan ini, kita perlu memasang beberapa jenis kuki dalam penyemak imbas. Dalam PHP, fungsi ini digunakan untuk ini setcookie($nama, $value, $ttl, $path)

Parameter lulus:

  • $name – nama kuki
  • $value – nilainya
  • $ttl – seumur hidup. Jika anda menyatakan 0, kuki akan dipasang selama-lamanya (sehingga ia dipadamkan).
  • $path – laluan dalam bar alamat. Jika anda menyatakan "/", kuki akan tersedia daripada semua direktori di tapak. Sebagai contoh, dalam kedua-dua http://myproject.loc/ dan http://myproject.loc/posts/ . Jika anda menetapkan "/posts/", kuki hanya boleh diakses daripada direktori http://myproject.loc/posts/ dan semua subdirektorinya (contohnya, http://myproject.loc/posts/new/). Nilai lalai ialah direktori semasa tempat kuki dipasang. Jika kami mahu kuki tersedia di seluruh tapak, maka kami perlu menetapkan nilai ini kepada "/".

Terdapat beberapa lagi parameter, anda boleh membaca tentangnya dalam dokumentasi rasmi.

Sekarang mari cuba fungsi ini dalam tindakan. Mari buat fail yang dipanggil setCookies.php dan tulis kod berikut ke dalamnya:

Selepas itu, pergi ke http://myproject.loc/setCookies.php, di mana kita akan melihat halaman kosong. Seperti yang telah kami katakan, bekerja dengan kuki tidak dapat dilihat oleh pengguna.

Walau bagaimanapun, kerja ini sentiasa boleh dilihat dalam konsol pembangun Google Chrome. Mari bukanya (dengan menekan F12), pergi ke tab Rangkaian, muat semula halaman dalam penyemak imbas dan cari dalam senarai data yang dimuat turun (ia adalah satu-satunya di sana).

Klik pada entri ini dan dalam tetingkap yang terbuka di sebelah kanan, pilih tab Pengepala. Di sini, dalam bahagian Pengepala Respons, kita boleh melihat pengepala Set-Cookie dengan data yang kami tentukan.

Oleh itu, kuki telah berjaya dipasang dalam penyemak imbas. Sekarang mari pergi ke halaman kami yang memaparkan tatasusunan $_COOKIE - http://myproject.loc/viewCookies.php

Seperti yang kita dapat lihat, kuki yang dipasang sebelum ini dalam penyemak imbas kini dihantar ke pelayan. Anda juga boleh melihatnya dalam permintaan dengan melihat bahagian Tajuk Permintaan dalam konsol pembangun.

Jika anda perlu melihat semua kuki yang tersedia dalam penyemak imbas untuk tapak tertentu, anda boleh melihatnya dalam konsol pembangun Google Chrome yang sama. Untuk melakukan ini, pergi ke tab Aplikasi, pilih item Kuki dalam senarai kiri dan tapak kami di dalamnya.

Semua kuki akan dibentangkan dalam senarai yang mudah.

Apa lagi yang anda perlu tahu tentang kuki

Dan untuk mengakhiri pelajaran ini, kita perlu menambah bahawa kuki ditetapkan menggunakan pengepala dalam respons pelayan melalui HTTP. Protokol HTTP direka bentuk sedemikian rupa sehingga pengepala mesti sentiasa di hadapan data, dan tidak ada yang lain. Oleh itu, fungsi setcookie dan sebarang fungsi lain dalam PHP yang menukar pengepala dalam respons HTTP mesti dipanggil sebelum sebarang output dikeluarkan.

Anda boleh menetapkan kuki dahulu dan kemudian memaparkan teks.

Semuanya akan berjalan dengan baik.

Tetapi anda tidak boleh mencetak teks (iaitu badan respons HTTP) dan kemudian cuba menetapkan kuki.

Seperti yang kita lihat, ini akan membawa kepada ralat. Beginilah cara protokol HTTP berfungsi. Pertama - tajuk, kemudian - badan. Hanya dengan cara ini dan tiada cara lain.

Menetapkan berbilang kuki

Tiada yang lebih mudah daripada menetapkan beberapa kuki. Untuk melakukan ini, anda hanya perlu memanggil fungsi setcookie beberapa kali.

Mereka akan berjaya dipindahkan kepada pelanggan.

Kami akan melihat contoh interaksi pengguna penuh melalui kuki dalam pelajaran seterusnya. Sementara itu, mari kita buat kerja rumah.

Keselamatan adalah bahagian penting dalam kejayaan setiap laman web. Walau bagaimanapun, meningkatkan keselamatan secara tidak betul boleh menyebabkan peningkatan kos dan kerengsaan pengguna secara keseluruhan. Dalam panduan ini, kami akan melihat masalah biasa yang dihadapi semasa bekerja dengan fail sesi dan kuki.

biskut

Kuki ialah cara untuk mengenal pasti pengguna melalui tapak. Sebagai contoh, tapak mencipta kuki dengan nama: "warna_kegemaran" dan nilai: "merah". Mulai sekarang, setiap kali anda melawat tapak, kuki akan dimuat turun dan ia akan ditetapkan bahawa warna kegemaran anda ialah merah (“warna_kegemaran” ialah “merah”). Ini agak mudah, kerana pengguna tidak perlu mendaftar dalam sistem setiap kali dia melawat tapak. Kaedah ini juga digunakan dalam pilihan "Ingat Saya", yang terdapat di banyak tapak. Walau bagaimanapun, kaedah ini juga boleh mencipta lubang serius dalam sistem keselamatan tapak.

Satu contoh tidak mengesahkan kuki yang akan dikembalikan ke tapak anda. Selepas beberapa carian mudah, saya menemui tapak web dengan skrip panel pengguna. Skrip ini mengeluarkan semua maklumat log masuk saya dalam kuki dan memuatkan nilai setiap kali tindakan itu dilaksanakan. Sebagai contoh, jika saya meninggalkan ulasan, sistem akan mengembalikan mana-mana nama saya daripada pembolehubah nama kuki. Seterusnya, menggunakan sambungan pepijat api dan beberapa peranti lain, saya bukan sahaja dapat melihat fail ini, tetapi juga mengeditnya. Oleh itu, setiap kali saya mengedit kuki yang mengandungi nama saya, tapak tersebut tidak mengesahkan ketepatan nama itu, tetapi memaparkan data. Saya juga boleh menukar ID saya. Saya akhirnya dapat mencari ID pentadbir (001) dan mendapat akses pentadbir.

Sesi

Sesi ialah pembolehubah pengenalan pengguna yang disimpan pada pelayan anda. Tidak seperti kuki, pengguna tidak boleh mengubahnya secara langsung, tetapi pada masa yang sama, risiko masih wujud. Terdapat dua ancaman utama kepada sesi: penetapan sesi dan rampasan sesi.

Merakam sesi

Penetapan sesi berlaku apabila pengguna menyambung ke sesi yang telah ditetapkan dan memuat naik maklumat mereka di sana. Dengan log masuk ke sesi yang telah ditetapkan, penyerang boleh melawati sesi ini dan mendapatkan maklumat yang dimasukkan oleh pengguna. Contoh mudah ialah mengikuti pautan ke tapak web dengan ID sesi telah ditetapkan. Contohnya, http://www.example.com/?PHPSESSID=1234. Penyerang kini menggunakan PHPSESSID yang sama untuk melihat maklumat anda.

Sesi rampasan

Rampasan sesi ialah jenis serangan kedua, yang lebih sukar untuk dipertahankan. Dalam kes ini, penyerang boleh memiliki pengecam sesi anda melalui analisis paket (data) dan pelbagai kaedah lain. Contohnya, penyerang yang disambungkan ke rangkaian anda boleh menapis semua data anda yang dihantar ke penghala anda. Selepas menerima ID sesi anda, penyerang boleh melawati ID ini untuk mendapatkan akses kepada semua maklumat anda.

Penggunaan sesi yang berkesan

Panduan ini tidak meliputi proses pengekodan skrip pendaftaran. Walau bagaimanapun, saya akan cuba menunjukkan cara untuk menjadikan skrip log masuk semasa anda lebih selamat.

Secara umum, menggunakan sesi adalah lebih selamat daripada menggunakan kuki. Ini kerana pengguna tidak boleh menukar nilai sesi semudah mereka boleh menukar nilai kuki. Inilah sebabnya saya suka menyimpan semua pembolehubah pengguna dalam pembolehubah sesi. Satu lagi perkara penting ialah jangan sekali-kali mempercayai input pengguna. Sentiasa semak maklumat pengguna terhadap nilai dalam pangkalan data MYSQL dan kemudian keluarkan ke sesi dengan sewajarnya. Pertimbangkan untuk membuat perubahan pada fungsi pendaftaran seperti berikut:

log masuk fungsi($nama pengguna, $kata laluan)
$sql = mysql_query("SELECT id, user_level FROM users WHERE password = "" . $password . "" AND username = "" . $username . "" LIMIT 1");
// Jika tiada padanan maka nama pengguna dan kata laluan tidak sepadan
if($sql === false)
{
kembali palsu;
}
lain
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$session_id = $u;
$session_username = $username;
$peringkat_sesi = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = masa();
kembali benar;
}
}

Mari analisa kod ini. Ia meminta nama pengguna dan kata laluan dan menyemak untuk melihat sama ada terdapat pengguna yang sepadan dengan kedua-dua kriteria ini. Jika tiada keputusan, gabungan nama pengguna/kata laluan yang tidak sah dijana dan ralat dijana. Jika tidak, pembolehubah sesi dibuat: user_id, user_level, user_name dan user_lastactive. Nilai ini diisi dengan data dari senarai mysql.

Anda mungkin tertanya-tanya apakah maksud fungsi "session_regenerate_id(true)". Terdahulu kita bercakap tentang penetapan sesi. Penyelesaian ini direka untuk melindungi daripada jenis serangan ini. Fungsi ini mencipta ID sesi baharu setiap kali pengguna log masuk. Dengan cara ini, jika pengguna mengklik pada pautan dengan set nilai sesi, ID sesi baharu akan dibuat dan maklumat pengguna akan ditambahkan pada sesi baharu dan bukannya yang lama. Apabila parameter yang betul (benar) dihantar melalui fungsi ini, ia memadamkan sesi lama dan memadamkan semua maklumat.

Menulis fungsi "Ingat Saya".

Kuki atau fail sesi tidak boleh mengandungi kata laluan pengguna. Ini sangat penting kerana jika fail sesi atau kuki dipintas, penyerang boleh mendapatkan kawalan penuh ke atas semua akaun. Adalah diketahui bahawa ramai pengguna menggunakan kata laluan yang sama dalam akaun yang berbeza, dan ini akan membolehkan penyerang menguasai akaun pengguna di tapak lain. Bagaimana kita boleh keluar dari kesusahan ini?

Penyelesaian kepada masalah ini ialah kunci kebenaran akses (auth_key). Kunci kebenaran akses boleh menjadi gabungan nama pengguna, kata laluan dan set aksara rawak, yang digabungkan dan disulitkan. Setiap pengguna mesti mempunyai kunci kebenaran akses unik mereka sendiri. Oleh itu, apabila kuki ditetapkan, nilai ditetapkan kepada kunci kebenaran akses. Selepas ini, nilai kunci kebenaran akses dibandingkan dengan nilai dalam senarai MySQL yang anda tambah. Mari lihat bagaimana ciri log masuk pengguna akan berubah.

akaun_aktif = benar; // Semak sama ada pengguna mahu akaun disimpan dalam cookie if($remember) ( // Jana kunci pengesahan baharu untuk setiap log masuk (jadi kunci pengesahan lama tidak boleh digunakan berbilang kali sekiranya // rampasan kuki) $cookie_auth= rand_string(10) . $username; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("KEMASKINI pengguna SET auth_key = "" . $auth_key . "" WHERE nama pengguna = "" . $nama pengguna . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Berikan pembolehubah kepada session session_regenerate_id(true); $session_id = $u; $session_username = $username; $peringkat_sesi = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = masa(); kembali benar; ) ) ) ?>

Kini ia menyemak sama ada parameter "benar" telah melalui parameter ingat fungsi log masuk. Jika ya, kuki ditetapkan untuk kunci kebenaran akses. Fungsi Rand_string mencipta rentetan dengan bilangan aksara yang telah melaluinya. Fungsi Session_encrypt menambah data sembarangan pada rantai dan menyulitkan semua maklumat menggunakan md5. Rantaian ini unik kerana ia menggunakan nama pengguna yang unik untuk setiap pengguna. Kunci kebenaran akses dalam senarai mysql kemudiannya ditetapkan kepada nilai yang dimasukkan ke dalam kuki. Walau bagaimanapun, perlindungan ini mungkin tidak mencukupi untuk tapak anda. Pertimbangkan untuk menambah berbilang kunci kebenaran akses dan berbilang kuki. Sekali lagi, fungsi ini tidak memenuhi keperluan fungsi "ingat saya". Anda juga perlu menambah fungsi permulaan.

Fungsi ini mesti diakses pada setiap halaman. Tujuannya adalah untuk menyemak kunci kebenaran akses kuki (“auth_key”). Jika kuki menggunakan fungsi isset, pengguna yang sepadan akan muncul. Sekali lagi, fungsi ini mesti diakses pada setiap halaman.

Kod ini menyemak sama ada fungsi isset digunakan. Jika fungsi ini digunakan oleh kuki, semakan akan dibuat untuk memadankan kunci kebenaran akses dengan pengguna. Jika perlawanan dibuat, fail akan mengeluarkan maklumat yang diperlukan dan mendaftarkan pengguna. Jika tidak, kuki akan dipadamkan kerana ia tidak sah.

Ciri-ciri lain

= $currenttime)( // Tetapkan masa aktif terakhir pengguna baharu $_SESSION["user_lastactive"] = $currenttime; ) else ( // Jika sesi tidak aktif terlalu lama log keluar(); ) ) ) ) ?>

Ciri log keluar adalah jelas. Fungsi ini memadamkan semua pembolehubah sesi dan kuki dan menetapkan nilai kunci kebenaran akses pengguna kepada 0. Selepas ini, kunci kebenaran akses tidak boleh digunakan lagi. Perlu diingatkan bahawa pengguna boleh menetapkan kuki mereka kepada 0 dan masih dilog masuk di bawah nama pengguna mereka. Untuk membetulkannya, semak semua maklumat yang diterima daripada kuki. Menggunakan fungsi regexp, pastikan rentetan mengandungi bilangan aksara yang sah, mengandungi aksara yang sah, dsb. Fungsi keepalive() memastikan sesi tetap hidup. Fungsi ini harus ada pada setiap halaman.

Kesimpulan & rampasan sesi

Sangat sukar untuk melindungi daripada Rampasan Sesi. Anda mungkin telah membaca beberapa nasihat tentang menggunakan gabungan alamat IP pengguna atau proses Ejen Pengguna untuk membuat teg pengenalan. Walau bagaimanapun, ini tidak berkesan untuk pengguna sebenar anda. Alamat IP pengguna sentiasa berubah. Penyedia perkhidmatan Internet utama seperti AOL menukarnya setiap beberapa minit. Ini akan menimbulkan masalah besar. Proses Ejen Pengguna juga berubah - IE7 telah mendapati bahawa ejen pengguna berubah secara berkala. Cara terbaik untuk melindungi daripada pemintasan adalah dengan mencipta sistem tongkat. Sistem ini mengeluarkan kuki pada setiap halaman pemuatan dan juga menyimpan nilai ini dalam senarai mysql anda. Nilai kuki kemudiannya dibandingkan dengan nilai jadual MySQL. Jika mereka berbeza, sesi itu akan menjadi tidak sah.

Ini adalah fungsi asas untuk bekerja dengan fail sesi dan kuki. Sudah tentu, untuk meningkatkan keselamatan, perlu menambah lebih banyak kuki untuk mengesahkan kesahihan data. Tahap perlindungan ini tidak mencukupi untuk melindungi maklumat sensitif, tetapi anda perlu bermula di suatu tempat! Dan kesimpulannya:

Sila pastikan bahawa nilai kuki adalah sah.
Jangan sekali-kali mengeluarkan kata laluan sesi atau pembolehubah kuki.

Untuk mengelakkan penetapan sesi, gunakan pengecam
session_regenerate_id.

Sehingga pelajaran seterusnya!

P.S. Saya akan menterjemahkan komen dalam kod dalam masa 24 jam :)

(PHP 4, PHP 5, PHP 7)

setcookie — Menghantar kuki

Penerangan

Bool setcookie (rentetan $nama [, rentetan $nilai [, int $expire = 0 [, rentetan $path [, rentetan $domain [, bool $secure = palsu [, bool $httponly = palsu ]]]]]])

setcookie() menentukan kuki yang akan dihantar kepada klien bersama-sama dengan pengepala HTTP yang lain. Seperti mana-mana pengepala lain, kuki mesti dihantar sebelum ini sebelum sebarang data skrip lain dikeluarkan (ini adalah had protokol). Ini bermakna bahawa dalam skrip, panggilan ke fungsi ini mesti diletakkan sebelum seluruh output, termasuk output tag Dan , serta baris dan ruang kosong.

Setelah dihantar kepada pelanggan, kuki akan tersedia melalui tatasusunan $_COOKIE dan $HTTP_COOKIE_VARS pada kali berikutnya halaman dimuatkan. Sila ambil perhatian bahawa superglobal seperti $_COOKIE hanya tersedia dalam PHP 4.1.0. Nilai kuki juga terdapat dalam $_REQUEST .

Senarai parameter

Semua argumen kecuali nama adalah pilihan. Jika anda perlu melangkau sebarang hujah, anda boleh menggantikannya dengan rentetan kosong ( "" ). Ini tidak terpakai pada hujah tamat tempoh. Memandangkan ia menerima nilai integer, rentetan kosong tidak sesuai untuk menggantikannya. Gunakan sifar sebaliknya ( 0 ).

tamat tempoh

Masa kuki tamat tempoh. Ini ialah cap waktu Unix, bermakna ia ialah bilangan saat sejak zaman itu. Dalam erti kata lain, adalah dinasihatkan untuk menetapkan masa ini menggunakan fungsi masa(), menambah masa dalam beberapa saat selepas itu kuki harus tamat tempoh. Atau anda boleh menggunakan fungsi tersebut mktime(). masa()+60*60*24*30 akan menetapkan tarikh tamat tempoh kuki kepada 30 hari. Jika ditetapkan kepada 0 atau ditinggalkan, kuki akan tamat tempoh pada penghujung sesi (apabila penyemak imbas ditutup).

Komen:

Anda mungkin perasan bahawa tamat tempoh mengambil cap masa Unix sebagai nilainya dan menyimpannya dalam format Wdy,DD-Isn-YYYY HH:MM:SS GMT. PHP melakukan penukaran dalaman secara automatik.

laluan

Laluan ke direktori pada pelayan dari mana kuki akan tersedia. Jika anda menetapkan "/" , kuki akan tersedia di seluruh domain. Jika anda menetapkan "/foo/", kuki hanya boleh diakses daripada direktori /foo/ dan semua subdirektorinya (contohnya, /foo/bar/) domain domain . Nilai lalai ialah direktori semasa tempat kuki dipasang.

Domain yang kuki tersedia. Menentukan domain "www.example.com" akan menjadikan kuki tersedia dalam subdomain www dan subdomain pesanan yang lebih tinggi. Kuki tersedia untuk tahap rendah seperti "example.com", akan tersedia dalam semua subdomain peringkat tertinggi, termasuk "www.example.com". Pelayar lama yang mengikuti RFC 2109 lama mungkin memerlukan . sebelum domain supaya semua subdomain disertakan.

Menentukan bahawa nilai kuki harus dihantar daripada klien melalui sambungan HTTPS yang selamat. Jika ditetapkan BENAR, kuki daripada klien akan dihantar ke pelayan hanya jika sambungan selamat diwujudkan. Apabila menghantar kuki daripada pelayan kepada klien, terpulang kepada pengaturcara pelayan web untuk memastikan kuki jenis ini dihantar melalui saluran selamat (beri perhatian kepada $_SERVER["HTTPS"]).

Httponly

Jika ditetapkan BENAR, kuki hanya boleh diakses melalui protokol HTTP. Iaitu, kuki dalam kes ini tidak akan tersedia untuk bahasa skrip seperti JavaScript. Ciri ini telah dicadangkan sebagai langkah berkesan untuk mengurangkan kecurian identiti melalui serangan XSS (walaupun ia tidak disokong oleh semua pelayar). Perlu diingat, bagaimanapun, bahawa di sekitar kemungkinan ini sering terdapat pertikaian tentang keberkesanan dan kebolehlaksanaannya. Hujah telah ditambah dalam PHP 5.2.0. Boleh mengambil nilai BENAR atau SALAH.

Kembalikan nilai

Jika sebarang output (teg, baris kosong, ruang, teks, dsb.) telah dihantar kepada klien sebelum memanggil fungsi, setcookie() akan gagal dan kembali SALAH. Jika setcookie() berfungsi dengan jayanya, ia akan kembali BENAR. Ini, walau bagaimanapun, tidak bermakna bahawa aplikasi klien (pelayar) menerima dan memproses kuki dengan betul.

Contoh

Di bawah ialah beberapa contoh cara menghantar kuki:

Contoh #1 Contoh penggunaan setcookie()

$value = "sesuatu di suatu tempat" ;!}

Setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+ 3600); /* tempoh sah 1 jam */
setcookie ("TestCookie" , $value , masa ()+ 3600 , "/~rasmus/" , "example.com" , 1 );
?>

Perlu diingat bahawa nilai kuki adalah URL yang dikodkan sebelum dihantar kepada pelanggan. Apabila diterima semula, nilai kuki dinyahkodkan dan diletakkan ke dalam pembolehubah dengan nama yang sama dengan nama kuki. Jika anda tidak mahu nilai dikodkan, gunakan fungsi tersebut setrawcookie()(berfungsi dalam PHP 5). Anda boleh melihat kandungan kuki ujian kami dengan menjalankan salah satu daripada contoh berikut:

// Cetak satu nilai kuki tertentu
echo $_COOKIE [ "TestCookie" ];
echo $HTTP_COOKIE_VARS [ "TestCookie" ];

// Untuk tujuan ujian dan penyahpepijatan, mungkin berguna untuk mencetak semua kuki
print_r($_COOKIE);
?>

Contoh #2 Contoh memadam kuki menggunakan setcookie()

Untuk memadamkan kuki, cukup untuk menyatakan beberapa masa yang lalu sebagai tarikh tamat tempoh. Ini akan mencetuskan mekanisme penyemak imbas untuk mengalih keluar kuki yang telah tamat tempoh. Contoh di bawah menunjukkan cara mengalih keluar kuki yang ditetapkan dalam contoh sebelumnya:

// tetapkan tarikh tamat tempoh kepada sejam yang lalu
setcookie("TestCookie", "", masa() - 3600);
setcookie ("TestCookie" , "" , masa () - 3600 , "/~rasmus/" , "example.com" , 1 );
?>

Contoh #3 setcookie() dan tatasusunan

Ia adalah mungkin untuk meletakkan tatasusunan dalam kuki. Untuk melakukan ini, setiap kuki mesti diberi nama mengikut peraturan untuk menamakan tatasusunan. Ciri ini membolehkan anda meletakkan seberapa banyak nilai kerana terdapat elemen dalam tatasusunan. Apabila diambil semula, semua nilai ini akan diletakkan dalam tatasusunan bernama kuki itu:

//hantar kuki
setcookie("cookie" , "cookiethree" );
setcookie("cookie" , "cookietwo" );
setcookie("cookie" , "cookieone" );

// selepas halaman dimuat semula, paparkan kuki
jika (isset ($_COOKIE [ "kuki" ])) (
foreach ($_COOKIE [ "cookie" ] sebagai $name => $value ) (
$nama = htmlspecialchars($nama);
$value = htmlspecialchars($value);
echo " $name : $value
\n" ;
}
}
?>

dalam skrip, atau anda boleh menetapkan arahan output_buffering dalam fail php.ini atau fail konfigurasi pelayan.

Komen:

Kenyataan umum:

  • Kuki hanya akan kelihatan selepas memuatkan semula halaman yang sepatutnya kelihatan. Untuk menyemak sama ada kuki telah ditetapkan dengan betul, semaknya apabila anda memuatkan halaman seterusnya sebelum tamat tempoh. Tarikh tamat tempoh kuki ditentukan dalam parameter tamat tempoh. Adalah mudah untuk menyemak kewujudan kuki dengan panggilan mudah print_r($_COOKIE);.
  • Apabila memadamkan kuki, tetapan yang sama mesti dinyatakan seperti semasa memasangnya. Jika anda menetapkan nilai kepada rentetan kosong atau SALAH, dan tetapkan parameter yang tinggal mengikut panggilan sebelumnya yang menetapkan kuki, maka kuki dengan nama yang diberikan akan dipadamkan daripada mesin klien. Secara dalaman, ia kelihatan seperti ini: kuki ditetapkan kepada "dipadamkan" dan tarikh tamat tempoh dipindahkan semula setahun.
  • Sejak menetapkan nilai SALAH akan memadamkan kuki, anda tidak seharusnya menetapkan kuki kepada nilai boolean. Sebaliknya anda boleh menggunakan 0 Untuk SALAH Dan 1 Untuk BENAR.
  • Kuki boleh dinamakan seperti tatasusunan, dan ia akan tersedia dalam skrip PHP sebagai tatasusunan, tetapi pada mesin pengguna ia akan disimpan sebagai rekod berasingan. Untuk menetapkan kuki dengan berbilang nama dan nilai, adalah dinasihatkan untuk menggunakan fungsi tersebut meletup(). Ia tidak disyorkan untuk menggunakan fungsi untuk tujuan ini bersiri(), kerana ini menjejaskan keselamatan skrip secara negatif.

Untuk berbilang panggilan setcookie() fungsi dilaksanakan mengikut susunan di mana ia dipanggil.



Tetapkan (padam) kuki, tetapkan kuki, hantar kuki. PHP

Kuki ialah mekanisme untuk menyimpan data dalam penyemak imbas jauh dan menjejak serta mengenal pasti pengguna yang menggunakannya. Maksudnya, kuki ialah sebarang maklumat yang disimpan dalam penyemak imbas pengguna yang diperlukan untuk pengguna berinteraksi dengan tapak tertentu.

Bagaimana untuk menetapkan kuki menggunakan PHP?

Marilah kita segera ambil perhatian bahawa tetapkan kuki anda boleh sama ada untuk tempoh tertentu, contohnya selama 2 jam, atau tanpa had masa, maka kuki akan dipadamkan secara automatik selepas menutup pelayar.

Dalam php kuki ditetapkan menggunakan fungsi setcookie().

biskut

mesti

dihantar

sebelum mana-mana pengepala lain (ini adalah sekatan kuki, bukan PHP). Ini memerlukan anda membuat panggilan ke fungsi ini sebelum tag atau

Menetapkan kuki

sebelum menutup penyemak imbas, tulis yang berikut pada halaman
setcookie("_ws_","ujian",0,"/");
// "/" - jika skrip berada dalam folder lain
// kuki masih akan ditulis seperti ini www.sdws.ru
?>

Bagaimana untuk menetapkan kuki untuk masa, untuk sehari, untuk beberapa minit, selama berjam-jam?

Dalam php algoritma adalah sangat mudah
// tetapkan kuki
setcookie("_ws_","ujian",masa()+3600,"/");
?> masa()+3600- tetapkan kuki selama satu jam (3600 saat).
Sebagai contoh, kita perlukan hantar kuki pada 23 hari
// tetapkan kuki
setcookie("_ws_","test",time()+1987200,"/");
?>

Memadamkan kuki. Bagaimana hendak memadam kuki?

Memadamkan kuki berlaku menggunakan fungsi yang sama setcookie(). Kami menetapkan parameter yang sama, hanya dengan tanda tolak
setcookie("_ws_","ujian",masa()-3600,"/");
?> Topik yang sama: