Fomu ya idhini ya PHP iliyo tayari. Kuunda Mfumo Rahisi wa Usajili katika PHP na MySQL

Ninakuletea hati rahisi sana na ya kufanya kazi kwa usajili na idhini kwenye wavuti, ambayo ina faili 3 za PHP na unganisho la maandishi 2 ya java, kwa msaada wa makosa ambayo yanaonyeshwa kwenye fomu yenyewe bila kupakia tena ukurasa.

Hati imejaribiwa kwa ufanisi kwenye PHP 5.3.3 na PHP 5.6.3

Nini hati inaweza kufanya na inayo

  • Sajili watumiaji wapya;
  • Kuidhinisha watumiaji na kurekodi vidakuzi kwa muda fulani (hakuna haja ya kuingia kila wakati);
  • Onyesha na ufiche taarifa fulani kwa watumiaji walioidhinishwa na wasioidhinishwa, mtawalia;
  • Ina ADMIN ANEL ambapo unaweza kuhariri data yote na kufuta watumiaji.

DEMO na Paneli za Wasimamizi pia zipo

HATUA YA 1.
Ikiwa unatumia usajili wa ndani na hati ya uidhinishaji kwa kutumia DENWER, basi huhitaji kufanya mabadiliko kwenye faili ili kuunganisha kwenye hifadhidata.
Vinginevyo, fungua faili: stayt.php, classes/Auth.class.php na adminka/connect.php, na juu kabisa ubadilishe data ya kuunganisha kwenye hifadhidata na yako.

HATUA YA 2.
Nenda (ikiwa unatumia DENWER) kwa anwani: http://localhost/Tools/phpmyadmin/, ikiwa kwenye kupangisha, kisha bofya Hifadhidata na uunde hifadhidata mpya kwa jina: registr na kulinganisha: utf8_general_ci.
Unaweza, bila shaka, kuweka jina lako mwenyewe, lakini kisha uhakikishe kuibadilisha kwenye faili za kuunganisha kwenye hifadhidata (angalia hatua ya 1).

HATUA YA 3.
Bofya kwenye hifadhidata ya msajili iliyoundwa na kisha kwenye kichupo cha juu cha SQL na kwenye kidirisha cha kuingiza data kinachoonekana, bandika msimbo huu na ubofye Sawa.

TUNZA JEDWALI IKIWA `watumiaji_wangu` (`id` int(11) SI FUPI AUTO_INCREMENT, `jina la mtumiaji` varchar(255) SI BATILI, `majina` varchar(15) SI BATILI, `nenosiri` varchar(255) SI BATILI, `chumvi` varchar(100) SIYO BATILI, UFUNGUO WA MSINGI (`id`)) INJINI=MyISAM DEFAULT CHARSET=utf8;

Wote! Nenda kwa anwani yako kwenye kivinjari, jaribu na ujaribu.

Paneli ya msimamizi

Baada ya kukamilisha angalau usajili mmoja, unaweza kwenda kwenye sehemu ya ADMIN.
Ingia kwenye PANEL YA ADMIN:

Http://your_site.ru/adminka/

Usisahau kuweka folda hii salama na unaweza pia kuipa jina jipya.
Unapofungua Paneli ya Msimamizi, bofya kitufe cha TAFUTA na watumiaji wote waliosajiliwa wataonyeshwa kwako, ambapo unapobofya nambari maalum ya kitambulisho, utaona data ya mtumiaji kwa ajili ya kuhariri.

Unaweza pia kupata mtumiaji haraka kwa barua-pepe yake; ili kufanya hivyo, ingiza tu barua pepe inayojulikana kwenye uwanja wa TAFUTA na ubofye kitufe.
Siofaa kutumia kifungo cha ADD, kwa kuwa mtumiaji huongezwa kwenye mfumo bila nenosiri. Na sijui kwanini waliifanya.

Hiyo yote, ikiwa haifanyi kazi au haijulikani, uliza maswali.


Wakati huo huo, unaweza kujaribu kuuza habari (bidhaa).

Kwa hiyo, kuna kazi - kufanya usajili katika mfumo na uwezekano wa idhini. Jinsi ya kufanya hivyo? Hebu tuanze kwa utaratibu.

Usajili kwenye php

Kila kitu ni rahisi hapa. Ghala la data linaundwa kwa ajili ya watumiaji. Kwa kawaida hii ni jedwali la hifadhidata. Inajumuisha sehemu kama vile kitambulisho, jina la mtumiaji na nenosiri. Sehemu zilizobaki ni za hiari. Unaweza kukusanya barua pepe za watumiaji, anwani zao, IP zinazowezekana, muda wa kufikia mtandao, maneno ya msimbo kutoka kwa kadi za benki, maswali ya usalama...

Kwa ujumla, jambo kuu ni jozi ya kuingia-nenosiri.

Jambo la kwanza muhimu ni kwamba nywila za mtumiaji haziwezi kuhifadhiwa katika maandishi wazi. Hiyo ni, kama maandishi. Haiwezekani kwa sababu ikiwa mtu mwingine atapata ufikiaji wa hifadhidata, atapokea hifadhidata ya nywila za kuingia kwa mtumiaji, ambazo haziwezekani kupenda. Na ikiwa unazingatia kuwa watumiaji wengi wana kuingia sawa na nenosiri kwenye huduma tofauti, hii inaweka data ya kibinafsi na fedha, mawasiliano ya kibinafsi na kila kitu kingine katika hatari.

Nenosiri lazima zihifadhiwe kama heshi. Hashing ni operesheni inayogeuza data asili kuwa aina fulani ya muhtasari wa urefu unaojulikana. Hii ni nzuri kwa sababu waigizaji ni wa kipekee. Hiyo ni, ikiwa tutabadilisha angalau herufi moja katika data ya chanzo, matokeo ya operesheni ya hashing yatageuka kuwa tofauti kabisa, zaidi ya kutambuliwa. Operesheni ya hashing haiwezi kutenduliwa, yaani, haitawezekana kupanua data asili kutoka kwa muhtasari huu. Hivi ndivyo inavyotofautiana na usimbaji fiche.

MySQL na PHP zina kazi sawa ya kawaida na salama ya hashing - md5. Algorithm hii inachukua data na inatoa alama ya vidole.

Kwa hiyo, tunapokea data kutoka kwa mtumiaji, angalia ikiwa ni tupu, ikiwa haina wahusika wowote ambao hatuhitaji (usipunguze watumiaji sana). Na sasa tunatoa ombi kama hili:

WEKA NDANI YA `watumiaji` (`id`,`jina la mtumiaji`,`nenosiri`) THAMANI("",$quoted_jina la mtumiaji,MD5($quoted_password));

Tafadhali kumbuka kuwa nilitaja vijiumbe mahsusi $quoted_ kwa sababu kabla ya kuviingiza kwenye hoja, lazima viepukwe kwa kutumia mysql_real_escape_string() chaguo la kukokotoa. Kwa kuwa kazi hii hutumiwa mara nyingi sana, na imeandikwa kwa muda mrefu sana (Ninapenda wasanifu wa PHP), ninapendekeza kuiweka kwenye ganda lako. Kwa mfano, kama hii:

Nukuu ya kazi($var) ( return mysql_real_escape_string($var); )

Uidhinishaji katika php

Tumeongeza mtumiaji mpya na sasa ameidhinishwa. Tunamchorea fomu ya kuingia-nenosiri na kupata data yake. Nini kinafuata? Baada ya yote, tulipokea nenosiri kwa maandishi wazi, na katika database kuna hash ya nenosiri. Je, nitalazimika kubadilisha nenosiri kuwa heshi na kisha kuzilinganisha? Hapana, unaweza kuifanya rahisi - kwa ombi moja.

CHAGUA * KUTOKA KWA `watumiaji` WAPI `ingia`=$qoted_login NA `password`=MD5($quoted_password);

Hoja ikirudisha mfuatano, itakuwa mfuatano wenye data ya mtumiaji. Ikiwa sivyo, hakuna mtumiaji kama huyo kwenye jedwali. Data ya mtumiaji itakuwa muhimu sana kwetu - inafaa kuipata katika safu shirikishi.

Kumbuka mtumiaji

Sasa tunahitaji kukumbuka kuwa mtumiaji ameidhinishwa na kujua hasa ni nani. Jambo la kwanza linalokuja akilini ni kutumia vidakuzi kwa hili. Hakika, weka kuingia kwa mtumiaji na kitambulisho kwenye vidakuzi na kila wakati ujue ni nani anayeomba ukurasa kwa sasa.

Lakini hii ni mazoea mabaya. Kwa nini? Kwa sababu kidakuzi ni faili ambayo imehifadhiwa kwenye kivinjari cha mtumiaji na data kutoka kwa faili hii hutumwa kwa seva katika kila ombi. Kwanza, hupitishwa kama maandishi, ambayo inamaanisha ni rahisi kukatiza. Pili, hii ni maandishi rahisi yaliyotumwa na mtumiaji. Kwa hiyo, inaweza kuandikwa upya kihalisi. Kwa mfano, ikiwa tunaamua kuhifadhi jina la mtumiaji "Vasya" katika vidakuzi, anaweza kufungua usimamizi wa vidakuzi kwenye kivinjari chake, pata kidakuzi unachotaka na ubadilishe, sema, "Msimamizi". Ni hayo tu. Sasa, kwa kila ombi, tutapokea kuki, ambayo itatuambia jina la mtumiaji la mtumiaji - "Msimamizi".

Kwa hivyo, ni salama zaidi kuhifadhi data zote kwenye seva mahali pasipoweza kufikiwa na wavuti. Katika folda fulani ambayo haiwezi kufikiwa kutoka kwa kivinjari. Data yote kuhusu mtumiaji inapaswa kuandikwa kwenye folda hii na kusoma kutoka hapo kila wakati anapoomba hati. Ili kujua ni mtumiaji gani anamiliki faili ipi ya data, unahitaji kuita faili hiyo jina la kipekee na kutupa jina hili kwenye vidakuzi vya mtumiaji. Kwa hivyo, mtumiaji hataweza kujua jina la faili kwa mtumiaji wa Msimamizi - faili hii inatolewa na mfumo kwenye seva. Na hii hukuruhusu kuburuta nywila katika maandishi wazi kutoka hati hadi hati.

Nilichoeleza ni utaratibu wa kikao. Katika Perl, kwa mfano, kutumia vipindi unahitaji kupakia moduli. Na katika vikao vya PHP vinasaidiwa nje ya boksi. Kwa kweli, unachohitaji kujua ni session_start() kazi na $_SESSION safu. Hii ndiyo yote. Nitakuambia sasa.

Katika kila hati ambapo unaandikia au kusoma kutoka kwa kikao, unahitaji kupiga simu session_start() kazi kabla ya kuchapisha taarifa yoyote. Hii itaanza kikao. Chaguo hili la kukokotoa litaunda faili ya kikao ikiwa haipo au isome ikiwa kidakuzi maalum kilipitishwa kwenye hati.

Ili kuandika data kwa kipindi, unahitaji tu kuiandikia kwa safu $_SESSION. Sasa tunahitaji kukumbuka kitambulisho cha mtumiaji.

$_SESSION["userid"] = $userinfo["id"];

Wote. Sasa, kila wakati mtumiaji anapoomba hati inayotumia vipindi, thamani ya kipengele $_SESSION["usrid"] itapatikana kwako.

Kwa hiyo, wakati mtumiaji aliingia kuingia kwake na nenosiri, tulipokea data yake kutoka kwa hifadhidata, ambayo inathibitisha kwamba mtumiaji kama huyo yuko kwenye hifadhidata yetu, tunamkumbuka kwenye kikao.

Jua ikiwa mtumiaji ameidhinishwa

Kweli, ni rahisi kama kuvuna pears! Sasa kwa kuwa unajua jinsi vipindi hufanya kazi, kujua ikiwa mtumiaji ameidhinishwa ni suala la mstari mmoja. Huyu hapa:

If(isset($_SESSION["userid"])) ( chapisha "mtumiaji ameidhinishwa";)

Ikiwa kitambulisho cha mtumiaji kinafafanuliwa katika kipindi, basi tayari amepitisha idhini. Lakini unawezaje kujua ni mtumiaji gani? Kuingia kwake ni nini? Tarehe ya kuzaliwa? Neno la nambari ya kadi ya benki? Jina la kuzaliwa la mama?

Kweli, ni wazi - fanya swali moja kwa meza ya watumiaji. Pia tunayo kitambulisho cha mtumiaji huyu.

CHAGUA * KUTOKA KWA `users` WAPI `id`=$quoted_userid

Jinsi ya kumtoa mtumiaji na kutoka nje

Naam, ni rahisi sana. Ikiwa tutaamua ikiwa mtumiaji ameidhinishwa na uwepo wa mtumiaji katika kipindi, basi ili kumwondoa tunahitaji kumwondoa hapo. Imefanywa kama hii:

Haijawekwa($_SESSION["userid"]);

Unaweza pia kuua kikao ili tu kuwa na uhakika. Hii itafuta kidakuzi cha mtumiaji na kuharibu faili ya kikao kwenye seva. Katika kesi hii, data zote zitapotea kutoka kwake. Imefanywa kama hii:

Session_destroy();

Ni hayo tu. Ikiwa una maswali yoyote, usisite kuwasiliana nasi. Zaidi ya hayo, unaweza kuwasiliana nami kupitia icq au barua na kuomba usaidizi wa jambo fulani. Mimi huwa sikatai. Ikiwa unahitaji usaidizi mkubwa, ninaweza kukuuliza malipo kidogo. Kwa kuongeza, ninaweza kukufundisha jinsi ya kutengeneza tovuti kwa mbali! Hii ni aina ya kocha na gwiji niliyenaye :) Na kama unataka kupokea masomo na mbinu kama hivyo, bila malipo, jiandikishe kwa RSS ya blogu yangu.

Chapisho hili linafadhiliwa na ibooknet.ru, ambayo hutoa ukarabati wa kompyuta za mkononi kwa bei nzuri. Binafsi, kompyuta yangu ya mkononi iko sawa na natumai sihitaji kuirekebisha. Nakutakia vivyo hivyo.

Reg.ru: vikoa na mwenyeji

Msajili mkubwa na mtoaji mwenyeji nchini Urusi.

Zaidi ya majina ya kikoa milioni 2 katika huduma.

Matangazo, barua ya kikoa, suluhisho za biashara.

Zaidi ya wateja elfu 700 kote ulimwenguni tayari wamefanya chaguo lao.

*Panya juu ili kusitisha kusogeza.

Rudi mbele

Kuunda mfumo rahisi wa usajili wa watumiaji katika PHP na MySQL

Kuunda mfumo wa usajili ni kazi nyingi. Unapaswa kuandika msimbo unaothibitisha anwani za barua pepe, kutuma barua pepe kuthibitisha usajili, na pia kuthibitisha sehemu nyingine za fomu, na mengi zaidi.

Na hata baada ya kuandika haya yote, watumiaji watasita kujiandikisha, kwa sababu ... hii inahitaji juhudi fulani kwa upande wao.

Katika somo hili, tutaunda mfumo rahisi sana wa usajili ambao hauhitaji au kuhifadhi nywila kabisa! Matokeo yake yatakuwa rahisi kurekebisha na kuongeza kwenye tovuti iliyopo ya PHP. Unataka kujua jinsi inavyofanya kazi? Soma hapa chini.



Hivi ndivyo mfumo wetu rahisi sana utafanya kazi:

Tutachanganya fomu ya idhini na usajili. Fomu hii itakuwa na sehemu ya kuingiza barua pepe yako na kitufe cha usajili;
- Wakati wa kujaza shamba na anwani ya barua pepe, kubofya kifungo cha usajili kitaunda rekodi kuhusu mtumiaji mpya, lakini tu ikiwa barua pepe iliyoingia haikupatikana kwenye hifadhidata.

Baada ya hayo, seti ya kipekee ya wahusika (ishara) huundwa, ambayo hutumwa kwa barua pepe iliyotajwa na mtumiaji kwa namna ya kiungo ambacho kitakuwa muhimu kwa dakika 10;
- Kiungo kinampeleka mtumiaji kwenye tovuti yetu. Mfumo huamua kuwepo kwa ishara na kuidhinisha mtumiaji;

Faida za mbinu hii:

Hakuna haja ya kuhifadhi nywila au kuhalalisha sehemu;
- Hakuna haja ya kurejesha nenosiri lako, maswali ya usalama, nk;
- Kuanzia wakati mtumiaji anajisajili/kuingia, unaweza kuwa na uhakika kwamba mtumiaji huyu atakuwa katika eneo lako la ufikiaji (kwamba barua pepe ni kweli);
- Mchakato wa usajili rahisi sana;

Mapungufu:

Usalama wa akaunti ya mtumiaji. Ikiwa mtu anaweza kufikia barua pepe ya mtumiaji, anaweza kuingia.
- Barua pepe si salama na inaweza kuzuiwa. Kumbuka kwamba swali hili pia linafaa katika kesi ambapo nenosiri limesahauliwa na linahitaji kurejeshwa, au katika mfumo wowote wa idhini ambao hautumii HTTPS kwa uhamisho wa data (kuingia / nenosiri);
- Wakati unasanidi seva yako ya barua ipasavyo, kuna uwezekano kwamba barua pepe zilizo na viungo vya uidhinishaji zitaishia kwenye barua taka;

Kwa kulinganisha faida na hasara za mfumo wetu, tunaweza kusema kwamba mfumo una usability wa juu (urahisi wa juu kwa mtumiaji wa mwisho) na, wakati huo huo, una kiashiria cha chini cha usalama.

Kwa hivyo inashauriwa kuitumia kwa usajili kwenye vikao na huduma ambazo hazifanyi kazi na taarifa muhimu.

Jinsi ya kutumia mfumo huu

Iwapo utahitaji tu kutumia mfumo kuidhinisha watumiaji kwenye tovuti yako, na hutaki kuchukua somo hili vipande-vipande, hiki ndicho unachohitaji kufanya:

Unahitaji kupakua vyanzo vilivyoambatanishwa na somo
- Tafuta faili ya tables.sql kwenye kumbukumbu Iingize kwenye hifadhidata yako kwa kutumia chaguo la kuingiza katika phpMyAdmin. Njia mbadala: fungua faili hii kupitia mhariri wa maandishi, nakili swala la SQL na utekeleze;
- Fungua inajumuisha/main.php na ujaze mipangilio ya kuunganisha na hifadhidata yako (taja mtumiaji na nenosiri la kuunganisha na hifadhidata, pamoja na mwenyeji na jina la hifadhidata). Katika faili hiyo hiyo, lazima pia ueleze barua pepe, ambayo itatumika kama anwani ya awali ya ujumbe uliotumwa na mfumo. Baadhi ya wapangishi huzuia barua pepe zinazotoka isipokuwa kama fomu ina anwani halisi ya barua pepe, ambayo iliundwa kutoka kwa paneli dhibiti ya mwenyeji, kwa hivyo toa anwani halisi;
- Pakia index.php zote, faili za protected.php na mali na inajumuisha folda kupitia FTP kwa mwenyeji wako;
- Ongeza nambari iliyo hapa chini kwa kila ukurasa wa PHP ambapo unataka kuonyesha fomu ya kuingia;

Require_once "includes/main.php"; $ mtumiaji = Mtumiaji mpya (); if(!$user->loggedIn())( redirect("index.php"); )
- Tayari!

Kwa wale ambao wana nia ya jinsi yote yanavyofanya kazi, soma hapa chini!

Hatua ya kwanza ni kuandika msimbo wa HTM kwa fomu ya uidhinishaji. Nambari hii iko katika faili ya index.php. Faili hii pia ina msimbo wa PHP ambao hushughulikia data ya fomu na vitendaji vingine muhimu vya mfumo wa kuingia. Unaweza kujifunza zaidi kuhusu hili katika sehemu iliyo hapa chini iliyowekwa kwa ukaguzi wa msimbo wa PHP.

index.php

Mafunzo: Mfumo Rahisi wa Usajili Ukiwa na PHP & MySQL Ingia au Usajili

Weka barua pepe yako hapo juu na tutakutumia
wewe kiungo cha kuingia.

Ingia/Jisajili

Katika sehemu ya kichwa (kati ya tagi) nilijumuisha mitindo kuu (haijashughulikiwa katika mafunzo haya, kwa hivyo unaweza kuziangalia mwenyewe. Vipengee vya folda/css/style.css). Kabla ya lebo ya kufunga, nilijumuisha maktaba ya jQuery na faili ya script.js, ambayo tutaandika na kuchambua hapa chini.


JavaScript

jQuery hufuatilia hali ya kitufe cha "Jisajili/Ingia" kwa kutumia kitendakazi e.preventDefault() na kutuma maombi ya AJAX. Kulingana na majibu ya seva, inaonyesha ujumbe mmoja au mwingine na huamua vitendo zaidi /

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return uongo ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(hii.action, (barua pepe: barua pepe), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder . maandishi(m.message); ) )); $(hati).ajaxStart(function())( form.addClass("loading"); )); $(hati).ajaxComplete(function()) ( fomu. removeClass("loading"); )););

iliongezwa kwenye fomu ili kuonyesha hali ya sasa ya ombi la AJAX (hii iliwezekana shukrani kwa mbinu ajaxStart()) Na ajaxComplete(), ambayo unaweza kupata kuelekea mwisho wa faili).

Darasa hili linaonyesha faili ya GIF iliyohuishwa inayozunguka (kana kwamba inatudokeza kwamba ombi linachakatwa), na pia hufanya kama alama ya kuzuia fomu isiwasilishwe tena (wakati kitufe cha kujiandikisha tayari kimebofya mara moja). Darasa la .loggedIn ni alama nyingine - huwekwa barua pepe ilipotumwa. Bendera hii huzuia mara moja vitendo vyovyote zaidi na fomu.

Schema ya hifadhidata

Mfumo wetu rahisi sana wa kukata miti unatumia jedwali 2 za MySQL (msimbo wa SQL uko kwenye faili ya tables.sql). Ya kwanza huhifadhi data kuhusu akaunti za watumiaji. Ya pili huhifadhi habari kuhusu idadi ya majaribio ya kuingia.


Mpangilio wa jedwali la mtumiaji.

Mfumo hautumii nywila, kama inavyoonekana kwenye mchoro. Juu yake unaweza kuona safu ya ishara iliyo na ishara karibu na safu ya uhalali wa ishara. Ishara imewekwa mara tu mtumiaji anapounganisha kwenye mfumo na kuweka barua pepe yake kutuma ujumbe (zaidi juu ya hili katika block inayofuata). Safu wima ya_uhalali wa tokeni huweka wakati dakika 10 baadaye, baada ya hapo tokeni haitumiki tena.


Ratiba ya jedwali inayohesabu idadi ya majaribio ya uidhinishaji.

Katika jedwali zote mbili, anwani ya IP imehifadhiwa katika fomu iliyochakatwa, kwa kutumia kazi ya ip2long katika uwanja wa nambari ya aina.

Sasa tunaweza kuandika baadhi ya kanuni PHP. Utendaji kuu wa mfumo umepewa darasa la User.class.php, ambalo unaweza kuona hapa chini.

Darasa hili linatumia kikamilifu idorm (hati), maktaba hizi ndio zana za chini kabisa za kufanya kazi na hifadhidata. Inashughulikia ufikiaji wa hifadhidata, utengenezaji wa ishara, na uthibitisho wa ishara. Inatoa kiolesura rahisi kinachorahisisha kuunganisha mfumo wa usajili kwenye tovuti yako ikiwa inatumia PHP.

User.class.php

Mtumiaji wa Hatari( // ORM ya Kibinafsi $orm; /** * Tafuta mtumiaji kwa tokeni. Tokeni halali pekee ndizo zinazokubaliwa kuzingatiwa. Tokeni inatolewa kwa dakika 10 pekee tangu ilipoundwa * @param string $token . Hii ndiyo tunayotafuta tokeni * @return Mtumiaji Rejesha thamani ya chaguo la kukokotoa la Mtumiaji */ utendakazi tuli wa umma findByToken($token)( // pata tokeni kwenye hifadhidata na uhakikishe kuwa muhuri wa saa sahihi umewekwa $result = ORM::for_table("reg_users") ->wapi ("ishara", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) rudisha Mtumiaji mpya($result); ) /** * Idhinisha au umsajili mtumiaji * @param string $email. Anwani ya barua pepe ya mtumiaji * @return User */ utendakazi wa tuli wa umma ingiaOrRegister($email)( // Ikiwa mtumiaji kama huyo tayari ipo, rudisha thamani ya kazi ya Mtumiaji kutoka kwa anwani maalum ya barua pepe iliyohifadhiwa kwenye hifadhidata ikiwa(Mtumiaji::yupo($email))( rudisha Mtumiaji mpya($email); ) // Vinginevyo, tengeneza mtumiaji mpya kwenye hifadhidata. na urejeshe thamani ya Mtumiaji::unda chaguo za kukokotoa kutoka kwa barua pepe maalum ya kurejesha Mtumiaji::create($email ); ) /** * Unda mtumiaji mpya na uhifadhi kwenye hifadhidata * @param string $email. Anwani ya barua pepe ya mtumiaji * @return User */ private static function create($email)( // Andika mtumiaji mpya na urudishe matokeo ya chaguo la kukokotoa la Mtumiaji kutoka kwa maadili haya$$result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); rudisha Mtumiaji mpya($result); ) /** * Angalia kama mtumiaji kama huyo yupo kwenye hifadhidata na urudishe thamani ya Boolean ya tofauti * @param string $email. Anwani ya barua pepe ya mtumiaji * @return boolean */ utendakazi wa tuli wa umma upo($email)( // Je, mtumiaji yuko kwenye hifadhidata? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Unda kipengee kipya cha mtumiaji * @param example $param ORM , id, barua pepe au 0 * @return User */ kazi ya umma __construct($param = null) ( if($param exampleof ORM)( // ukaguzi wa ORM umepita $this->orm = $param; ) vinginevyo if(is_string($param))( // Ukaguzi wa barua pepe umepitishwa $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // thamani ya variable $param ni kupitishwa kwa kitambulisho cha mtumiaji $id = $param; ) vinginevyo if(isset($_SESSION["loginid"]))( // Vinginevyo, angalia kipindi $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Tengeneza tokeni mpya ya idhini ya SHA1, iandike kwenye hifadhidata na kurudisha thamani yake * @return string */ public function generateToken( )( // Tengeneza tokeni kwa mtumiaji aliyeidhinishwa na uihifadhi kwenye hifadhidata $token = sha1($this->email.time().rand(0, 1000000)); // Hifadhi ishara kwenye hifadhidata // Na uweke alama ili iwe halali kwa dakika 10 tu zinazofuata $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(SASA(),"0:10"); $this->orm->save(); kurudi $ ishara; ) /** * Idhinisha mtumiaji * @return void */ public function login())( // Weka alama kwa mtumiaji kama ameingia $_SESSION["loginid"] = $this->orm->id; // Sasisha thamani ya sehemu ya hifadhidata_ya_mwisho $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Vunja kipindi na umtoe mtumiaji nje * @return void */ kuondoka kwa utendaji wa umma ()( $_SESSION = array(); haijawekwa($_SESSION); ) /** * Angalia ikiwa mtumiaji ameingia * @return boolean */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Hukagua kama mtumiaji ni msimamizi * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Tafuta aina ya mtumiaji, inaweza kuwa msimamizi au kawaida * @return string */ public function rank())( ikiwa ($this->orm->rank == 1)( return "administrator" "; ) rudisha "regular"; ) /** * Njia inayokuruhusu kupata taarifa za kibinafsi za mtumiaji kama * sifa za kitu cha Mtumiaji * @ param string $key Jina la mali inayopata ufikiaji * @return mchanganyiko */ kazi ya umma __get($key)( if(isset($this->orm->$key))( return $this->orm-> ufunguo wa $; ) kurudi null; ))

Tokeni huzalishwa kwa kutumia algoriti ya SHA1 na kuhifadhiwa kwenye hifadhidata. Ninatumia kazi za wakati za MySQL kuweka kikomo cha muda cha dakika 10 kwa uhalali wa ishara.

Tokeni inapothibitishwa, tunamwambia kidhibiti moja kwa moja kuwa tunazingatia tu tokeni ambazo muda wake haujaisha, zilizohifadhiwa kwenye safu wima ya_uhalali.

Tafadhali kumbuka kuwa ninatumia njia ya uchawi __pata maktaba ya hati mwishoni mwa faili ili kukatiza ufikiaji wa sifa za kitu cha Mtumiaji.

Shukrani kwa hili, inakuwa rahisi kupata habari iliyohifadhiwa katika hifadhidata kutokana na sifa $user->email, $user->token, n.k. Katika sehemu inayofuata ya msimbo, tutaangalia jinsi ya kutumia madarasa haya kama mfano. .


Ukurasa uliolindwa

Faili nyingine ambayo huhifadhi utendaji muhimu na muhimu ni faili ya functions.php. Kuna kadhaa wanaoitwa wasaidizi - kazi za wasaidizi zinazokuwezesha kuunda msimbo safi na unaoweza kusoma zaidi katika faili nyingine.

kazi.php

Kazi send_email($from, $to, $subject, $message)( // Helper inayotuma barua pepe $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type: text /plain; charset=utf-8" . "\r\n"; $headers .= "Kutoka: ".$from . "\r\n"; rudisha barua($to, $subject, $message, $headers ); ) kitendakazi get_page_url())( // Bainisha URL ya faili ya PHP $url = "http".(tupu($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"]; ikiwa(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) vinginevyo( $url. = $_SERVER["PATH_INFO"]; ) rudisha $url; ) kiwango cha utendaji_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Idadi ya majaribio ya kuingia katika saa iliyopita kwenye anwani hii ya IP $ count_hour = ORM: :for_table("reg_login_attempt") ->wapi("ip", sprintf("%u", ip2long($ip)))) ->where_raw("ts > SUBTIME(SASA(),"1:00 ")") ->hesabu(); // Idadi ya majaribio ya kuingia katika dakika 10 zilizopita kwenye anwani hii ya IP $count_10_min = ORM::for_table("reg_login_attempt") ->wapi("ip", sprintf("%u) ", ip2long($ ip))) ->wapi_mbichi("ts > SUBTIME(SASA(),"0:10") ->hesabu(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Majaribio mengi sana ya kuingia!"); ) ) kiwango cha utendaji_limit_tick($ip, $email)( // Unda rekodi mpya kwenye jedwali hiyo inahesabu idadi ya majaribio ya kuingia $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) )); $login_attempt->save(); ) kitendakazi cha kuelekeza upya($url)( header("Location: $url"); toka; )

Kazi kiwango_kikomo Na tiki_ya_kikomo kufuatilia idadi ya majaribio ya uidhinishaji katika kipindi cha muda kilichopita tangu jaribio la kwanza. Jaribio la kuingia limerekodiwa katika hifadhidata katika safu wima ya reg_login_attempt. Vitendaji hivi huitwa wakati data ya fomu inachakatwa na kuwasilishwa kama unavyoweza kuona kutoka kwa kijisehemu cha msimbo kifuatacho.

Nambari iliyo hapa chini imechukuliwa kutoka kwa faili ya index.php na inashughulikia uwasilishaji wa fomu. Hurejesha jibu la JSON, ambalo nalo huchakatwa na jQuery katika faili ya assets/js/script.js ambayo tuliangalia hapo awali.

index.php

Jaribu( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Toa kichwa cha JSON("Content-aina: application/json");// Je, barua pepe hii ni halali ikiwa (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( tupa Vighairi vipya("Tafadhali weka barua pepe halali."); ) // Angalia. Ndiyo mtumiaji anayeruhusiwa kuingia, je, amezidisha idadi ya miunganisho inayoruhusiwa? (functions.php faili kwa maelezo zaidi) rate_limit($_SERVER["REMOTE_ADDR"]); // Ingia kiwango hiki cha jaribio la kuingia_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Tuma barua pepe kwa mtumiaji $message = ""; $email = $_POST["email"]; $subject = "Kiungo Chako cha Kuingia"; if(!User:: ipo($email) )( $subject = "Asante Kwa Kujisajili!"; $message = "Asante kwa kujiandikisha kwenye tovuti yetu!\n\n"; ) // Jaribio la kuidhinisha au kusajili mtumiaji $user = Mtumiaji ::loginOrRegister($_POST[ "email"]); $message.= "Unaweza kuingia kupitia URL hii:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Kiungo kitaisha muda kiotomatiki baada ya dakika 10."; $matokeo = send_email($fromEmail, $_POST["email"], $somo, $message); if(!$result)( throw new Exception("Kulikuwa na hitilafu katika kutuma barua pepe yako. Tafadhali jaribu tena."); ) die(json_encode("message" => "Asante! Tumetuma\" kiungo kwenye kikasha chako. Angalia folda yako ya barua taka pia."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() ))))

Baada ya kuingia/kujiandikisha kwa mafanikio, nambari iliyo hapo juu itamtumia mtumiaji kiungo cha kuingia. Ishara inapatikana kwa sababu inapitishwa kama kibadilishaji katika kiunga kilichotolewa na njia $_GET na alama ya tkn

index.php

If(isset($_GET["tkn"]))( // Je, ishara hii ni halali kwa idhini? $user = User::findByToken($_GET["tkn"]); if($user)( // Yes , ni. Elekeza upya kwa ukurasa unaolindwa $user->login(); elekeza("protected.php");) // Hapana, tokeni si sahihi. Elekeza upya kwa ukurasa ulio na uidhinishaji/fomu ya kujiandikisha kuelekeza upya("index. php ");)

$user->ingia()

itaunda vigezo muhimu kwa kikao, ili mtumiaji, akiangalia kurasa zinazofuata za tovuti, atabaki kuidhinishwa kila wakati.

Usindikaji wa kazi ya kuondoka kwenye mfumo hupangwa kwa njia sawa.

index.php

If(isset($_GET["logout"]))($user = new User(); if($user->loggedIn())($user->logout();) redirect("index.php") ;)

Wakati wa mwisho wa kanuni, mimi tena kuweka redirect kwa index.php, hivyo parameter ?toka=1 kupitishwa kupitia URL haihitajiki.

Faili yetu ya index.php inahitaji ziada. ulinzi - hatutaki watu ambao wameingia kwenye mfumo kuona fomu ya usajili tena. Kwa madhumuni haya, tunatumia njia $user->loggedIn().

index.php

$ mtumiaji = Mtumiaji mpya (); if($user->loggedIn())( redirect("protected.php");)

Hatimaye, hapa kuna kipande cha msimbo ambacho kinakuwezesha kulinda kurasa za tovuti yako na kuifanya kupatikana tu baada ya idhini.

iliyolindwa.php

// Ili kulinda kila ukurasa kwenye tovuti yako, jumuisha faili kuu.php // na uunde kitu kipya cha Mtumiaji. Hiyo ni jinsi gani ni rahisi! inahitaji_mara moja "inajumuisha/main.php"; $ mtumiaji = Mtumiaji mpya (); if(!$user->loggedIn())( redirect("index.php");)

Baada ya ukaguzi huu, unaweza kuwa na uhakika kwamba mtumiaji aliidhinishwa kwa ufanisi. Unaweza pia kufikia maelezo yaliyohifadhiwa kwenye hifadhidata kwa kutumia sifa za kitu $mtumiaji. Ili kuonyesha barua pepe na hali ya mtumiaji, tumia msimbo huu:

Echo "Barua pepe yako: ".$user->barua pepe; echo "Cheo chako: ".$user->cheo();

Njia cheo() inatumika hapa kwa sababu hifadhidata kawaida huhifadhi nambari (0 kwa mtumiaji wa kawaida, 1 kwa msimamizi) na tunahitaji kubadilisha data hii kuwa hali ambazo ni zao, ambayo ndiyo njia hii inatusaidia.

Ili kumfanya mtumiaji wa kawaida kuwa msimamizi, hariri tu ingizo la mtumiaji kupitia phpMyAdmin (au programu nyingine yoyote inayokuruhusu kudhibiti hifadhidata). Hali ya msimamizi haitoi upendeleo wowote; katika mfano huu, ukurasa utaonyesha kuwa wewe ni msimamizi - na ndivyo hivyo.

Lakini nini cha kufanya na hii kimeachwa kwa hiari yako; unaweza kuandika na kutunga nambari mwenyewe ambayo huweka haki na uwezo fulani kwa wasimamizi.

Tumemaliza!

Tumemalizana na umbo hili rahisi sana la ajabu! Unaweza kuitumia katika tovuti zako za PHP, ni rahisi sana. Unaweza pia kuirekebisha mwenyewe na kuifanya iwe vile unavyotaka.

Nyenzo hiyo ilitayarishwa na Denis Malyshok mahsusi kwa wavuti

P.S. Je, ungependa kuendelea zaidi katika kufahamu PHP na OOP? Zingatia masomo ya kulipia kuhusu vipengele mbalimbali vya ujenzi wa tovuti, ikiwa ni pamoja na kupanga programu katika PHP, na pia kozi ya bila malipo ya kuunda mfumo wako wa CMS katika PHP kuanzia mwanzo kwa kutumia OOP:

Je, ulipenda nyenzo na ungependa kunishukuru?
Shiriki tu na marafiki na wenzako!


Maagizo

Hebu tupange njia rahisi zaidi ya kulinda kurasa kutoka kwa wageni ambao hawajaidhinishwa. Mtoa huduma wa habari kuhusu kama mgeni atakuwa. Kipindi ni analog ya kuki kwenye kivinjari, tofauti pekee ni kwamba hazijaundwa na sisi, lakini kwenye seva. Na hutumiwa kwa kitu kile kile ambacho vidakuzi hutumiwa - kuhifadhi habari mbalimbali kuhusu sisi tunapoenda kwenye ukurasa wa tovuti moja. Tunapofunga kivinjari, seva huharibu kikao hiki, na wakati ujao tunapoingia, huunda mpya. Tunatumia utaratibu huu wa seva kurekodi katika kipindi ikiwa mtumiaji tayari ameidhinishwa au la. Kwa kusoma habari hii, mgeni anapoomba ukurasa, hati ya PHP itafungua ufikiaji wa kurasa zinazolindwa na nenosiri au itakuhimiza kuingiza kuingia na nenosiri.

Hatua ya 1: Unda ukurasa wa kuingia kuingia na . Nambari ya HTML ya fomu ya idhini katika fomu yake rahisi inaweza kuonekana kama hii:

Ingia:

Nenosiri:


Hapa (mwanzoni mwa faili) tutaongeza msimbo wa PHP ambao utaangalia usahihi wa jina la mtumiaji na nenosiri lililowekwa na mgeni. Hapo mwanzo tunaandika:
session_start();
Amri hii itaanzisha kipindi kipya ikiwa bado haijaundwa kwa ajili ya mgeni huyu.
Kisha tutaangalia ikiwa kikao kina tofauti inayoitwa "Jina la mtumiaji" - itahifadhi jina ikiwa mgeni tayari ameidhinishwa. Ikiwa kuna tofauti kama hiyo, tutaelekeza mgeni kwenye ukurasa kuu (index.php) na kumaliza kutekeleza hati hii ya php:
ikiwa($_SESSION["jina la mtumiaji"])(

}
Nambari zingine zote zitatekelezwa tu ikiwa mtumiaji bado hajaingiza kuingia na nenosiri sahihi. Hebu tuonyeshe ni kuingia na nenosiri gani linapaswa kuchukuliwa kuwa sahihi:
$validName = "Mimi ni wangu!";


Kisha tutaangalia ikiwa maadili yaliyotumwa kutoka kwa fomu ni sahihi. Kwa kuwa tulibainisha mbinu ya uhamishaji data ya POST katika fomu, inapaswa kusomwa kutoka kwa tofauti kubwa ya ulimwengu $_POST:

Kichwa ("Eneo: index.php");

}
Hapa msimbo katika braces curly () itatekelezwa kwa kuingia sahihi na maadili ya nenosiri. Katika mstari $_SESSION["userName"] = $validName; Tunaandika mabadiliko katika kipindi na jina "Jina la mtumiaji" lililo na kuingia kwa mtumiaji aliyeidhinishwa sasa. Hii itakuwa alama inayoonyesha kwamba anaweza kufikia kila mahali mradi tu kikao chake cha sasa ni halali.
Na ikiwa data isiyo sahihi itaingizwa kwenye fomu, tutaongeza ujumbe unaofanana:
mwangwi mwingine"
Kuingia au nenosiri sio sahihi!
";
Nambari zote zinazohitajika kuhifadhiwa katika faili inayoitwa login.php itaonekana kama hii:

Nyumbani | Anwani | Msimamizi

Huu ndio ukurasa wa kuingia.
Jina la mtumiaji:
Nenosiri: