Пайдаланушыларды дұрыс тіркеу php. PHP және MySQL-де қарапайым қолданушыларды тіркеу жүйесін құру

Бүгін біз қазан айының соңында Интернетте жарылған танымал CMS Joomla-дағы 1 күндік маңызды осалдықты пайдалануды қарастырамыз. Біз CVE-2016-8869, CVE-2016-8870 және CVE-2016-9081 нөмірлері бар осалдықтар туралы айтатын боламыз. Үшеуі де бес жыл бойы рамканың тереңдігінде тұрып, қанатында күткен бір код бөлігінен шыққан, содан кейін босатып, хаос, бұзылған сайттар мен осы Joomla-ның бейкүнә қолданушыларының көз жасын әкеледі. Мониторлардың жарығынан көздері қызарған, пернетақталары нан үгінділеріне толы ең батыл және батыл әзірлеушілер ғана құтырған зұлым рухтарға қарсы тұра алды және түзетулер құрбандық үстеліне бастарын қойды.

ЕСКЕРТУ Барлық ақпарат тек ақпараттық мақсатта берілген. Редакторлар да, автор да осы мақаланың материалдары келтірген ықтимал зиян үшін жауапты емес. Бәрі қайдан басталды

2016 жылдың 6 қазанында Демис Пальма Stack Exchange сайтында тақырып құрды, онда ол былай деп сұрады: Joomla 3.6 нұсқасында неге аттас register() пайдаланушыларды тіркеудің екі әдісі бар? Біріншісі UsersControllerRegistration контроллерінде, екіншісі UsersControllerUser контроллерінде. Дамис UsersControllerUser::register() әдісі бір жерде қолданылғанын немесе ескі логикадан қалған эволюциялық анахронизм екенін білгісі келді. Оның алаңдаушылығы бұл әдіс кез келген көріністе пайдаланылмаса да, оны құрастырылған сұрау арқылы шақыруға болады. Оған мен итоктопус лақап атымен әзірлеушіден жауап алдым, ол растады: мәселе шынымен бар. Және Joomla әзірлеушілеріне есеп жіберді.

Содан кейін оқиғалар ең жылдам дамыды. 18 қазанда Joomla әзірлеушілері сол кезде пайдаланушыны тіркеуге мүмкіндік беретін PoC жобасын жасаған Дамистің есебін қабылдады. Ол өзінің веб-сайтында жазба жариялады, онда ол тапқан проблема туралы және осы мәселе бойынша өз ойлары туралы жалпылама түрде айтты. Сол күні әлі де осал кодты қамтитын Joomla 3.6.3 жаңа нұсқасы шығарылды.

Осыдан кейін Давиде Тампеллини қатені қарапайым пайдаланушыны емес, әкімшіні тіркеу нүктесіне айналдырады. 21 қазанда Joomla қауіпсіздік тобына жаңа іс келді. Бұл қазірдің өзінде артықшылықтарды арттыру туралы айтады. Сол күні Joomla веб-сайтында сейсенбі, 25 қазанда жүйелік ядродағы маңызды осалдықты түзететін 3.6.3 сериялық нөмірі бар келесі нұсқасы шығарылатыны туралы хабарландыру пайда болады.

25 қазан Joomla Security Strike Team Damis ашқан код бөлігімен жасалған соңғы мәселені тапты. Содан кейін 21 қазандағы түсініксіз атымен Prepare 3.6.4 Stable Release жазбасы өкінішті қатені түзететін ресми Joomla репозиторийінің негізгі тармағына жіберіледі.

Бұл шыққаннан кейін көптеген қызығушылық танытқан адамдар әзірлеушілер қауымдастығына қосылады - олар осалдықты насихаттайды және эксплойттарды дайындайды.

27 қазанда зерттеуші Гарри Робертс Xiphos Research репозиторийіне PHP файлын осал CMS серверіне жүктей алатын дайын эксплойтты жүктейді.

Егжей

Ал, фон аяқталды, ең қызықты бөлікке - осалдықты талдауға көшейік. Мен Joomla 3.6.3 нұсқасын сынақ нұсқасы ретінде орнаттым, сондықтан барлық жол нөмірлері осы нұсқаға қатысты болады. Төменде көретін файлдарға апаратын барлық жолдар орнатылған CMS түбіріне қатысты көрсетіледі.

Damis Palma ашқан жаңалығының арқасында біз жүйеде пайдаланушыларды тіркеуді жүзеге асыратын екі әдіс бар екенін білеміз. Біріншісі CMS арқылы пайдаланылады және /components/com_users/controllers/registration.php:108 файлында орналасқан. Екіншісі (бізге қоңырау шалу керек) /components/com_users/controllers/user.php:293 ішінде тұрады. Оны толығырақ қарастырайық.

286: /** 287: * Пайдаланушыны тіркеу әдісі. 288: * 289: * @return логикалық 290: * 291: * @1.6 бастап 292: */ 293: жалпы функция тіркелімі() 294: (295: JSession::checkToken("post") немесе jexit(JText::_) ("JINVALID_TOKEN")); ... 300: // 301 пішін деректерін алу: $this->input->post->get("user", array(), "array"); 315: $return = $model->validate($form, $data 316: 317: // Қателерді тексеріңіз: if ($return === false) 319: ( ... 345: / /). Тіркеуді аяқтаңыз 346: $return = $model->register($data);

Мұнда мен тек қызықты жолдарды қалдырдым. Осал әдістің толық нұсқасын Joomla репозиторийінде көруге болады.

Қалыпты пайдаланушыны тіркеу кезінде не болатынын анықтайық: қандай деректер жіберіледі және олар қалай өңделеді. Пайдаланушыны тіркеу параметрлерде қосылса, пішінді http://joomla.local/index.php/component/users/?view=registration сайтынан табуға болады.


Заңды пайдаланушыны тіркеу сұрауы келесі скриншотқа ұқсайды.


com_users компоненті пайдаланушылармен жұмыс істеуге жауапты. Сұраудағы тапсырма параметріне назар аударыңыз. Оның $controller.$method пішімі бар. Файл құрылымын қарастырайық.

Контроллерлер қалтасындағы сценарийлердің атаулары шақырылатын контроллерлердің атауларына сәйкес келеді. Біздің сұрауымызда қазір $controller = "registration" болғандықтан, register.php файлы және оның register() әдісі шақырылады.

Назар аударыңыз, сұрақ: тіркеуді өңдеуді кодтың осал жеріне қалай ауыстыруға болады? Сіз оны әлдеқашан болжаған шығарсыз. Осал және нақты әдістердің атаулары бірдей (тізілім), сондықтан бізге тек шақырылатын контроллердің атын өзгерту керек. Біздің осал контроллер қайда орналасқан? Бұл дұрыс, user.php файлында. $controller = "user" болып шықты. Барлығын біріктіріп тапсырма = user.register аламыз. Енді тіркеу сұрауы бізге қажетті әдіспен өңделеді.


Бізге қажет екінші нәрсе - деректерді дұрыс пішімде жіберу. Мұнда бәрі қарапайым. Legitimate register() бізден jform деп аталатын массив күтеді, онда біз тіркеу деректерін – аты, логин, құпия сөз, электрондық поштаны жібереміз (сұраныспен скриншотты қараңыз).

  • /components/com_users/controllers/registration.php: 124: // Пайдаланушы деректерін алыңыз. 125: $requestData = $this->input->post->get("jform", array(), "array");

Біздің клиент бұл деректерді пайдаланушы деп аталатын массивтен алады.

  • /components/com_users/controllers/user.php: 301: // Пішін деректерін алыңыз. 302: $деректер = $this->input->post->get("пайдаланушы", массив(), "массив");

Сондықтан, сұраудағы барлық параметрлердің атауларын j-дан user-ге өзгертеміз.

Біздің үшінші қадамымыз - жарамды CSRF таңбалауышын табу, өйткені онсыз тіркеу болмайды.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("жазба") немесе jexit(JText::_("JINVALID_TOKEN"));

Ол MD5 хэшіне ұқсайды және оны, мысалы, /index.php/component/users/?view=login сайтындағы авторизация пішінінен алуға болады.


Енді сіз қалаған әдісті пайдаланып пайдаланушыларды жасай аласыз. Егер бәрі жұмыс істесе, құттықтаймыз - сіз жай ғана CVE-2016-8870 «жаңа пайдаланушыларды тіркеуге рұқсатты тексерудің болмауы» осалдығын пайдаландыңыз.

UsersControllerRegistration контроллерінің «жұмыс істейтін» регистр() әдісінде ол келесідей көрінеді:

  • /components/com_users/controllers/registration.php: 113: // Тіркеу өшірілсе - кіру бетіне қайта бағыттау. 114: егер (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=" логин", false)); 117: 118: қайтару жалған; 119: )

Сонымен осал жерлерде:

  • /components/com_users/controllers/user.php:

Иә, мүмкін емес.

Екінші, әлдеқайда күрделі мәселені түсіну үшін біз жасаған сұранысты жіберіп, кодтың әртүрлі бөліктерінде оның қалай орындалатынын көрейік. Міне жұмысшы әдісінде пайдаланушы жіберген деректерді тексеруге жауапты бөлік:

Жалғасы тек мүшелерге ғана қолжетімді 1-нұсқа. Сайттағы барлық материалдарды оқу үшін «сайт» қауымдастығына қосылыңыз

Белгіленген мерзімде қауымдастыққа мүше болу сізге БАРЛЫҚ Hacker материалдарына қол жеткізуге мүмкіндік береді, жеке жинақталған жеңілдіктеріңізді арттырады және кәсіби Xakep Score рейтингін жинауға мүмкіндік береді!

Веб-сайттардың көпшілігінде пайдаланушылар тіркелу үшін тіркелу пішіні бар және осылайша сайтта қандай да бір артықшылықтар пайда болуы мүмкін. Бұл мақалада біз PHP және MySQL тілдерінде тіркеу формасын қалай жасау керектігін көреміз.

Біз қарапайым тегтерді қолданамыз, сонымен қатар Sign-Up.html веб-бетін жобалау үшін кесте тегін қолданамыз. Бастайық:

1-листинг: sign-up.html

Тіркеу формасы

Аты
Электрондық пошта
Пайдаланушы аты
Құпия сөз
Құпия сөзді Растау


1-сурет:

sing-in.html веб-бетінің сипаттамасы:

1-суретте көріп отырғаныңыздай, Тіркеу формасы бар және ол пайдаланушы туралы аз мәліметтерді сұрайды. Бұл кез келген веб-сайт пайдаланушылардан немесе келушілерден идентификатор мен құпия сөз жасауды сұрайтын жалпы деректер. Біз кесте тегін веб-беттегі пішін өрістерін 1-суретте көріп тұрғандай реттелген пішінде көрсету үшін пайдаландық. Бұл өте қарапайым, өйткені біз әлі CSS мәнерін қолданбаған едік, енді CSS мәнерлерін қолданып, оларды байланыстырайық. sing-up.html веб-бетімен CSS мәнері файлы.

Листинг 2: style.css

/*Тіркелу веб-бетіне арналған CSS файлы*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ; background-repeat:no-position:center margin-bottom: 450px; font-weight:bold; font-size:20px;

3-листинг: style.css файлын sign-up.html веб-бетімен байланыстырыңыз



2-сурет:

style.css файлының сипаттамасы:

Сыртқы CSS файлында біз сіз үшін жаңа болып көрінетін кейбір стильдерді қолдандық. Біз суретті фондық режимде қолданып, оны веб-беттің ортасына орнатқандықтан. Бұл html div тегінің көмегімен пайдалану оңай болды. Біз үш div тег идентификаторын пайдаландық. #button, #sing-up және #body-color және біз оларға барлық CSS мәнерлерін қолдандық, енді сіз 2-суретте оның қаншалықты әдемі және тартымды көрінетінін көре аласыз. Сіз 2D және 3D CSS мәнерлері сияқты көптеген басқа CSS мәнерлерін пайдалана аласыз. Ол қазіргіден әдемірек көрінеді.

Осы қарапайым жұмыстардан кейін біз жаңа пайдаланушылардың дерекқорында барлық деректерді сақтау үшін мәліметтер базасын және кестені жасаймыз. Кестені құруға кіріспес бұрын біз пайдаланушыдан не талап ететінін білуіміз керек. Пішінді құрастырған кезде біз кестені тіркеу формасына сәйкес жасаймыз, оны 1 және 2-суретте көруге болады.

Листинг 3: MySQL жүйесіндегі кестеге сұрау

КЕСТЕ ЖАСАУ Веб-сайтпайдаланушылар (userID int(9) NULL ЕМЕС auto_increment, толық аты VARCHAR(50) NULL ЕМЕС, пайдаланушы аты VARCHAR(40) NULL ЕМЕС, электрондық пошта VARCHAR(40) NULL ЕМЕС, VARCHAR(40) NULL ЕМЕС, БАСТАУЫ КҮЙСЕ(user) );

3-листингтің сипаттамасы:

Бір нәрсені білуіңіз керек, егер сізде бұл сұрауды пайдалану үшін MySQL мүмкіндігі болмаса, менің алдыңғы мақаламды орындаңыз. осы сілтемеден сіз орнату мен талаптарды түсіне аласыз. Және оны қалай пайдалана аламыз.

3-ші листингте біз тіркеу формасына қажет нәрселердің барлығын қолдандық. Электрондық пошта, Толық аты, құпия сөз және пайдаланушы аты айнымалылары болғандықтан. Бұл айнымалылар пайдаланушының деректерін сақтайды, ол оны қосу үшін 2-суреттегі тіркеу формасына енгізеді.

Осы жұмыстардың барлығынан кейін біз серверлік бағдарламалау тілі болып табылатын PHP бағдарламалаумен жұмыс істейміз. Сондықтан мәліметтер қорымен байланыс құру қажет.

Листинг 4: Дерекқорға қосылу

4-листингтің сипаттамасы:

Біз дерекқор мен веб-беттер арасында байланыс орнаттық. Бірақ егер сіз оның жұмыс істеп тұрғанын немесе жұмыс істемейтінін білмесеңіз, ол үшін соңғы 5 тексеру тізімінде тағы бір нәрсені пайдаланасыз.

Листинг 5: дерекқор қосылымының қосылымын тексеру

Сипаттама 5 тізім:

5-тізімде мен сізге дерекқор мен PHP арасындағы байланысты тексеруге және растауға болатынын көрсетуге тырыстым. Тағы бір нәрсе, біз 5 Listing кодын біздің веб-сайтымызда қолданбаймыз. Өйткені бұл MySQL қосылымын қалай тексеруге болатынын түсіну үшін ғана.

Енді біз алдымен пайдаланушының қолжетімділігін тексеру үшін PHP бағдарламалау қосымшасын жазамыз, содан кейін ол веб-бетте жаңа пайдаланушы болса, оны сақтаймыз.

Листинг 6 : connectivity-sign-up.php

connectivity-sign-up.php сипаттамасы

Бұл PHP қолданбасында мен веб-беттерге тіркелу қолданбасын жасаудың ең қарапайым әдісін қолдандым. Көріп отырғаныңыздай, біз алдымен листинг 4 сияқты қосылым жасаймыз. Содан кейін біз екі функцияны қолдандық, бірінші функция SignUP() болып табылады, ол қолданбаның соңғысының if операторы арқылы шақырылады, мұнда бірінші рет тіркелу түймесін басу расталады. түймесі. Егер ол басылса, ол SingUp функциясын шақырады және бұл функция деректерді алу және оларды пайдаланушы атымен және ағымдағы пайдаланушыдан енгізілген электрондық поштамен салыстыру үшін SELECT сұрауын пайдаланады. Егер userName және электрондық пошта дерекқорда бұрыннан бар болса, ол кешірім сұрайды, сіз әлдеқашан тіркелгенсіз

Егер пайдаланушы жаңа болса, оның ағымдағы userName және электрондық пошта идентификаторы дерекқорда жоқ болса, If операторы NewUser() қызметін шақырады, онда ол жаңа пайдаланушының барлық ақпаратын сақтайды. Ал пайдаланушы веб-беттің бір бөлігіне айналады.



3-сурет

3-суретте пайдаланушы дерекқор жазбаларына сәйкес пайдаланушы осы веб-беттің ескі пайдаланушысы болса, тіркелу үшін деректерді енгізуде. Осылайша, веб-бет пайдаланушы жаңа болса, пайдаланушы тіркелгені туралы хабарламаны көрсетеді, сондықтан веб-бет пайдаланушының тіркелуі аяқталды деген хабарды көрсетеді.



4-сурет:

Тіркеу формасына деректерді енгізген кезде (4-сурет), біз тіркеу формасына енгізген пайдаланушы аты мен электрондық поштасына сәйкес дерекқорда қазірдің өзінде бар. Сондықтан жаңа ID және құпия сөзбен тіркелу үшін жаңа пайдаланушы аты мен электрондық пошта мекенжайын қолданып көруіміз керек.



5-сурет

5-суретте ол бізге пайдаланушы аты мен электрондық пошта идентификаторы енгізілген пайдаланушыны растайды. Екеуі де дерекқор жазбаларында жоқ. Енді жаңа идентификатор мен құпия сөз жасалды және пайдаланушы келесі жолы кіру үшін өзінің жаңа идентификаторы мен құпия сөзін пайдалана алады.

Қорытынды:

Бұл мақалада біз тіркелу веб-бетін жасаудың ең қарапайым әдісін білдік. Сондай-ақ біз PHP және MySQL қолданатын болсақ, оның дерекқормен қалай жұмыс істейтінін білдік. Мен сізге веб-бетке тіркелу мүмкіндіктері туралы негізгі білім беруге тырыстым. Оның артқы жағында қалай жұмыс істейді және алдыңғы жағында оның көрінісін қалай өзгертуге болады. Кез келген сұрау үшін тартынбаңыз және түсініктеме беріңіз.

Соңғы рет 2018 жылдың 5 сәуірінде Винси өзгертті.

Пайдаланушыға кіру және тіркеу кез келген CMS қолданбалары үшін негізгі талап болып табылады. Бұл жобаны бастау кезіндегі бастапқы жұмыс. Пайдаланушыға кіру аутентификациясы бар қолданба анонимді кіруді болдырмау арқылы қауіпсіздікті қамтамасыз етеді. Қолданбамызда аутентификацияны қосудың әртүрлі жолдары бар, мысалы, OAuth логинін қосу немесе Бір реттік кіруді (SSO) енгізу және басқа да ұқсас жолдар. Алдыңғы оқулықта біз қалай іске асыруға болатынын, сондай-ақ туралы көрдік.

Бұл мысал кіруді де, тіркеу функцияларын да қамтиды. Мен тіркелген мүшелерді сақтау үшін MySQL дерекқорын қолдандым. Пайдаланушыны тіркеу пайдаланушыдан мәліметтерді алу үшін енгізуді қамтиды. Бұл пішінді жіберген кезде пішін деректері PHP-ге орналастырылады және дерекқорда сақталады. Пайдаланушы құпия сөзі дерекқорға сақтау алдында шифрланады. PHP кодына жарияламас бұрын. Пайдаланушы жарамды тіркелгі деректерімен жүйеге кіргенде, пайдаланушы мен оған әрі қарай жалғастыруға рұқсат етіледі.

Пайдаланушыны тіркеу формасы

Бұл код пайдаланушыға тіркелу пішінін көрсетуге арналған. Пайдаланушы пішінді мәліметтерімен бірге жіберген кезде, пайдаланушы енгізуін тексеру үшін JavaScript функциясы шақырылады. Сәтті тексеруден кейін PHP коды дерекқор кірістіруін орындау үшін жарияланған пішін деректерін оқиды.

Біз күнделікті Интернетте қарайтын көптеген сайттарда барлығында дерлік пайдаланушы тіркелген. Бұл сабақта біз өзіңіздің веб-сайтыңызда іске асыра алатын қарапайым Мүшелік аймағымен аяқталатын пайдаланушыларды басқару негіздерін қарастырамыз.

Бұл сабақ PHP тілін үйренуді жаңадан бастаушыларға арналған, мұнда біз пайдаланушыларды басқару негіздерін қарастырамыз.

1-қадам

Деректер базасында пайдаланушылар кестесін құрайық, онда біз 4 кесте өрістерінде пайдаланушылар туралы ақпаратты сақтаймыз

  • Қолданушының ID
  • Пайдаланушы аты
  • Құпия сөз
  • Электрондық поштаның адресі

Дерекқорды жасау үшін төмендегі SQL сұрауын пайдаланыңыз

`Пайдаланушылар` КЕСТЕСЫН ҚҰРУ (`UserID` INT(25 ) NULL ЕМЕС AUTO_INCREMENT PRIMARY KEY , `Пайдаланушы аты` VARCHAR(65 ) NULL ЕМЕС , `Құпия сөз` VARCHAR(32 ) NULL ЕМЕС , `Электрондық пошта мекенжайы` VARCH NOT25) );

Бұл файл дерекқорға қосылуға жауапты және барлық беттерде көрсетіледі. Код жолдарын толығырақ қарастырайық

session_start();

Бұл функция жаңа пайдаланушы үшін сеансты бастайды, содан кейін біз оған сеанс барысы туралы деректерді сақтаймыз, осылайша біз бұрыннан анықталған пайдаланушыларды тани аламыз.

mysql_connect($dbhost, $dbuser, $dbpass) немесе die("MySQL қатесі: " . mysql_error());

mysql_select_db($dbname) немесе die("MySQL қатесі: " . mysql_error());

Бұл функциялардың әрқайсысы бөлек, бірақ байланысты тапсырмаларды орындайды.

mysql_connect функциясы MySQL дерекқор серверіне қосылады, жақшадағы параметрлер Хост, Пайдаланушы аты, Құпиясөз сәйкес мәндері тағайындалған айнымалылар, егер деректер дұрыс болмаса, ол қате туралы хабарды көрсетеді;

mysql_select_db функциясы біз аты $dbname айнымалысына тағайындалған дерекқорды таңдайды, егер ол дерекқорды таба алмаса, ол қате туралы хабарды көрсетеді;

2-қадам index.php файлын жасаңыз

Біздің беттегі өте маңызды элемент PHP бірінші жолы болып табылады; бұл жол біз жоғарыда жасаған файлды (base.php) қамтиды және ағымдағы файлдағы сол файлдағы кез келген нәрсеге қол жеткізуге мүмкіндік береді. Біз мұны PHP кодының келесі жолымен орындаймыз. index.php деп аталатын файлды жасаңыз және осы кодты жоғарғы жағына қойыңыз.

Жаңа index.php файлын жасаңыз және ең басында келесі кодты қойыңыз

Бұл жол біз жоғарыда жасаған файлды (base.php) қосады, бұл бізге ағымдағы файлдағы сол файлдың кодына қол жеткізуге мүмкіндік береді.

Бұл include() функциясы арқылы орындалады.

Енді біз сыртқы интерфейсті жасаймыз, онда пайдаланушы тіркеу үшін өз деректерін енгізеді, ал егер ол бұрыннан тіркелген болса, деректерді өзгертуге мүмкіндік береді. Бұл оқулық PHP тіліне бағытталғандықтан, біз HTML/CSS кодымен айналыспаймыз, біз CSS стильдер кестесін жасаған кезде сыртқы түрін кейінірек жасаймыз, бірақ әзірге бұл кодты алдыңғы жолдан кейін ғана енгіземіз.

Пайдаланушыны басқару жүйесі PHP кодын осы жерге қойыңыз

Енді PHP бағдарламасына кіріспес бұрын оның жұмыс істеу принципін қарастырайық, ол берілген жағдайда экранда көрсетілуі керек:

  • Егер пайдаланушы жүйеге кірген болса, біз тіркеу алдында жасырылған әртүрлі опциялары бар бетті көрсетеміз.
  • Егер пайдаланушы әлі жүйеге кірмеген болса, бірақ тіркелген болса, біз логин мен парольді енгізуге арналған пішінді көрсетеміз.
  • 1 және 2 қадамдар орындалмаса, біз тіркеу формасын көрсетеміз.
  • Ол келесідей болады:



    Қатысты басылымдар