Bahay Paggamot ng ngipin Sumulat ng pagpaparehistro sa php. Simpleng sistema ng pagpaparehistro ng user

Sumulat ng pagpaparehistro sa php. Simpleng sistema ng pagpaparehistro ng user

Kamusta! Ngayon ay susubukan naming ipatupad ang pinakasimpleng pagpaparehistro sa site gamit ang PHP + MySQL. Upang gawin ito, dapat na naka-install ang Apache sa iyong computer. Ang prinsipyo ng pagtatrabaho ng aming script ay ipinapakita sa ibaba.

1. Magsimula tayo sa paggawa ng talahanayan ng mga gumagamit sa database. Maglalaman ito ng data ng gumagamit (pag-login at password). Pumunta tayo sa phpmyadmin (kung gumagawa ka ng database sa iyong PC http://localhost/phpmyadmin/). Lumilikha kami ng mga gumagamit ng talahanayan, magkakaroon ito ng 3 mga patlang.

Ginagawa ko ito sa mysql database, maaari mo itong gawin sa ibang database. Susunod, itakda ang mga halaga tulad ng sa figure:

2. Kinakailangan ang koneksyon sa talahanayang ito. Gumawa tayo ng bd.php file. Ang nilalaman nito:

Sa aking kaso, ganito ang hitsura:

I-save ang bd.php .
Malaki! Mayroon kaming isang talahanayan sa database at isang koneksyon dito. Ngayon ay maaari ka nang magsimulang lumikha ng isang pahina kung saan iiwan ng mga user ang kanilang data.

3. Lumikha ng isang reg.php file na may mga nilalaman (lahat ng mga komento sa loob):



Pagpaparehistro


Pagpaparehistro


Ang iyong login:




Ang iyong password:








4. Gumawa ng file na maglalagay ng data sa database at i-save ang user. save_user.php (mga komento sa loob):

5. Ngayon ang aming mga gumagamit ay maaaring magparehistro! Susunod, kailangan mong lumikha ng isang "pinto" para sa mga nakarehistrong user na makapasok sa site. index.php (mga komento sa loob):




Home page


Home page


Ang iyong login:


Ang iyong password:






Magrehistro



OK tapos na ang lahat Ngayon! Ang aralin ay maaaring mayamot, ngunit lubhang kapaki-pakinabang. Ang ideya lamang ng pagpaparehistro ay ipinapakita dito, pagkatapos ay maaari mong pagbutihin ito: magdagdag ng seguridad, disenyo, mga patlang ng data, pag-load ng mga avatar, pag-log out sa iyong account (upang gawin ito, sirain lamang ang mga variable mula sa session gamit ang hindi nakatakdang function) at iba pa. Good luck!

Sinuri ko ang lahat, gumagana ito nang maayos!

Ngayon ay titingnan natin ang pagsasamantala ng isang kritikal na 1-araw na kahinaan sa sikat na CMS Joomla, na sumabog sa Internet sa katapusan ng Oktubre. Pag-uusapan natin ang tungkol sa mga kahinaan na may mga numerong CVE-2016-8869, CVE-2016-8870 at CVE-2016-9081. Lahat ng tatlo ay nagmula sa isang piraso ng code na humina sa kaibuturan ng framework sa loob ng limang mahabang taon, naghihintay sa mga pakpak, para lamang makalaya at magdala ng kaguluhan, mga na-hack na site at ang mga luha ng mga inosenteng gumagamit ng Joomla na ito. Tanging ang pinakamatapang at matapang na mga developer, na ang mga mata ay namumula sa liwanag ng mga monitor, at ang mga keyboard ay puno ng mga mumo ng tinapay, ang nagawang hamunin ang nagngangalit na masasamang espiritu at inihiga ang kanilang mga ulo sa altar ng pag-aayos.

BABALA Ang lahat ng impormasyon ay ibinigay para sa mga layuning pang-impormasyon lamang. Ang mga editor o ang may-akda ay walang pananagutan para sa anumang posibleng pinsalang dulot ng mga materyales ng artikulong ito. Kung saan nagsimula ang lahat

Noong Oktubre 6, 2016, gumawa si Demis Palma ng isang paksa sa Stack Exchange kung saan nagtanong siya: bakit, sa katunayan, sa Joomla version 3.6 mayroong dalawang paraan para sa pagrerehistro ng mga user na may parehong pangalan register()? Ang una ay nasa UsersControllerRegistration controller at ang pangalawa ay nasa UsersControllerUser controller. Nais malaman ni Damis kung ginamit ang paraan ng UsersControllerUser::register() sa isang lugar, o kung isa lamang itong evolutionary anachronism na natitira sa lumang logic. Ang kanyang pag-aalala ay na kahit na ang pamamaraang ito ay hindi ginagamit ng anumang view, maaari itong tawagan ng isang ginawang query. Kung saan nakatanggap ako ng tugon mula sa isang developer sa ilalim ng palayaw na itoctopus, na nagkumpirma: ang problema ay talagang umiiral. At nagpadala ng ulat sa mga developer ng Joomla.

Pagkatapos ang mga kaganapan ay nabuo nang pinakamabilis. Noong Oktubre 18, tinanggap ng mga developer ng Joomla ang ulat mula kay Damis, na noong panahong iyon ay naka-draft na ng PoC na magpapahintulot sa pagpaparehistro ng user. Nag-publish siya ng isang tala sa kanyang website, kung saan nagsalita siya sa mga pangkalahatang tuntunin tungkol sa problemang nakita niya at ang kanyang mga saloobin sa bagay na ito. Sa parehong araw, isang bagong bersyon ng Joomla 3.6.3 ang inilabas, na naglalaman pa rin ng mahinang code.

Pagkatapos nito, iniikot ni Davide Tampellini ang bug hanggang sa punto ng pagpaparehistro hindi isang simpleng user, ngunit isang administrator. At noong Oktubre 21, isang bagong kaso ang dumating sa pangkat ng seguridad ng Joomla. Pinag-uusapan na nito ang tungkol sa pagtaas ng mga pribilehiyo. Sa parehong araw, lumilitaw ang isang anunsyo sa website ng Joomla na sa Martes, Oktubre 25, ang susunod na bersyon na may serial number 3.6.3 ay ilalabas, na nagwawasto sa isang kritikal na kahinaan sa kernel ng system.

Oktubre 25 Nahanap ng Joomla Security Strike Team ang pinakabagong problemang ginawa ng piraso ng code na natuklasan ni Damis. Pagkatapos, ang isang commit na may petsang Oktubre 21 na may hindi kapansin-pansing pangalan na Prepare 3.6.4 Stable Release ay itutulak sa pangunahing sangay ng opisyal na repositoryo ng Joomla, na nag-aayos sa kapus-palad na bug.

Pagkatapos nitong lumabas, maraming interesadong indibidwal ang sumali sa komunidad ng developer - sinimulan nilang i-promote ang kahinaan at maghanda ng mga pagsasamantala.

Noong Oktubre 27, ang mananaliksik na si Harry Roberts ay nag-upload ng handa nang pagsasamantala sa Xiphos Research repository na maaaring mag-upload ng PHP file sa isang server na may mahinang CMS.

Mga Detalye

Well, ang background ay tapos na, lumipat tayo sa pinaka-kagiliw-giliw na bahagi - pagsusuri ng kahinaan. Nag-install ako ng Joomla 3.6.3 bilang isang pagsubok na bersyon, kaya lahat ng mga numero ng linya ay magiging may-katuturan para sa bersyon na ito. At ang lahat ng mga landas sa mga file na makikita mo sa ibaba ay ipahiwatig na may kaugnayan sa ugat ng naka-install na CMS.

Salamat sa pagtuklas ni Damis Palma, alam namin na mayroong dalawang paraan na nagsasagawa ng pagpaparehistro ng user sa system. Ang una ay ginagamit ng CMS at matatagpuan sa file /components/com_users/controllers/registration.php:108. Ang pangalawa (ang kakailanganin nating tawagan) ay nakatira sa /components/com_users/controllers/user.php:293. Tingnan natin ito nang maigi.

286: /** 287: * Paraan para magrehistro ng user. 288: * 289: * @return boolean 290: * 291: * @mula noong 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") o jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Kunin ang data ng form. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Suriin kung may mga error. 318: if ($return === false) 319: ( ... 345: / / Tapusin ang pagpaparehistro 346: $return = $model->register($data);

Dito lamang ako nag-iwan ng mga kawili-wiling linya. Ang buong bersyon ng masusugatan na pamamaraan ay maaaring matingnan sa repositoryo ng Joomla.

Alamin natin kung ano ang nangyayari sa normal na pagpaparehistro ng user: anong data ang ipinapadala at kung paano ito pinoproseso. Kung ang pagpaparehistro ng user ay pinagana sa mga setting, ang form ay makikita sa http://joomla.local/index.php/component/users/?view=registration.


Ang isang lehitimong kahilingan sa pagpaparehistro ng user ay kamukha ng sumusunod na screenshot.


Ang bahagi ng com_users ay responsable para sa pakikipagtulungan sa mga user. Bigyang-pansin ang parameter ng gawain sa kahilingan. Mayroon itong format na $controller.$method . Tingnan natin ang istraktura ng file.

Ang mga pangalan ng mga script sa controllers folder ay tumutugma sa mga pangalan ng tinatawag na controllers. Dahil ang aming kahilingan ay mayroon na ngayong $controller = "registration" , ang registration.php file at ang register() method nito ay tatawagin.

Pansin, tanong: paano ilipat ang pagpoproseso ng pagpaparehistro sa isang mahinang lugar sa code? Malamang nahulaan mo na. Ang mga pangalan ng mga mahina at tunay na pamamaraan ay pareho (magrehistro), kaya kailangan lang nating baguhin ang pangalan ng tinatawag na controller. Saan matatagpuan ang aming vulnerable controller? Tama, sa user.php file. Lumalabas na $controller = "user" . Ang pagsasama-sama ng lahat ay makakakuha tayo ng gawain = user.register . Ngayon ang kahilingan sa pagpaparehistro ay pinoproseso ng paraang kailangan namin.


Ang pangalawang bagay na kailangan nating gawin ay ipadala ang data sa tamang format. Simple lang ang lahat dito. Inaasahan ng lehitimong register() mula sa amin ang isang array na tinatawag na jform , kung saan ipinapasa namin ang data ng pagpaparehistro - pangalan, login, password, email (tingnan ang screenshot kasama ang kahilingan).

  • /components/com_users/controllers/registration.php: 124: // Kunin ang data ng user. 125: $requestData = $this->input->post->get("jform", array(), "array");

Nakukuha ng aming kliyente ang data na ito mula sa isang array na tinatawag na user.

  • /components/com_users/controllers/user.php: 301: // Kunin ang data ng form. 302: $data = $this->input->post->get("user", array(), "array");

Samakatuwid, binago namin ang mga pangalan ng lahat ng mga parameter sa kahilingan mula sa jfrom sa user .

Ang aming ikatlong hakbang ay ang paghahanap ng wastong token ng CSRF, dahil kung wala ito ay walang pagpaparehistro.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") o jexit(JText::_("JINVALID_TOKEN"));

Mukhang isang MD5 hash, at maaari mo itong kunin, halimbawa, mula sa form ng pahintulot sa site /index.php/component/users/?view=login.


Ngayon ay maaari kang lumikha ng mga gumagamit gamit ang nais na paraan. Kung gumana ang lahat, binabati kita - sinamantala mo lang ang kahinaan ng CVE-2016-8870 na "nawawalang pahintulot sa pagrerehistro ng mga bagong user".

Ito ang hitsura sa "gumagana" na paraan ng rehistro() mula sa UsersControllerRegistration controller:

  • /components/com_users/controllers/registration.php: 113: // Kung hindi pinagana ang pagpaparehistro - I-redirect sa pahina ng pag-login. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) login", false)); 117: 118: return false; 119: )

At kaya sa mahina:

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

Oo, hindi pwede.

Upang maunawaan ang pangalawa, mas seryosong problema, ipadala natin ang kahilingang ginawa namin at tingnan kung paano ito isinasagawa sa iba't ibang bahagi ng code. Narito ang piraso na responsable para sa pagpapatunay ng data na isinumite ng user sa pamamaraan ng manggagawa:

Ang pagpapatuloy ay magagamit lamang sa mga miyembro Pagpipilian 1. Sumali sa komunidad ng “site” upang basahin ang lahat ng materyal sa site

Ang membership sa komunidad sa loob ng tinukoy na panahon ay magbibigay sa iyo ng access sa LAHAT ng materyales ng Hacker, dagdagan ang iyong personal na pinagsama-samang diskwento at magbibigay-daan sa iyong makaipon ng propesyonal na Xakep Score rating!

Ang Laravel ay nangangailangan ng Composer na pamahalaan ang mga dependency ng proyekto. Kaya bago i-install ang Laravel, siguraduhing mayroon kang Composer na naka-install sa iyong system. Kung sakaling marinig mo ang tungkol sa Composer sa unang pagkakataon, isa itong tool sa pamamahala ng dependency para sa php na katulad ng npm ng node.

Upang i-install ang Composer sa iyong makina, tingnan ang post na ito:

Pag-install ng Laravel sa Windows:

Sundin ang mga hakbang sa ibaba upang i-install ang laravel sa windows machine. Kahit na mayroon kang xampp/wamp stack, gumagana ito para sa pareho. Sa WAMP, siguraduhing i-install ang laravel sa "www" na folder at sa XAMPP, malinaw naman ang "htdocs".

STEP-1) Buksan ang "htdocs" na folder sa XAMPP, pindutin nang matagal ang SHIFT key at i-right click sa folder, at piliin ang "open command window dito". Bilang kahalili, maaari mong buksan ang command window at baguhin ang direktoryo sa "xampp/htdocs".

STEP-2) Ipasok ang sumusunod na command.

Composer create-project laravel/laravel my_laravel_site --prefer-dist

Narito ang "my_laravel_site" ay ang pangalan ng folder kung saan mai-install ang mga laravel file. Baguhin ito ayon sa gusto mo.

HAKBANG-3) Ngayon ay oras na upang maging matiyaga dahil ang pag-install ng laravel ay magtatagal.

STEP-4) Kapag na-install, palitan ang direktoryo sa "my_laravel_site" (cd "my_laravel_site") sa command prompt at ilagay ang command sa ibaba.

Php artisan serve

HAKBANG-5) Magpapakita ito ng mensaheng tulad ng, "Nagsimula ang server ng pag-unlad ng Laravel:" kasama ng isang url.

STEP-6) Kopyahin at i-paste ang url sa browser. Kung maayos ang lahat, makikita mo ang laravel welcome screen.

HAKBANG-7) Tapos na! Matagumpay mong na-install ang laravel sa windows machine at handa nang gamitin.

Setting Key ng Application:

Ang Laravel ay nangangailangan ng maliit na pagsasaayos pagkatapos ng pag-install. Kinakailangan mong itakda ang application key. Isa itong random na string ng 32 character na matagal nang ginagamit para sa pag-encrypt ng session at iba pang sensitibong data. Kadalasan ito ay awtomatikong itatakda kapag nag-install ka ng laravel sa pamamagitan ng composer o laravel installer.

Kung sakaling hindi ito nakatakda, kailangan mong gawin ito nang manu-mano. Siguraduhing palitan muna ang pangalan ng ".env.example" na file sa ".env" sa root ng iyong application. Pagkatapos ay buksan ang command prompt at palitan ang laravel project folder. Ngayon patakbuhin ang utos sa ibaba upang makabuo ng susi.

Php artisan key:generate

Kopyahin ang nabuong key na ito sa APP_KEY variable sa ".env" na file. I-save at tapos ka na.

Pag-install ng Partikular na Bersyon ng Laravel:

Ang ibinigay na paraan sa itaas ay gagawa ng kompositor na mag-download at mag-install ng pinakabagong bersyon ng laravel. Kung gusto mong mag-install ng mga naunang bersyon ng laravel sa iyong makina, tiyaking isama ang kaukulang numero ng bersyon sa command na create-project.

Composer create-project laravel/laravel=5.4 your-project-name --prefer-dist Basahin din:

Ganun din kaya mo madaling i-install ang laravel gamit ang kompositor sa mga bintana. Umaasa ako na mahanap mo ang tutorial na ito na kapaki-pakinabang. Mangyaring ibahagi ito sa iyong social circle kung gusto mo ito.

Ang proseso ng paglikha ng isang sistema ng pagpaparehistro ay medyo maraming trabaho. Kailangan mong magsulat ng code na nagdo-double check sa bisa ng mga email address, nagpapadala ng mga email ng kumpirmasyon, nag-aalok ng kakayahang mabawi ang mga password, nag-iimbak ng mga password sa isang ligtas na lugar, nagpapatunay ng mga form ng pag-input, at marami pa. Kahit na gawin mo ang lahat ng ito, ang mga gumagamit ay mag-aatubili na magparehistro, dahil kahit na ang pinakamaliit na pagpaparehistro ay nangangailangan ng kanilang aktibidad.

Sa tutorial ngayon, bubuo kami ng isang simpleng sistema ng pagpaparehistro na hindi mangangailangan ng anumang mga password! Ang mga resulta ay magiging isang sistema na madaling mabago o maisama sa isang umiiral na website ng PHP. Kung interesado ka, ipagpatuloy ang pagbabasa.

PHP

Ngayon ay handa na kaming magsimula sa PHP code. Ang pangunahing pag-andar ng sistema ng pagpaparehistro ay ibinibigay ng klase ng User, na makikita mo sa ibaba. Ang klase ay gumagamit ng (), na isang minimalist na library ng database. Ang klase ng User ay may pananagutan sa pag-access sa mga database, pagbuo ng mga token sa pag-login at pagpapatunay sa kanila. Nagpapakita ito sa amin ng isang simpleng interface na madaling maisama sa sistema ng pagpaparehistro ng iyong mga website na nakabase sa PHP.

User.class.php

// Pribadong ORM instance
pribadong $orm;

/**
* Maghanap ng user sa pamamagitan ng isang token string. Ang mga wastong token lamang ang kinukuha
* pagsasaalang-alang. Ang isang token ay may bisa sa loob ng 10 minuto pagkatapos itong mabuo.
* @param string $token Ang token na hahanapin
* @return User
*/

Pampublikong static na function findByToken($token)(

// hanapin ito sa database at tiyaking tama ang timestamp


-> where("token", $token)
->where_raw("token_validity > NOW()")
-> find_one();

Kung(!$result)(
ibalik ang mali;
}

Ibalik ang bagong User($result);
}

/**
* Mag-login o magrehistro ng user.
* @return User
*/

Pampublikong static function loginOrRegister($email)(

// Kung mayroon nang ganyang user, ibalik ito

Kung(User::exists($email))(
ibalik ang bagong User($email);
}

// Kung hindi, likhain ito at ibalik ito

Return User::create($email);
}

/**
* Lumikha ng bagong user at i-save ito sa database
* @param string $email Ang email address ng user
* @return User
*/

Gumawa ng pribadong static function ($email)(

// Sumulat ng bagong user sa database at ibalik ito

$result = ORM::for_table("reg_users")->create();
$result->email = $email;
$result->save();

Ibalik ang bagong User($result);
}

/**
* Suriin kung ang naturang user ay umiiral sa database at magbalik ng boolean.
* @param string $email Ang email address ng user
* @ibalik ang boolean
*/

Umiiral ang pampublikong static function ($email)(

// Umiiral ba ang user sa database?
$result = ORM::for_table("reg_users")
-> where("email", $email)
->bilang();

Ibalik ang $result == 1;
}

/**
* Lumikha ng bagong object ng user
* @param $param ORM instance, id, email o null
* @return User
*/

Pampublikong function __construct($param = null)(

If($param instanceof ORM)(

// Isang ORM instance ang naipasa
$this->orm = $param;
}
else if(is_string($param))(

// Isang email ang naipasa
$ito->
-> where("email", $param)
-> find_one();
}
iba pa(

If(is_numeric($param))(
// Ang isang user id ay naipasa bilang isang parameter
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Walang naipasa na user ID, tingnan ang session
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
-> where("id", $id)
-> find_one();
}

/**
* Bumubuo ng bagong SHA1 login token, isinusulat ito sa database at ibinabalik ito.
* @return string
*/

Pampublikong function generateToken())(
// bumuo ng token para sa naka-log in na user. I-save ito sa database.

$token = sha1($this->email.time().rand(0, 1000000));

// I-save ang token sa database,
// at markahan ito bilang wasto para sa susunod na 10 minuto lamang

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

Ibalik ang $token;
}

/**
*Login ang user na ito
* @pagbabalik walang bisa
*/

Public function login()

// Markahan ang user bilang naka-log in
$_SESSION["loginid"] = $this->orm->id;

// I-update ang last_login db field
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Wasakin ang session at i-logout ang user.
* @pagbabalik walang bisa
*/

Public function logout()
$_SESSION = array();
unset($_SESSION);
}

/**
* Suriin kung naka-log in ang user.
* @ibalik ang boolean
*/

Pampublikong function na naka-logIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Suriin kung ang gumagamit ay isang administrator
* @ibalik ang boolean
*/

Ang pampublikong function ayAdmin())(
ibalik ang $this->rank() == "administrator";
}

/**
* Hanapin ang uri ng user. Maaari itong maging admin o regular.
* @return string
*/

Ranggo ng pampublikong function())(
if($this->orm->rank == 1)(
ibalik ang "administrator";
}

Ibalik ang "regular";
}

/**
* Magic na paraan para sa pag-access sa mga elemento ng pribado
* $orm instance bilang mga katangian ng object ng user
* @param string $key Pangalan ng na-access na property
* @return mixed
*/

Pampublikong function __get($key)(
if(isset($this->orm->$key))(
ibalik ang $this->orm->$key;
}

Ibalik ang null;
}
}
Ang mga token ay nabuo gamit ang isang algorithm at nakaimbak sa isang database. Ginagamit namin ang MySQL upang itakda ang column ng token_validity sa 10 minuto. Kapag nagpapatunay ng token, sasabihin namin sa engine na kailangan namin ng token, hindi pa nag-e-expire ang field ng token_validity. Sa ganitong paraan, nililimitahan namin ang oras kung kailan magiging wasto ang token.

Pansinin na ginagamit namin ang __get() magic method sa dulo ng dokumento upang ma-access ang mga katangian ng object ng user. Nagbibigay-daan ito sa amin na ma-access ang data na nakaimbak sa database bilang mga katangian: $user->email, $user->token. Bilang halimbawa, tingnan natin kung paano natin magagamit ang klase na ito sa sumusunod na snippet ng code:


Ang isa pang file na nag-iimbak ng kinakailangang functionality ay functions.php. Mayroon kaming ilang mga function ng helper na nagpapahintulot sa amin na panatilihing mas malinis ang natitirang bahagi ng code.

Functions.php

Function send_email($from, $to, $subject, $message)(

// Helper function para sa pagpapadala ng email

$headers = "MIME-Bersyon: 1.0" . "\r\n";
$headers .= "Content-type: text/plain; charset=utf-8" . "\r\n";
$headers .= "Mula kay: ".$mula sa . "\r\n";

Ibalik ang mail($to, $subject, $message, $headers);
}

function get_page_url())(

// Alamin ang URL ng isang PHP file

$url = "http".(walang laman($_SERVER["HTTPS"])?"":"s"."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
iba pa(
$url.= $_SERVER["PATH_INFO"];
}

Ibalik ang $url;
}

function rate_limit ($ip, $limit_hour = 20, $limit_10_min = 10)(

// Ang bilang ng mga pagtatangka sa pag-log in para sa huling oras ng IP address na ito

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(NOW(),"1:00")")
->bilang();

// Ang bilang ng mga pagtatangka sa pag-log in sa huling 10 minuto ng IP address na ito

$count_10_min = ORM::for_table("reg_login_attempt")
-> where("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(NOW(),"0:10")")
->bilang();

If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
throw new Exception("Masyadong maraming pagsubok sa pag-login!");
}
}

function rate_limit_tick($ip, $email)(

// Lumikha ng bagong tala sa talahanayan ng pagsubok sa pag-login

$login_attempt = ORM::for_table("reg_login_attempt")->create();

$login_attempt->email = $email;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

function redirect($url)(
header("Lokasyon: $url");
labasan;
}
Ang mga function na rate_limit at rate_limit_tick ay nagbibigay-daan sa amin na limitahan ang bilang ng mga pagtatangka sa pahintulot para sa isang tiyak na tagal ng panahon. Ang mga pagtatangka ng pahintulot ay naitala sa database ng reg_login_attempt. Nati-trigger ang mga function na ito kapag na-verify ang form sa pag-login, gaya ng makikita mo sa sumusunod na snippet ng code.

Ang code sa ibaba ay kinuha mula sa index.php at responsable para sa pagpapatunay ng form sa pag-login. Nagbabalik ito ng tugon ng JSON na hinihimok ng jQuery code na nakita namin sa assets/js/script.js.

index.php

Kung(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Mag-output ng JSON header

Header("Content-type: application/json");

// Wasto ba ang email address?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Mangyaring magpasok ng wastong email.");
}

// Magbibigay ito ng exception kung nasa itaas ang tao
// ang pinapayagang mga limitasyon sa pagsubok sa pag-login (tingnan ang functions.php para sa higit pa):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Itala ang pagsubok na ito sa pag-log in
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Ipadala ang mensahe sa user

$mensahe = "";
$email = $_POST["email"];
$subject = "Ang Iyong Login Link";

If(!User::exists($email))(
$subject = "Salamat Sa Pagrehistro!";
$message = "Salamat sa pagrehistro sa aming site!\n\n";
}

// Subukang mag-login o irehistro ang tao
$user = User::loginOrRegister($_POST["email"]);

$message.= "Maaari kang mag-log in mula sa URL na ito:\n";
$message.= get_page_url()."?tkn=".$user->generateToken().."\n\n";

$message.= "Ang link ay awtomatikong mawawalan ng bisa pagkatapos ng 10 minuto.";

$result = send_email($fromEmail, $_POST["email"], $subject, $message);

Kung(!$result)(
throw new Exception("Nagkaroon ng error sa pagpapadala ng iyong email. Pakisubukang muli.");
}

Die(json_encode(array(
"message" => "Salamat! Nagpadala kami ng link sa iyong inbox. Suriin din ang iyong spam folder."
)));
}
}
catch(Exception $e)(

Die(json_encode(array(
"error" => 1,
"mensahe" => $e->getMessage()
)));
}
Sa matagumpay na pagpapahintulot o pagpaparehistro, ang code sa itaas ay nagpapadala ng email sa taong may link para sa awtorisasyon. Ang token ay ginawang available bilang $_GET variable na "tkn" dahil sa nabuong URL.

index.php

If(isset($_GET["tkn"]))(

// Ito ba ay isang wastong token sa pag-log in?
$user = User::findByToken($_GET["tkn"]);

// Oo! Mag-login sa user at mag-redirect sa protektadong pahina.

$user->login();
redirect("protected.php");
}

// Di-wastong token. I-redirect pabalik sa login form.
redirect("index.php");
}
Ang pagpapatakbo ng $user->login() ay lilikha ng mga kinakailangang variable ng session, na magbibigay-daan sa user na manatiling naka-log in sa mga kasunod na pag-login.

Ang pag-log out sa system ay ipinapatupad sa halos parehong paraan:

Index.php

If(isset($_GET["logout"]))(

$user = bagong User();

If($user->logIn())(
$user->logout();
}

I-redirect("index.php");
}
Sa dulo ng code, nire-redirect namin ang user sa index.php muli, kaya ang ?logout=1 parameter sa URL ay maalis.

Ang aming index.php file ay mangangailangan din ng proteksyon - hindi namin nais na naka-log in na ang mga user na makita ang form. Upang gawin ito ginagamit namin ang $user->loggedIn() na paraan:

Index.php

$user = bagong User();

if($user->login())(
redirect("protected.php");
}
Panghuli, tingnan natin kung paano mo mapoprotektahan ang iyong pahina ng website at gawin itong naa-access lamang pagkatapos ng pahintulot:

protected.php

// Para protektahan ang anumang php page sa iyong site, isama ang main.php
// at lumikha ng bagong object ng User. Ganun kasimple!

require_once "includes/main.php";

$user = bagong User();

kung(!$user->logIn())(
redirect("index.php");
}
Pagkatapos ng pagsusuring ito, makatitiyak kang matagumpay na naka-log in ang user. Magkakaroon ka rin ng access sa data na nakaimbak sa database bilang mga katangian ng $user object. Upang ipakita ang email ng user at ang kanilang ranggo, gamitin ang sumusunod na code:

Echo "Ang iyong email: ".$user->email;
echo "Ang iyong ranggo: ".$user->rank();
Narito ang rank() ay ang pamamaraan dahil ang column ng ranggo sa database ay karaniwang naglalaman ng mga numero (0 para sa mga regular na user at 1 para sa mga administrator) at kailangan nating i-convert ang lahat ng ito sa mga pangalan ng ranggo, na ipinapatupad gamit ang pamamaraang ito. Upang i-convert ang isang karaniwang user sa isang administrator, i-edit lang ang entry ng user sa phpmyadmin (o anumang iba pang database program). Bilang isang administrator, ang user ay hindi bibigyan ng anumang mga espesyal na kakayahan. Ikaw mismo ang may karapatang pumili kung anong mga karapatan ang ibibigay sa mga administrator.

handa na!

Sa pamamagitan nito ang aming simpleng sistema ng pagpaparehistro ay handa na! Maaari mo itong gamitin sa isang umiiral nang PHP site, o i-modernize ito upang umangkop sa iyong sariling mga kinakailangan.

Reg.ru: mga domain at pagho-host

Ang pinakamalaking registrar at hosting provider sa Russia.

Higit sa 2 milyong mga domain name sa serbisyo.

Promosyon, domain mail, mga solusyon sa negosyo.

Mahigit sa 700 libong mga customer sa buong mundo ang nakapili na.

*I-mouse sa ibabaw upang i-pause ang pag-scroll.

Bumalik pasulong

Paglikha ng isang simpleng sistema ng pagpaparehistro ng user sa PHP at MySQL

Ang paglikha ng isang sistema ng pagpaparehistro ay maraming trabaho. Kailangan mong magsulat ng code na nagpapatunay sa mga email address, nagpapadala ng email na nagkukumpirma ng pagpaparehistro, at nagpapatunay din ng iba pang mga field ng form, at marami pang iba.

At kahit na pagkatapos mong isulat ang lahat ng ito, ang mga gumagamit ay mag-aatubili na magparehistro, dahil... ito ay nangangailangan ng ilang pagsisikap sa kanilang bahagi.

Sa tutorial na ito, gagawa kami ng napakasimpleng sistema ng pagpaparehistro na hindi nangangailangan o nag-iimbak ng mga password! Ang resulta ay magiging madaling baguhin at idagdag sa isang umiiral nang PHP site. Gusto mong malaman kung paano ito gumagana? Basahin sa ibaba.



Narito kung paano gagana ang aming napakasimpleng sistema:

Pagsasamahin namin ang form ng awtorisasyon at pagpaparehistro. Ang form na ito ay magkakaroon ng field para sa pagpasok ng iyong email address at isang button sa pagpaparehistro;
- Kapag pinupunan ang field gamit ang isang email address, ang pag-click sa pindutan ng pagpaparehistro ay lilikha ng isang talaan tungkol sa isang bagong user, ngunit kung ang ipinasok na email address ay hindi natagpuan sa database.

Pagkatapos nito, ang isang random na natatanging hanay ng mga character (token) ay nilikha, na ipinadala sa email na tinukoy ng gumagamit sa anyo ng isang link na magiging may kaugnayan sa loob ng 10 minuto;
- Dinadala ng link ang user sa aming website. Tinutukoy ng system ang pagkakaroon ng isang token at pinahihintulutan ang gumagamit;

Mga kalamangan ng diskarteng ito:

Hindi na kailangang mag-imbak ng mga password o patunayan ang mga field;
- Hindi na kailangang bawiin ang iyong password, mga tanong sa seguridad, atbp.;
- Mula sa sandaling magrehistro/mag-log in ang isang user, palagi kang makakatiyak na ang user na ito ay nasa iyong access zone (na ang email address ay totoo);
- Hindi kapani-paniwalang simpleng proseso ng pagpaparehistro;

Bahid:

Seguridad ng user account. Kung ang isang tao ay may access sa mail ng user, maaari silang mag-log in.
- Hindi secure ang email at maaaring ma-intercept. Tandaan na ang tanong na ito ay may kaugnayan din sa kaso kung saan ang password ay nakalimutan at kailangang ibalik, o sa anumang authorization system na hindi gumagamit ng HTTPS para sa paglipat ng data (login/password);
- Habang iko-configure mo nang maayos ang iyong mail server, may pagkakataon na ang mga mensaheng may mga link ng pahintulot ay mauwi sa spam;

Kung ihahambing ang mga pakinabang at disadvantages ng aming system, masasabi nating ang system ay may mataas na kakayahang magamit (pinakamataas na kaginhawahan para sa end user) at, sa parehong oras, ay may mababang tagapagpahiwatig ng seguridad.

Kaya iminumungkahi na gamitin ito para sa mga pagpaparehistro sa mga forum at serbisyo na hindi gumagana sa mahalagang impormasyon.

Paano gamitin ang sistemang ito

Kung sakaling kailangan mo lang gumamit ng system para pahintulutan ang mga user sa iyong site, at hindi mo nais na maliitin ang araling ito, narito ang kailangan mong gawin:

Kailangan mong i-download ang mga mapagkukunan na nakalakip sa aralin
- Hanapin ang tables.sql file sa archive. I-import ito sa iyong database gamit ang opsyon sa pag-import sa phpMyAdmin. Alternatibong paraan: buksan ang file na ito sa pamamagitan ng text editor, kopyahin ang SQL query at isagawa ito;
- Buksan ang kasama/main.php at punan ang mga setting para sa pagkonekta sa iyong database (tukuyin ang user at password para sa pagkonekta sa database, pati na rin ang host at pangalan ng database). Sa parehong file, dapat mo ring tukuyin ang email, na gagamitin bilang orihinal na address para sa mga mensaheng ipinadala ng system. Hinaharang ng ilang host ang mga papalabas na email maliban kung naglalaman ang form ng totoong email address, na ginawa mula sa control panel ng host, kaya magbigay ng totoong address;
- I-upload ang lahat ng index.php , protected.php file at asset at may kasamang mga folder sa pamamagitan ng FTP sa iyong host;
- Idagdag ang code sa ibaba sa bawat pahina ng PHP kung saan mo gustong ipakita ang form sa pag-login;

Require_once "includes/main.php"; $user = bagong User(); if(!$user->loggedIn())( redirect("index.php"); )
- Handa na!

Para sa mga interesado sa kung paano gumagana ang lahat, basahin sa ibaba!

Ang unang hakbang ay isulat ang HTM code para sa authorization form. Ang code na ito ay matatagpuan sa index.php file. Ang file na ito ay naglalaman din ng PHP code na humahawak ng data ng form at iba pang kapaki-pakinabang na mga function ng system sa pag-log in. Maaari kang matuto nang higit pa tungkol dito sa seksyon sa ibaba na nakatuon sa pagsusuri ng PHP code.

index.php

Tutorial: Super Simple Registration System Sa PHP at MySQL Login o Register

Ilagay ang iyong email address sa itaas at ipapadala namin
ikaw ay isang link sa pag-login.

Mag-login/Magrehistro

Sa head section (sa pagitan ng at mga tag) isinama ko ang mga pangunahing istilo (hindi sila saklaw sa tutorial na ito, kaya maaari mong tingnan ang mga ito mismo. Folder assets/css/style.css). Bago ang closing tag, isinama ko ang jQuery library at ang script.js file, na aming isusulat at susuriin sa ibaba.


JavaScript

Sinusubaybayan ng jQuery ang estado ng "Register/Login" na buton gamit ang function e.preventDefault() at nagpapadala ng mga kahilingan sa AJAX. Depende sa tugon ng server, ipinapakita nito ang isa o isa pang mensahe at tinutukoy ang mga karagdagang aksyon/

assets/js/script.js

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

ay idinagdag sa form upang ipakita ang kasalukuyang estado ng kahilingan ng AJAX (ito ay naging posible salamat sa mga pamamaraan ajaxStart()) At ajaxComplete(), na mahahanap mo sa dulo ng file).

Ang klase na ito ay nagpapakita ng isang umiikot na animated na GIF file (parang nagpapahiwatig sa amin na ang kahilingan ay pinoproseso), at nagsisilbi rin bilang isang bandila upang pigilan ang form na maisumite muli (kapag ang register button ay na-click nang isang beses). Ang .loggedIn class ay isa pang flag - ito ay nakatakda kapag ang email ay ipinadala. Agad na hinaharangan ng watawat na ito ang anumang karagdagang pagkilos gamit ang form.

Schema ng database

Ang aming hindi kapani-paniwalang simpleng sistema ng pag-log ay gumagamit ng 2 MySQL table (ang SQL code ay nasa tables.sql file). Ang una ay nag-iimbak ng data tungkol sa mga user account. Ang pangalawa ay nag-iimbak ng impormasyon tungkol sa bilang ng mga pagtatangka sa pag-login.


Schema ng talahanayan ng user.

Ang system ay hindi gumagamit ng mga password, tulad ng makikita sa diagram. Dito makikita mo ang column ng token na may mga token na katabi ng column ng token_validity. Ang token ay na-install sa sandaling kumonekta ang user sa system at itakda ang kanyang email na magpadala ng mensahe (higit pa tungkol dito sa susunod na block). Itinatakda ng column na token_validity ang oras pagkalipas ng 10 minuto, pagkatapos nito ay hindi na wasto ang token.


Schema ng talahanayan na nagbibilang ng bilang ng mga pagtatangka sa pagpapahintulot.

Sa parehong mga talahanayan, ang IP address ay naka-imbak sa naprosesong anyo, gamit ang ip2long function sa isang field ng uri ng integer.

Ngayon ay maaari na tayong magsulat ng ilang PHP code. Ang pangunahing pag-andar ng system ay itinalaga sa klase ng User.class.php, na makikita mo sa ibaba.

Ang klase na ito ay aktibong gumagamit ng idorm (docs), ang mga aklatang ito ay ang pinakamababang kinakailangang kasangkapan para sa pagtatrabaho sa mga database. Pinangangasiwaan nito ang pag-access sa database, pagbuo ng token, at pagpapatunay ng token. Nagbibigay ito ng simpleng interface na nagpapadali sa pagkonekta ng isang sistema ng pagpaparehistro sa iyong site kung gumagamit ito ng PHP.

User.class.php

Class User( // Private ORM case private $orm; /** * Humanap ng user sa pamamagitan ng token. Tanging ang mga valid na token lang ang tinatanggap para sa pagsasaalang-alang. Ang token ay nabuo lamang sa loob ng 10 minuto mula sa sandaling ito ay nilikha * @param string $token Ito ang hinahanap naming token * @return User Ibalik ang halaga ng User function */ public static function findByToken($token)( // hanapin ang token sa database at tiyaking nakatakda ang tamang timestamp $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) ibalik ang bagong User($result); ) /** * Pahintulutan o irehistro ang isang user * @param string $email. Email address ng user * @return User */ public static function loginOrRegister($email)( // Kung ganoon na ang user umiiral, ibalik ang halaga ng User function mula sa tinukoy na email address na nakaimbak sa database kung(User::exists($email))( return new User($email); ) // Kung hindi, lumikha ng bagong user sa database at ibalik ang halaga ng User::create function mula sa tinukoy na email return User::create($email ); ) /** * Lumikha ng bagong user at i-save sa database * @param string $email. Email address ng user * @return User */ private static function create($email)( // Sumulat ng bagong user at ibalik ang resulta ng User function mula sa mga value na ito $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Suriin kung may ganoong user sa database at ibalik ang Boolean value ng ang variable na * @param string $email. Email address ng user * @return boolean */ umiiral ang public static function ($email)( // Umiiral ba ang user sa database? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Lumikha ng bagong user object * @param instance $param ORM , id, email o 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // ORM check passed $this->orm = $param; ) else if(is_string($param))( // Email check passed $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // ang value ng variable na $param ay ipinasa sa user identifier $id = $param; ) else if(isset($_SESSION["loginid"]))( // Kung hindi, tingnan ang session $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Bumuo ng bagong SHA1 authorization token, isinusulat ito sa database at ibabalik ang halaga nito * @return string */ public function generateToken( )( // Bumuo ng token para sa isang awtorisadong user at i-save ito sa database $token = sha1($this->email.time().rand(0, 1000000)); // I-save ang token sa database // At markahan ito bilang valid lamang sa susunod na 10 minuto $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); ibalik ang $token; ) /** * Pahintulutan ang user * @return void */ public function login())( // Markahan ang user bilang naka-log in $_SESSION["loginid"] = $this->orm->id; // I-update ang value ng last_login database field $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Wasakin ang session at i-log out ang user * @return void */ public function logout ()( $_SESSION = array(); unset ($_SESSION); ) /** * Suriin kung ang user ay naka-log in * @return boolean */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Sinusuri kung ang user ay isang administrator * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Hanapin ang uri ng user, maaaring maging administrator o regular * @return string */ public function rank())( kung ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Paraan na nagbibigay-daan sa iyong makuha ang pribadong impormasyon ng user bilang * properties ng User object * @ param string $key Ang pangalan ng property na nakakakuha ng access * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) ibalik ang null; ) )

Ang mga token ay nabuo gamit ang SHA1 algorithm at iniimbak sa database. Gumagamit ako ng mga function ng timing ng MySQL upang magtakda ng 10 minutong limitasyon sa oras para sa bisa ng isang token.

Kapag na-validate ang isang token, direktang sinasabi namin sa handler na isinasaalang-alang lang namin ang mga token na hindi pa nag-e-expire, na nakaimbak sa column ng token_validity.

Pakitandaan na gumagamit ako ng magic method __kunin docs library sa dulo ng file upang harangin ang access sa mga katangian ng object ng User.

Dahil dito, nagiging posible na ma-access ang impormasyong nakaimbak sa database salamat sa mga katangian na $user->email, $user->token, atbp. Sa susunod na fragment ng code, titingnan natin kung paano gamitin ang mga klase bilang halimbawa .


Protektadong pahina

Ang isa pang file na nag-iimbak ng kapaki-pakinabang at kinakailangang functionality ay ang functions.php file. Mayroong ilang mga tinatawag na katulong - mga function ng katulong na nagbibigay-daan sa iyo upang lumikha ng mas malinis at mas nababasa na code sa iba pang mga file.

functions.php

Function send_email($from, $to, $subject, $message)( // Helper na nagpapadala ng email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type: text /plain; charset=utf-8" . "\r\n"; $headers .= "From: ".$from . "\r\n"; return mail($to, $subject, $message, $headers ); ) function get_page_url())( // Tukuyin ang URL ng PHP file $url = "http".(empty($_SERVER["HTTPS"])?"":"s"."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) ibalik ang $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Bilang ng mga pagtatangka sa pag-log in sa huling oras sa IP address na ito $ count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00 ")") ->count(); // Bilang ng mga pagsubok sa pag-log in sa huling 10 minuto sa IP address na ito $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u ", ip2long($ ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Masyadong maraming pagsubok sa pag-log in!"); ) ) function rate_limit_tick($ip, $email)( // Lumikha ng bagong record sa table na binibilang ang bilang ng mga pagtatangka sa pag-login $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) function redirect($url)(header("Lokasyon: $url"); exit; )

Mga pag-andar rate_limit At rate_limit_tick subaybayan ang bilang ng mga pagtatangka ng awtorisasyon sa lumipas na yugto ng panahon mula noong unang pagtatangka. Ang pagtatangka sa pag-login ay naitala sa database sa reg_login_attempt column. Ang mga function na ito ay tinatawag kapag ang data ng form ay naproseso at isinumite gaya ng nakikita mo mula sa sumusunod na snippet ng code.

Ang code sa ibaba ay kinuha mula sa index.php file at pinangangasiwaan nito ang pagsusumite ng form. Nagbabalik ito ng tugon ng JSON, na pinoproseso naman ng jQuery sa file na assets/js/script.js na tiningnan namin kanina.

index.php

Try( if(!empty ($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Output a JSON header header("Content-type: application/json"); // Was this email address if (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Mangyaring magpasok ng wastong email."); ) // Suriin. Ay ang pinahintulutan ng user na mag-log in, lumampas ba siya sa bilang ng mga pinapayagang koneksyon? (functions.php file para sa higit pang impormasyon) rate_limit($_SERVER["REMOTE_ADDR"]); // I-log this login attempt rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Magpadala ng email sa user $message = ""; $email = $_POST["email"]; $subject = "Your Login Link"; if(!User:: exists($email) )( $subject = "Salamat Sa Pagrehistro!"; $message = "Salamat sa pagrehistro sa aming site!\n\n"; ) // Subukang pahintulutan o irehistro ang isang user $user = User ::loginOrRegister($_POST[ "email"]); $message.= "Maaari kang mag-login mula sa URL na ito:\n"; $message.= get_page_url()."?tkn=".$user->generateToken().."\n\n"; $message.= "Ang link ay awtomatikong mawawalan ng bisa pagkatapos ng 10 minuto."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Nagkaroon ng error sa pagpapadala ng iyong email. Pakisubukang muli."); ) die(json_encode(array("message" => "Salamat! Nagpadala kami ng link sa iyong inbox. Tingnan din ang iyong folder ng spam."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )));)

Pagkatapos ng matagumpay na pag-login/pagpaparehistro, ang code sa itaas ay magpapadala sa user ng link sa pag-login. Nagiging available ang token dahil ito ay ipinasa bilang isang variable sa nabuong link sa pamamagitan ng pamamaraan $_GET may tkn marker

index.php

If(isset($_GET["tkn"]))( // Wasto ba ang token na ito para sa awtorisasyon? $user = User::findByToken($_GET["tkn"]); if($user)( // Oo , ay. Mag-redirect sa isang protektadong pahina $user->login(); redirect("protected.php"); ) // Hindi, hindi wasto ang token. Mag-redirect sa isang page na may authorization/registeration form redirect("index. php");)

$user->login()

gagawa ng mga kinakailangang variable para sa session, upang ang user, na tumitingin sa mga kasunod na pahina ng site, ay mananatiling awtorisado sa lahat ng oras.

Ang pagproseso ng function upang lumabas sa system ay nakaayos sa katulad na paraan.

index.php

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

Sa dulo ng code, muli akong nagtakda ng redirect sa index.php, kaya ang parameter ?logout=1 na ipinadala sa pamamagitan ng URL ay hindi kinakailangan.

Ang aming index.php file ay nangangailangan ng karagdagang. proteksyon - hindi namin gustong makitang muli ng mga taong naka-log in sa system ang registration form. Para sa mga layuning ito, ginagamit namin ang pamamaraan $user->login().

index.php

$user = bagong User(); if($user->loggedIn())( redirect("protected.php"); )

Panghuli, narito ang isang piraso ng code na nagbibigay-daan sa iyong protektahan ang mga pahina ng iyong site at gawin itong naa-access lamang pagkatapos ng pahintulot.

protected.php

// Para protektahan ang bawat page sa iyong site, magsama ng main.php file // at lumikha ng bagong User object. Ganun lang kadali! require_once "includes/main.php"; $user = bagong User(); if(!$user->loggedIn())( redirect("index.php"); )

Pagkatapos ng pagsusuring ito, makatitiyak kang matagumpay na pinahintulutan ang user. Maaari mo ring ma-access ang naka-imbak na impormasyon sa database gamit ang mga katangian ng object $user. Upang ipakita ang email at status ng user, gamitin ang code na ito:

Echo "Ang iyong email: ".$user->email; echo "Ang iyong ranggo: ".$user->rank();

Pamamaraan ranggo() ay ginagamit dito dahil ang database ay karaniwang nag-iimbak ng mga numero (0 para sa isang regular na user, 1 para sa isang administrator) at kailangan naming i-convert ang data na ito sa mga katayuan kung saan sila nabibilang, na kung saan ang pamamaraang ito ay tumutulong sa amin.

Upang gawing administrator ang isang regular na user, i-edit lang ang entry ng user sa pamamagitan ng phpMyAdmin (o anumang iba pang program na nagpapahintulot sa iyo na pamahalaan ang mga database). Ang katayuan ng administrator ay hindi nagbibigay ng anumang mga pribilehiyo; sa halimbawang ito, ipapakita ng pahina na ikaw ay isang administrator - at iyon na.

Ngunit kung ano ang gagawin dito ay natitira sa iyong paghuhusga; maaari kang sumulat at gumawa ng code sa iyong sarili na nagtatakda ng ilang mga pribilehiyo at kakayahan para sa mga administrator.

Tapos na!

Tapos na kami sa hindi kapani-paniwalang sobrang simpleng hugis na ito! Magagamit mo ito sa iyong mga PHP site, ito ay medyo simple. Maaari mo ring baguhin ito para sa iyong sarili at gawin ito sa paraang gusto mo.

Ang materyal ay inihanda ni Denis Malyshok partikular para sa website

P.S. Gusto mo bang lumipat pa sa pag-master ng PHP at OOP? Bigyang-pansin ang mga premium na aralin sa iba't ibang aspeto ng pagbuo ng website, kabilang ang programming sa PHP, pati na rin ang libreng kurso sa paglikha ng sarili mong CMS system sa PHP mula sa simula gamit ang OOP:

Nagustuhan mo ba ang materyal at gusto mo akong pasalamatan?
Ibahagi lamang sa iyong mga kaibigan at kasamahan!




Bago sa site

>

Pinaka sikat