Menga tizimga kirish funksiyasini saqlab qolishga imkon beruvchi xavfsiz PHP login tizimini qanday yaratish mumkin?

Men SESSION varslariga asoslangan oddiy kirish tizimidan foydalanaman. Foydalanuvchi tizimga kirgandan so'ng, mening skriptimga foydalanuvchi qabul qilinishi kerakligini bildiruvchi var sessiyasi o'rnatiladi. Men har qanday maxsus mijoz cookie varidan foydalanmayman.

Kirish ekranida "kun davomida tizimga kirishimni saqlab qoling" degan variantni taklif qilmoqchiman. Buni qanday qilib xavfsiz tarzda qilish mumkin?


person pixeline    schedule 18.12.2009    source manba


Javoblar (3)


Birinchidan: session.cookie_lifetime direktivasini sozlang. php.ini, konfiguratsiya fayllari yoki session_set_cookie_params() orqali.

Keyin, foydalanuvchi nomini va parolning xesh qiymatini sessiyada saqlang va har bir sahifada ushbu kirishni tasdiqlang. U hali ham amalda bo'lsa, ular tizimga kirishlari mumkin.

Seans cookie-faylining tabiiy tugashi odatda narsalarni tartibli saqlashi kerak, chunki seans o'rtasida hech kim tizimdan chiqmaydi (albatta, agar yulduzlar unga moslangan bo'lsa), agar ular faol bo'lsa. Agar bu bajarilmasa, men eCartoth-ning yechimini yaqin soniya deb hisoblayman, chunki if iborasiga ikkinchi qatorni qo'shishingiz mumkin:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

EDIT: Siz ko'rib chiqishingiz mumkin bo'lgan narsa - bu seansni tuzatish va/yoki sessiyani o'g'irlash. Buning oldini olish uchun men ikkita echimdan birini (yoki ikkalasini) tavsiya qilaman:

  1. foydalanuvchining IP manzilini sessiyada saqlang
  2. har bir muvaffaqiyatli kirish urinishidan keyin session_regenerate_id() dan foydalaning.
person Dereleased    schedule 18.12.2009
comment
SESSIONLAR dan foydalanish yaxshi xavfsizlik tizimini boshlashning yagona yo'li, +1 - person TravisO; 18.12.2009
comment
oxirgi tahriringizni tushuntira olasizmi: nima uchun foydalanuvchining IP manzilini saqlash va sessiya identifikatorini qayta tiklash kerak? - person pixeline; 28.12.2009
comment
PHP seans identifikatorini (masalan, Query String) belgilash uchun bir nechta mexanizmlarni qabul qiladi, bu kimgadir oldindan belgilangan seans identifikatorini o'rnatishga, uni url orqali shubhasiz jabrlanuvchiga yuborishga imkon beradi va zararli foydalanuvchi tizimga kirgandan so'ng, xuddi shu seansdan foydalanishi mumkin. Seansda saqlanadigan qonuniy foydalanuvchining kirish ma'lumotlarini soxtalashtirish uchun ID. Har bir so'rov bo'yicha IP-ni saqlash va/yoki sessiya identifikatorini qayta tiklash orqali zararli foydalanuvchining o'rnatilgan seans identifikatori, aslida, foydasiz bo'ladi. Qo'shimcha ma'lumot uchun buni o'qing: en.wikipedia.org/wiki/Session_fixation - person Dereleased; 28.12.2009
comment
Seansning haqiqiyligini har safar ma'lumotlar bazasi bilan tekshirish dasturning ishlashini pasaytirishi mumkin, chunki bu holda biz har safar ma'lumotlar bazasiga 1-2 so'rov yuboramiz. Yoki bu yo'l va mashhur veb-saytlarning aksariyati ushbu kontseptsiyada ishlaydi? - person Prashant; 23.02.2011
comment
ikkinchi nuqtangiz har bir muvaffaqiyatli kirish urinishidan keyin session_regenerate_id() dan foydalaning. shart. Bundan tashqari, umumiy serverda seansni ma'lumotlar bazasida saqlashingiz mumkinligini yodda tutishimiz kerak, chunki seans cookie-fayllari ba'zi sabablarga ko'ra serverda tekis fayllar sifatida saqlanadi! - person ; 17.07.2011
comment
@Abhishek - Umumiy xostlar haqida juda muhim nuqta. Yana bir tasodifiy ma'lumot, agar siz seansni boshqarish uchun sinfdan foydalansangiz, __destruct() funksiyangizda write_close usuliga qo'ng'iroq qilganingizga ishonch hosil qilishingiz kerak yoki seans saqlanishidan oldin ob'ekt axlat yig'ish orqali yo'q qilinishi mumkin. - person Dereleased; 18.07.2011

"Meni kun bo'yi tizimga kiritib qo'ying" deganingizda, siz faqat ma'lum bir mashinani nazarda tutyapsiz deb o'ylayman, to'g'rimi? MySQL jadvalidan "kirish vaqtini" eslab qolish uchun foydalanishingiz mumkin yoki agar ular kun bo'yi tizimga kirishni tanlasa, bu login endi haqiqiy emasligi haqidagi vaqt tamg'asidan foydalanishingiz mumkin. Keyin kodingizning boshiga o'sha foydalanuvchining identifikatorini sessiya parametrlaridan oladigan ba'zi skript qo'shing. O‘sha foydalanuvchining joriy vaqt tamg‘asini saqlangan “so‘nggi amaldagi ts” bilan solishtiring va agar o‘sha vaqt o‘tgan bo‘lsa, ular tizimdan chiqishlari kerakligini bilasiz, shu nuqtada sessiyani o‘chirib tashlab, foydalanuvchini qayta kirishga majbur qilasiz. Bu usul shuni anglatadiki, ular o'sha vaqtdan keyin biror narsa qilishga urinmaguncha tizimdan chiqmaydilar, lekin ular uchun shunday bo'lib tuyuladi. Bundan tashqari, MySQL ma'lumotlar bazasidan foydalanish o'rniga, oxirgi joriy TSni ham sessiya o'zgaruvchisida saqlashingiz mumkin.

Masalan, foydalanuvchi birinchi marta "Kun davomida tizimga kirishimni tanlagan holda" bilan tizimga kirganda:

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

Keyin tizimingizda har safar sahifaga kirishda:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}
person eCaroth    schedule 18.12.2009
comment
Shuni eslatib o'tishni unutdingizmi, buni sessiya parametrlari bilan amalga oshirish orqali siz ma'lum bir mashinaga kirishni cheklaysiz va sessiya o'zgaruvchilari mijoz tomonidan hech qanday tarzda mavjud bo'lmagani uchun siz ushbu ma'lumotlar sizning nazoratingizdan tashqarida o'zgartirilishidan xavotirlanmaysiz. - person eCaroth; 18.12.2009
comment
sizning mantiqingiz bilan bog'liq muammo shundaki, sessiya parametrlari bir kun davom etishi uchun sozlanmasligi kerak! Shunday qilib, ular haqiqiy 24 soatdan oldin tugaydi - bu foydalanuvchini qayta tizimga kirishga majbur qiladi. - person pixeline; 18.12.2009
comment
Keyin foydalanuvchilar mashinasiga cookie faylini o'rnating, ularning ismlari o'sha kunning oxirida tugaydi. Yozuvni MySQL jadvalida o'z nomi va IP manzili bilan saqlang va agar ular ushbu IP dan ilovaga kirsa va vaqt tamg'asi hali ham amalda bo'lsa, ularni qayta kirishga majburlashiga ruxsat bering. - person eCaroth; 18.12.2009
comment
@pixeline: mantiqingiz bilan bog'liq muammo shundaki, cookie/sessiyaning kutish vaqti sozlanishi. - person Dereleased; 18.12.2009
comment
uh, men shuni nazarda tutdim: men butun server uchun server seansining tugash vaqtini o'zgartirishni xohlamayman, faqat mening ilovam uchun. Lekin sizning javobingiz istiqbolli ko'rinadi. men unga qarayman. - person pixeline; 18.12.2009

Variantlardan biri seans o'zgaruvchilarini saqlaydigan va ularni IP manzillari va amal qilish muddati bilan bog'laydigan MySQL jadvalini o'rnatish bo'lishi mumkin, ammo bu qanday amalga oshirilishi haqida barcha tafsilotlarga ishonchim komil emas.

Siz qidirayotgan narsani qilishning eng oddiy (tavsiya etilmaydi) yo'li kompyuterda foydalanuvchi nomi va parol bilan $_COOKIE ni o'rnatish bo'ladi, keyin foydalanuvchi tizimga kirganida saytingiz buni tekshiradi. .

Qo'shimcha xavfsizlik uchun potentsial xakerga foydalanuvchi hisobi ma'lumotlari haqida kamroq ma'lumot berish uchun foydalanuvchi ma'lumotlarining tuzlangan MD5 xesh sifatida faqat bitta cookie faylini saqlasangiz yaxshi bo'lardi. Davomiylik cookie faylini o'rnatganingizda o'rnatilishi mumkin; php.netda buni qanday amalga oshirish bo‘yicha yetarlicha to‘liq hujjatlar mavjud.

person Kaji    schedule 18.12.2009
comment
Iltimos, foydalanuvchi parolini cookie fayliga kiritmang - person Simon; 18.12.2009
comment
Rozi bo'ldim, shuning uchun men unga amal qildim. Men birinchi navbatda foydalanuvchi parolini saqlash uchun foydalanadigan bir xil turdagi xeshdan foydalanishni qat'iy tavsiya qilaman, chunki bu deyarli yomon bo'lardi. Uni turli xil noyob ma'lumotlarga asoslang yoki hech bo'lmaganda buning uchun boshqa tuzdan foydalaning. - person Kaji; 18.12.2009