Bakit mapanganib na paganahin ang parameter na register_globals ng PHP? Paglikha ng isang simpleng sistema ng pagpaparehistro ng user sa PHP at MySQL Impersonal index php register

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!

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 estilo (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 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 maisumiteng 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 * @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 nagpapahintulot sa iyo na 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 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 pagpapasya; 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!


Dahil sa ang katunayan na napakadalas lumitaw ang mga tanong tungkol sa mga pandaigdigang variable at mga problema na nauugnay sa hindi pagpapagana ng register_globals na direktiba, susubukan naming sakupin ang paksang ito nang kaunti sa artikulong ito.

Una, tukuyin natin kung ano ang mga panlabas na variable. Ito ay anumang mga variable na pumapasok sa programa mula sa labas, i.e. ay hindi tinukoy sa mismong programa. Para sa isang php script, ang lahat ng mga variable na ipinapasa sa linya ng browser o sa pamamagitan ng form ay panlabas.
Tingnan natin kung paano nilikha ang mga ito.

Kung ang register_globals = On directive ay naka-enable sa server (sa php.ini), at kapag nagpapasa ng mga variable sa isang form o sa pamamagitan ng isang linya ng browser, sa script kung saan nilalayon ang mga variable na ito, awtomatiko silang malilikha. Yung. kung mayroon kang sumusunod na nakasulat sa linya ng iyong browser: www.server.ru/index.php?var=1, ang $var variable na may value na katumbas ng 1 ay awtomatikong malilikha sa index.php script.

Magkomento

Ang direktiba na ito ay isa sa mga pinakakontrobersyal na punto sa wikang PHP. Sa isang banda, ang paggamit nito ay maaari talagang magbunga ng mga tunay na problema sa proteksyon ng mga script ng PHP, kung posible ang mga sitwasyon ng error ay hindi wastong isinasaalang-alang, at maraming mga developer ang wastong tandaan na ang pagsulat ng mga script nang hindi gumagamit ng mga global na variable ay binabawasan ang kahinaan ng mga script sa iba't ibang uri ng pag-atake ng 90%. Sa kabilang banda, sa bukang-liwayway ng PHP, higit sa isang libong gumagamit ang nagtiwala sa mga developer ng wika (hanggang sa PHP 4.3 ang direktiba na ito ay pinagana bilang default), dahil sa kung saan mayroong kasalukuyang milyon-milyong aktwal na gumaganang mga script na nakasulat gamit ang mga global variable (Ito ay dapat tandaan na para sa mga layuning pang-edukasyon kung minsan ay lubos na kapaki-pakinabang na magsulat ng mga script gamit ang mga pandaigdigang variable, dahil ang pagpapalit sa mga ito ng mga superglobal na array ay lubhang nakakapinsala sa pagiging madaling mabasa ng code).

Sa kasalukuyan, karamihan sa mga host provider ay naka-enable ang direktiba na ito at malamang na mananatiling naka-enable sa mahabang panahon na darating, dahil kung hindi ay maaaring masira nito ang pagpapatuloy ng code.

Kapag ang register_globals na direktiba ay hindi pinagana, ang pag-access sa mga naturang variable ay posible sa dalawang paraan:

  • sa pamamagitan ng mga associative array HTTP_***_VARS (HTTP_POST_VARS, atbp.)
  • sa pamamagitan ng superglobal arrays ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, atbp.)

Available ang mga superglobal array sa anumang saklaw. Inirerekomenda ng mga developer ng PHP na huwag paganahin ang register_globals directive sa server at magtrabaho kasama ang mga variable sa pamamagitan ng superglobal arrays. Ang rekomendasyong ito ay dahil sa mga isyu sa seguridad na maaaring lumitaw kapag ang direktiba ng register_globals ay pinagana.

Bagama't hanggang kamakailan lamang, ang direktiba ng register_globals ay nanatiling naka-enable sa mga hosting site. Nagsimulang magbago ang sitwasyon sa paglabas ng PHP 5, kung saan ang direktiba na ito ay hindi pinagana bilang default at ang mga hoster ay hindi nagmamadaling paganahin ito (marahil ay tama).

Kaya, ano ang eksaktong dapat mong gawin upang makakuha ng mga variable? Kailangan mong kunin ang mga ito mula sa mga superglobal na array. Halimbawa, para maipasa ang mga variable sa linya ng browser, gamitin ang array na $_GET. Sabihin nating ang linya ng browser ay nagsasabing www.server.ru/index.php?var=1. Pagkatapos ay para makuha ang var variable sa index.php kailangan mong isulat:

$var=$_GET["var"];

At, halimbawa, upang makatanggap ng mga variable na inilipat mula sa isang form gamit ang POST method, sa form handler script kailangan mong isulat:

$var=$_POST["var"];

Sa artikulong ito, matututunan mo kung paano gumawa ng registration at login form gamit ang HTML, JavaScript, PHP at MySql. Ang ganitong mga form ay ginagamit sa halos bawat website, anuman ang uri nito. Nilikha ang mga ito para sa isang forum, isang online na tindahan, mga social network (tulad ng Facebook, Twitter, Odnoklassniki) at marami pang ibang uri ng mga site.

Kung mayroon kang website sa iyong lokal na computer, inaasahan kong mayroon ka nang naka-install at tumatakbong lokal na server. Kung wala ito, walang gagana.

Paglikha ng talahanayan sa Database

Upang maipatupad ang pagpaparehistro ng gumagamit, una sa lahat kailangan namin ng isang Database. Kung mayroon ka na nito, mahusay, kung hindi, kailangan mong likhain ito. Sa artikulo, ipinapaliwanag ko nang detalyado kung paano ito gagawin.

At kaya, mayroon kaming isang Database (pinaikling DB), ngayon kailangan naming lumikha ng isang talahanayan mga gumagamit kung saan idaragdag namin ang aming mga nakarehistrong user.

Ipinaliwanag ko rin kung paano lumikha ng isang talahanayan sa isang database sa artikulo. Bago lumikha ng isang talahanayan, kailangan nating matukoy kung anong mga patlang ang nilalaman nito. Ang mga field na ito ay tumutugma sa mga field mula sa registration form.

Kaya, naisip namin, naisip kung anong mga patlang ang mayroon ang aming form at lumikha ng isang talahanayan mga gumagamit kasama ang mga field na ito:

  • id- Identifier. Patlang id Ang bawat talahanayan sa database ay dapat magkaroon nito.
  • pangalan- Upang i-save ang pangalan.
  • huling pangalan- Upang mapanatili ang apelyido.
  • email- Upang i-save ang postal address. Gagamitin namin ang e-mail bilang login, kaya ang field na ito ay dapat na natatangi, ibig sabihin, mayroong NATATANGING index.
  • email_status- Field upang ipahiwatig kung ang mail ay nakumpirma o hindi. Kung nakumpirma ang mail, magkakaroon ito ng value na 1, kung hindi, ang value ay 0.
  • password- Upang i-save ang password.


Kung gusto mong magkaroon ng ibang field ang iyong registration form, maaari mo ring idagdag ang mga ito dito.

Ayan, table namin mga gumagamit handa na. Lumipat tayo sa susunod na yugto.

Koneksyon sa Database

Nagawa namin ang database, ngayon kailangan naming kumonekta dito. Kami ay kumonekta gamit ang PHP extension MySQLi.

Sa folder ng aming site, lumikha ng isang file na may pangalan dbconnect.php, at isulat ang sumusunod na script dito:

Ang file na ito dbconnect.php ay kailangang konektado sa mga humahawak ng form.

Pansinin ang variable $address_site, dito ko ipinahiwatig ang pangalan ng aking test site na aking gagawin. Mangyaring ipahiwatig ang pangalan ng iyong site nang naaayon.

Istraktura ng site

Ngayon tingnan natin ang istruktura ng HTML ng aming site.

Ililipat namin ang header at footer ng site sa magkahiwalay na mga file, header.php At footer.php. Isasama namin sila sa lahat ng pahina. Lalo na sa pangunahing pahina (file index.php), sa page na may registration form (file form_register.php) at sa pahinang may form ng pahintulot (file form_auth.php).

I-block gamit ang aming mga link, pagpaparehistro At awtorisasyon, idagdag ang mga ito sa header ng site upang maipakita ang mga ito sa lahat ng pahina. Isang link ang papasok sa page na may registration form (file form_register.php) at ang isa pa sa page na may authorization form (file form_auth.php).

Mga nilalaman ng header.php file:

Pangalan ng aming site

Bilang resulta, ganito ang hitsura ng aming pangunahing pahina:


Siyempre, maaaring may ganap na kakaibang istraktura ang iyong site, ngunit hindi ito mahalaga para sa amin ngayon. Ang pangunahing bagay ay mayroong mga link (mga pindutan) para sa pagpaparehistro at awtorisasyon.

Ngayon ay lumipat tayo sa form ng pagpaparehistro. Tulad ng naiintindihan mo na, mayroon kami nito sa file form_register.php.

Pumunta sa Database (sa phpMyAdmin), buksan ang istraktura ng talahanayan mga gumagamit at tingnan kung anong mga field ang kailangan natin. Nangangahulugan ito na kailangan namin ng mga field para sa pagpasok ng una at apelyido, isang field para sa pagpasok ng postal address (Email) at isang field para sa pagpasok ng password. At para sa mga layuning pangseguridad, magdaragdag kami ng field para sa pagpasok ng captcha.

Sa server, bilang isang resulta ng pagproseso ng form ng pagpaparehistro, iba't ibang mga error ang maaaring mangyari dahil sa kung saan ang gumagamit ay hindi makakapagrehistro. Samakatuwid, upang maunawaan ng user kung bakit nabigo ang pagpaparehistro, kinakailangang magpakita ng mga mensahe tungkol sa mga error na ito.

Bago ipakita ang form, magdagdag ng block upang ipakita ang mga mensahe ng error mula sa session.

At isa pang bagay, kung awtorisado na ang user, at dahil sa kuryusidad ay direktang pumunta siya sa pahina ng pagpaparehistro sa pamamagitan ng pagsulat sa address bar ng browser site_address/form_register.php, pagkatapos sa kasong ito, sa halip na ang form ng pagpaparehistro, magpapakita kami ng isang header na nagsasaad na siya ay nakarehistro na.

Sa pangkalahatan, ang file code form_register.php nakuha namin ito:

Nakarehistro ka na

Sa browser, ganito ang hitsura ng page na may registration form:


Gamit ang kinakailangang attribute, ginawa naming mandatory ang lahat ng field.

Bigyang-pansin ang code ng registration form kung saan ipinapakita ang captcha:


Tinukoy namin ang path sa file sa halaga ng src attribute para sa imahe captcha.php, na bumubuo ng captcha na ito.

Tingnan natin ang file code captcha.php:

Ang code ay mahusay na nagkomento, kaya ako ay tumutok sa isang punto lamang.

Sa loob ng isang function imageTtfText(), ang path patungo sa font ay tinukoy verdana.ttf. Kaya para gumana ng tama ang captcha, dapat tayong gumawa ng folder mga font, at ilagay ang font file doon verdana.ttf. Maaari mong mahanap ito at i-download ito mula sa Internet, o kunin ito mula sa archive na may mga materyales ng artikulong ito.

Tapos na kami sa HTML structure, oras na para magpatuloy.

Sinusuri ang bisa ng email gamit ang jQuery

Ang anumang form ay kailangang suriin ang bisa ng inilagay na data, kapwa sa panig ng kliyente (gamit ang JavaScript, jQuery) at sa panig ng server.

Dapat nating bigyan ng espesyal na pansin ang field ng Email. Napakahalaga na valid ang inilagay na postal address.

Para sa input field na ito, itinakda namin ang uri ng email (type="email"), bahagyang nagbabala ito sa amin laban sa mga maling format. Ngunit hindi ito sapat, dahil sa pamamagitan ng inspektor ng code na ibinibigay sa atin ng browser, madali nating mababago ang halaga ng katangian uri Sa email sa text, at iyon nga, hindi na magiging valid ang aming tseke.


At sa kasong ito, dapat tayong gumawa ng mas maaasahang pagsusuri. Upang gawin ito, gagamitin namin ang library ng jQuery mula sa JavaScript.

Upang ikonekta ang jQuery library, sa file header.php sa pagitan ng mga tag , bago ang pansarang tag , idagdag ang linyang ito:

Kaagad pagkatapos ng linyang ito, idaragdag namin ang email validation code. Dito ay magdaragdag kami ng isang code upang suriin ang haba ng ipinasok na password. Dapat ay hindi bababa sa 6 na character ang haba nito.

Gamit ang script na ito, sinusuri namin ang inilagay na email address para sa bisa. Kung nagpasok ang user ng maling Email, nagpapakita kami ng mensahe ng error tungkol dito at hindi pinagana ang button na isumite ang form. Kung maayos ang lahat, aalisin namin ang error at i-activate ang button na isumite ang form.

At kaya, tapos na kami sa pagpapatunay ng form sa panig ng kliyente. Ngayon ay maaari na naming ipadala ito sa server, kung saan gagawa din kami ng ilang mga pagsusuri at magdagdag ng data sa database.

Pagpaparehistro ng user

Ipinapadala namin ang form sa file para sa pagproseso magparehistro.php, sa pamamagitan ng POST method. Ang pangalan ng handler file na ito ay tinukoy sa attribute value aksyon. At ang paraan ng pagpapadala ay tinukoy sa halaga ng katangian paraan.

Buksan ang file na ito magparehistro.php at ang unang bagay na kailangan nating gawin ay magsulat ng function ng paglulunsad ng session at ikonekta ang file na ginawa natin kanina dbconnect.php(Sa file na ito gumawa kami ng koneksyon sa database). At saka, agad nating ideklara ang mga cell error_messages At tagumpay_mensahe sa global session array. SA error_mesages itatala namin ang lahat ng mga mensahe ng error na nangyayari sa pagpoproseso ng form, at sa tagumpay_mensahe, magre-record kami ng mga masasayang mensahe.

Bago tayo magpatuloy, kailangan nating suriin kung naisumite na ang form. Maaaring tingnan ng isang attacker ang value ng attribute aksyon mula sa form, at alamin kung aling file ang nagpoproseso ng form na ito. At maaaring may ideya siyang direktang pumunta sa file na ito sa pamamagitan ng pag-type ng sumusunod na address sa address bar ng browser: http://site_address/register.php

Kaya kailangan nating suriin para sa isang cell sa pandaigdigang POST array na ang pangalan ay tumutugma sa pangalan ng aming "Register" na button mula sa form. Sa ganitong paraan, tinitingnan namin kung ang "Register" na buton ay na-click o hindi.

Kung susubukan ng isang umaatake na direktang pumunta sa file na ito, makakatanggap sila ng mensahe ng error. Hayaan akong ipaalala sa iyo na ang $address_site variable ay naglalaman ng pangalan ng site at ito ay idineklara sa file dbconnect.php.

Ang halaga ng captcha sa session ay idinagdag noong ito ay nabuo, sa file captcha.php. Bilang paalala, muli kong ipapakita sa iyo ang piraso ng code na ito mula sa file captcha.php, kung saan idinaragdag ang halaga ng captcha sa session:

Ngayon ay magpatuloy tayo sa mismong pag-verify. Nasa file magparehistro.php, sa loob ng if block, kung saan tinitingnan namin kung na-click ang "Register" na buton, o sa halip kung saan nakasaad ang komento "" // (1) Space para sa susunod na piraso ng code"nagsusulat kami:

//Suriin ang natanggap na captcha //Trim ang mga puwang mula sa simula at dulo ng linya $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Ihambing ang natanggap na value sa value mula sa session. if($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Kung hindi tama ang captcha, ibabalik namin ang user sa pahina ng pagpaparehistro, at doon kami magpapakita ng mensahe ng error sa kanya na mali ang captcha niyang ipinasok . $error_message = "

Error! Maling captcha ang ipinasok mo

"; // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] = $error_message; // Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: " .$address_site ."/form_register.php"); //Ihinto ang script exit(); ) // (2) Ilagay para sa susunod na piraso ng code )else( //Kung ang captcha ay hindi naipasa o ito ay walang laman na exit ("

Error! Walang verification code, iyon ay, isang captcha code. Maaari kang pumunta sa pangunahing pahina.

"); }

Susunod, kailangan nating iproseso ang natanggap na data mula sa POST array. Una sa lahat, kailangan nating suriin ang mga nilalaman ng pandaigdigang POST array, iyon ay, kung mayroong mga cell doon na ang mga pangalan ay tumutugma sa mga pangalan ng mga input field mula sa aming form.

Kung umiiral ang cell, pagkatapos ay pinuputol namin ang mga puwang mula sa simula at dulo ng linya mula sa cell na ito, kung hindi, ire-redirect namin ang user pabalik sa pahina na may form ng pagpaparehistro.

Susunod, pagkatapos naming i-trim ang mga puwang, idinaragdag namin ang linya sa variable at suriin ang variable na ito para sa kawalan ng laman; kung ito ay walang laman, pagkatapos ay magpapatuloy kami, kung hindi, ire-redirect namin ang gumagamit pabalik sa pahina na may form ng pagpaparehistro.

Idikit ang code na ito sa tinukoy na lokasyon" // (2) Space para sa susunod na piraso ng code".

/* Suriin kung mayroong data na ipinadala mula sa form sa pandaigdigang array $_POST at balutin ang isinumiteng data sa mga regular na variable.*/ if(isset($_POST["first_name"]))( //Trim ang mga puwang mula sa simula at dulo ng string na $first_name = trim ($_POST["first_name"]); // Suriin ang variable para sa emptiness if(!empty($first_name))( // Para sa kaligtasan, i-convert ang mga espesyal na character sa HTML entity $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

Ilagay ang iyong pangalan

Nawawala ang field ng pangalan

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) if( isset($_POST["apelyido"]))( //Puwang sa simula at dulo ng linya $last_name = trim($_POST["apelyido"]); if(!empty($last_name)) ( // Para sa seguridad , i-convert ang mga espesyal na character sa HTML entity $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

Pakilagay ang iyong apelyido

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) )iba ( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

Nawawala ang field ng apelyido

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) if( isset($_POST["email"]))( //Trim space mula sa simula at dulo ng linya $email = trim ($_POST["email"]); if(!empty($email)) ($email = htmlspecialchars ($email, ENT_QUOTES); // (3) Lokasyon ng code para sa pagsuri sa format ng email address at sa pagiging natatangi nito )else( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .="

Ilagay ang iyong email

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) )iba ( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) if( isset($_POST["password"]))( //Trim space mula sa simula at dulo ng string $password = trim ($_POST["password"]); if(!empty($password)) ($password = htmlspecialchars ($password, ENT_QUOTES); //I-encrypt ang password $password = md5($password."top_secret"); )else( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .="

Ipasok ang iyong password

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) )iba ( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) // (4) Lugar para sa code para sa pagdaragdag ng user sa database

Ang partikular na kahalagahan ay ang larangan email. Dapat nating suriin ang format ng natanggap na postal address at ang pagiging natatangi nito sa database. Ibig sabihin, mayroon bang user na may parehong email address na nakarehistro na?

Sa tinukoy na lokasyon" // (3) Code location para tingnan ang format ng postal address at ang uniqueness nito" idagdag ang sumusunod na code:

//Suriin ang format ng natanggap na email address gamit ang isang regular na expression $reg_email = "/^**@(+(*+)*\.)++/i"; //Kung ang format ng natanggap na email address ay hindi tumutugma sa regular na expression kung(!preg_match($reg_email, $email))( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

Naglagay ka ng maling email

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); ) // Sinusuri namin kung ang naturang address ay nasa database na. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Kung ang bilang ng natanggap ay eksaktong isang row, ibig sabihin ang user na may ganitong email address ay nakarehistro na if($result_query->num_rows == 1)( //Kung ang resulta ay hindi false if(($row = $result_query->fetch_assoc()) != false) ( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

Nakarehistro na ang isang user na may ganitong email address

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); )else( // I-save ang mensahe ng error sa session . $_SESSION["error_messages"] .="

Error sa query sa database

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); ) /* pagsasara ng seleksyon */ $ result_query-> close(); //Ihinto ang script exit(); ) /* pagsasara ng seleksyon */ $result_query->close();

At kaya, tapos na kami sa lahat ng mga pagsusuri, oras na para idagdag ang user sa database. Sa tinukoy na lokasyon" // (4) Lugar para sa code para sa pagdaragdag ng user sa database" idagdag ang sumusunod na code:

//Query para magdagdag ng user sa database $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // I-save ang mensahe ng error sa session. $_SESSION["error_messages"] .= "

Error sa kahilingang magdagdag ng user sa database

"; //Ibalik ang user sa header ng pahina ng pagpaparehistro("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_register.php"); //Ihinto ang script exit(); )iba( $_SESSION["success_messages"] = "

Matagumpay na nakumpleto ang pagpaparehistro!!!
Ngayon ay maaari kang mag-log in gamit ang iyong username at password.

"; //Ipadala ang user sa header ng pahina ng awtorisasyon("HTTP/1.1 301 Permanenteng Inilipat"); header("Lokasyon: ".$address_site."/form_auth.php"); ) /* Pagkumpleto ng kahilingan */ $ result_query_insert-> close(); // Isara ang koneksyon sa database $mysqli->close();

Kung may naganap na error sa kahilingang magdagdag ng user sa database, nagdaragdag kami ng mensahe tungkol sa error na ito sa session at ibabalik ang user sa pahina ng pagpaparehistro.

Kung hindi, kung naging maayos ang lahat, nagdaragdag din kami ng mensahe sa session, ngunit sa pagkakataong ito ay mas kaaya-aya, ibig sabihin, sasabihin namin sa user na matagumpay ang pagpaparehistro. At nire-redirect namin ito sa page na may authorization form.

Ang script para sa pagsuri sa format ng email address at haba ng password ay nasa file header.php, kaya malalapat din ito sa mga field mula sa form na ito.

Sinimulan din ang session sa file header.php, kaya sa file form_auth.php Hindi na kailangang magsimula ng session, dahil magkakaroon tayo ng error.


Tulad ng nasabi ko na, gumagana din dito ang script para sa pagsuri sa format ng email address at haba ng password. Samakatuwid, kung ang gumagamit ay nagpasok ng maling email address o maikling password, agad siyang makakatanggap ng mensahe ng error. Isang buton pumasok magiging hindi aktibo.

Pagkatapos ayusin ang mga error, ang pindutan pumasok nagiging aktibo, at magagawa ng user na isumite ang form sa server, kung saan ito ipoproseso.

Pahintulot ng user

Upang i-attribute ang halaga aksyon ang kapansanan sa pahintulot ay may tinukoy na file auth.php, nangangahulugan ito na ipoproseso ang form sa file na ito.

At kaya, buksan ang file auth.php at sumulat ng code upang iproseso ang form ng pahintulot. Ang unang bagay na kailangan mong gawin ay magsimula ng isang session at ikonekta ang file dbconnect.php upang kumonekta sa database.

Kapag nag-click ka sa exit link mula sa site, dadalhin kami sa isang file logout.php, kung saan sinisira lang namin ang mga cell na may email address at password mula sa session. Pagkatapos nito, ibabalik namin ang gumagamit pabalik sa pahina kung saan na-click ang link labasan.

File code logout.php:

Iyon lang. Ngayon alam mo na kung paano ipatupad at iproseso ang mga form ng pagpaparehistro at awtorisasyon ng user sa iyong website. Ang mga form na ito ay matatagpuan sa halos bawat website, kaya dapat malaman ng bawat programmer kung paano gawin ang mga ito.

Natutunan din namin kung paano i-validate ang data ng input, kapwa sa panig ng kliyente (sa browser, gamit ang JavaScript, jQuery) at sa panig ng server (gamit ang PHP). Natutunan din namin kung paano magpatupad ng pamamaraan para sa pag-alis sa site.

Ang lahat ng mga script ay nasubok at gumagana. Maaari mong i-download ang archive gamit ang mga file ng maliit na site na ito mula sa link na ito.

Sa hinaharap susulat ako ng isang artikulo kung saan ilalarawan ko. At plano ko ring magsulat ng isang artikulo kung saan ako ay magpapaliwanag (nang hindi nagre-reload ng pahina). Kaya, upang manatiling alam tungkol sa pagpapalabas ng mga bagong artikulo, maaari kang mag-subscribe sa aking website.

Kung mayroon kang anumang mga katanungan, mangyaring makipag-ugnay sa akin, at kung mapansin mo ang anumang error sa artikulo, mangyaring ipaalam sa akin.

Lesson Plan (Bahagi 5):

  • Paglikha ng HTML structure para sa authorization form
  • Pinoproseso namin ang natanggap na data
  • Ipinapakita namin ang pagbati ng user sa header ng site
  • Nagustuhan mo ba ang artikulo?

    Hindi ko alam kung bakit... hindi, alam ko kung bakit hindi mo mapagana ang direktiba ng register_globals, ngunit hindi ko alam kung bakit sa panitikan, bilang panuntunan, walang sinabi tungkol dito.

    Sa artikulong ito susubukan kong alisin ang lahat ng nakaupo dito sa tangke at ipaliwanag kung ano ang (lalo na para sa mga nasa armored train - tala ng editor). Ito ay hindi para sa wala na ang ilang mga hoster ay hindi pinagana ang direktiba na ito. Kaya…

    Paano ito gumagana

    Sa mga setting ng PHP (php.ini file) mayroong ganoong register_globals na direktiba. Ang kahulugan nito ay kung ito ay pinagana (register_globals = on), ang lahat ng mga variable na ipinasa sa pamamagitan ng GET at POST ay awtomatikong mairerehistro bilang global. Ano ang ibig sabihin nito?

    Halimbawa, ipinapasa namin ang GET method sa index.php script ng ilang page value: index.php?page=2. Ang naipasa na halaga ay naka-imbak sa isang GET array at maaaring gamitin sa isang script bilang $_GET["page"]. Gayunpaman, kung pinagana namin ang register_globals, isang variable na $page ang gagawin para sa naipasa na halaga, na available sa anumang bahagi ng script ng index.php.

    Isang maliit na buod at karagdagan. Kapag ang register_globals ay pinagana, tatlong kopya ng variable ang gagawin: sa GET array, sa GLOBALS array, at simpleng variable mismo ($_GET["page"], $GLOBALS["page"], $page), habang kapag ang register_globals ay hindi pinagana, ang naipasa na halaga ay maa-access lamang sa pamamagitan ng GET array ($_GET["page"]). Tandaan.

    Panganib sa paggamit

    Tingnan natin ang isang simpleng halimbawa para maunawaan kung ano ang nakalaan para sa atin (mula 3 hanggang 5 taon - tala ng editor). Upang gawing mas madali, sasabihin ko kaagad na ang $login at $password ay mga variable na ipinasa ng GET/POST method.

    Maikling tungkol sa kung ano ang ginagawa ng script:

      Linya 2. Gumagawa kami ng isang kahilingan sa database upang makuha ang totoong password para sa pag-login na ipinasok ng user.

      Linya 3. Nakukuha namin ang password na ito at itinalaga ito sa variable na $real_pass.

      Linya 4. Inihambing namin ang tunay at inilagay na password at kung magkatugma ang mga ito, ang variable na $check ay itatalagang totoo.

      Linya 5-8. Kung totoo ang $check, isusulat namin na matagumpay ang pahintulot, atbp.

    Ang iminungkahing senaryo, sa kahulugan, ay ang pinaka-leak sa mundo, at ngayon ay ipapakita ko sa iyo ang mga butas na ito. Kundisyon: register_globals ay pinagana.

    Sabihin nating ang paglipat ay isinasagawa gamit ang GET method. Pagkatapos ang url ay magiging ganito ang hitsura:
    www.site.com/index.php?login =admin&password =qwerty
    Malinaw na ang mga pandaigdigang variable na $login at $password ay agad na nilikha. Ngayon tingnan ang script. Naglalaman ito ng variable na $check. Paano kung ipasa mo ito sa pamamagitan ng URL?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Pagkatapos ang pagsuri sa pagtutugma ng password ay na-bypass at ang gumagamit ay agad na pinahintulutan (pagkatapos ng lahat, naaalala mo ba na ang 1 ay totoo, at ang 0 ay hindi totoo?). Ang parehong resulta ay magaganap kung magsusulat tayo www.lugar.com/index.php?suriin =1 . At kahit na gumamit ka ng paraan ng POST, gagana pa rin ang lahat ng mga panloloko, dahil kapag pinagana ang register_globals, hindi mahalaga kung anong paraan ang iyong ginagamit - GET o POST.

    Sa palagay ko ay may tanong ang isang tao, paano malalaman ng isang cracker ang tungkol sa variable ng tseke, na responsable ito sa lahat? Kung hindi mo pa ipinakita ang script sa sinuman, malamang na hindi nila ito malalaman. Gayunpaman, hindi lahat ay gumagamit ng kanilang sariling mga script, CMS, atbp., ngunit ginagamit kung ano ang magagamit sa network. Sa ganitong mga kaso, ang isang cracker, halimbawa, ay maaaring pag-aralan ang CMS code at pag-atake sa mga site na nilikha sa tulong nito.

    Gayunpaman, hindi lahat ng mga hoster ay hindi pinagana ang register_globals, at kahit na ang iyong mga script ay idinisenyo na hindi naka-enable ang register_globals, maaari pa ring i-hack ng cracker ang iyong script gamit ang kahinaan ng direktiba na ito.

    Kunin natin ang ating halimbawa. Upang protektahan ito kung sakaling paganahin ang register_globals, pagkatapos ng linya kung ($password==$tunay_pumasa)$suriin =totoo; idagdag ang sumusunod: iba pa$suriin =huwad;. Sa kasong ito, kahit na ang check variable na katumbas ng isa ay ipinasa ng GET method, ang script ay magtatakda pa rin ng $check=false kung ang password ay mali.

    Oo, gusto ko ring ituon ang iyong pansin sa katotohanan na kung i-off mo ang register_globals, hindi gagana ang aming halimbawa. At para gumana ito, kailangan mong isulat ang $login = $_POST["login"]; $password = $_POST["password"];

    Isa-isahin natin...

    at gumuhit ng dalawang pangunahing konklusyon:

    1) Kapag pinagana ang register_globals, maaari mong ipasa ang iba't ibang mga variable, ang mga halaga kung saan hindi kinakalkula na matatanggap sa pamamagitan ng GET o POST.

    2) Register_globals mismo ay hindi masyadong mapanganib bilang isang baluktot na nakasulat na script.

    Yan lamang para sa araw na ito! Ako ay labis na natutuwa na makita ang iyong mga komento, komento, mungkahi at puna lamang. Samakatuwid, magsulat, huwag mahiya!

    Sa mga hangarin para sa isang matagumpay na linggo,
    Alexander SHUYSKY