Posljednja izmjena 20. avgusta 2019. od strane Vincyja.

Prijava i registracija korisnika su osnovni preduvjet za bilo koju CMS aplikaciju. Ovo je početni rad prilikom pokretanja projekta. Aplikacija sa autentifikacijom za prijavu korisnika pruža sigurnost sprečavanjem anonimnog pristupa. Postoje različiti načini da se omogući autentikacija u našoj aplikaciji, kao što je omogućavanje OAuth prijave ili implementacijom jedinstvene prijave (SSO) i sličnih drugih načina. U prethodnom tutorijalu, vidjeli smo kako implementirati i također o .

Ovaj primjer uključuje i funkcije prijave i registracije. Koristio sam MySQL bazu podataka za skladištenje registrovanih članova. Registracija korisnika će sadržavati unos za dobivanje detalja od korisnika. Nakon podnošenja ovog obrasca, podaci obrasca se objavljuju u PHP-u i pohranjuju u bazu podataka. Korisnička lozinka će biti šifrirana prije pohranjivanja u bazu podataka. prije postavljanja u PHP kod. Kada je korisnik prijavljen sa važećim akreditivima, tada će korisniku i njemu biti dozvoljeno da nastave dalje.

Obrazac za registraciju korisnika

Ovaj kod služi za prikaz obrasca za registraciju korisniku. Kada korisnik pošalje obrazac sa svojim detaljima, JavaScript funkcija će biti pozvana da potvrdi korisnički unos. Nakon uspješne validacije, PHP kod će pročitati objavljene podatke obrasca kako bi izvršio umetanje baze podataka.

">

JavaScript validacija će se pobrinuti za provjeru obaveznih polja koja nisu prazna, kao i za provjeru formata e-pošte s šablonom regularnog izraza.

Ovaj PHP kod za kreiranje umetanja koristeći podatke obrasca za registraciju. Nakon izvršenja umetanja baze podataka, odgovor uspjeha/greške će biti poslan za potvrdu korisnika.

openConnection(); $sql1 = "odaberite ime, email od tbl_registered_users gde email="$email""; $user = $db->query($sql1); $result = $user->fetchAll(); $_SESSION["emailname"] = $result["email"]; if (prazno($result)) ( $sql = "ubaci u tbl_registered_users (ime, e-pošta, lozinka) vrijednosti("$name","$email","$password")"; $db->exec($sql ); $database->closeConnection(); $response = array("type" => "uspjeh", "message" => "Uspješno ste se registrovali.
Sada se prijavite."); ) else ( $response = array("type" => "error", "message" => "E-pošta je već u upotrebi."); ) ) ?>

Provjera autentičnosti prijave pomoću PHP-a

Registrirani korisnik se može prijaviti u aplikaciju putem ovog obrasca za prijavu. Provjera autentičnosti za prijavu se vrši usklađivanjem e-pošte i lozinke za prijavu s bazom podataka registriranih korisnika. Ako se pronađe podudaranje, aplikacija će omogućiti korisniku da nastavi dalje. U suprotnom, panel za prijavu će potvrditi korisnika o nevažećem pokušaju.

PHP kod za provjeru valjanosti korisničke prijave s bazom podataka je prikazan ispod. Nakon uspješne prijave, preusmjeravam korisnika na dashboard.php. Na kontrolnoj tabli će se prikazati poruka dobrodošlice obraćanjem prijavljenom članu. Također, postojat će opcija za odjavu iz trenutne sesije.

openConnection(); $sql = "odaberite * od tbl_registered_users gde je email = "$email" i lozinka= "$password""; $user = $db->query($sql); $result = $user->fetchAll(PDO::FETCH_ASSOC); $id = $result["id"]; $name = $result["name"]; $email = $rezult["e-pošta"]; $_SESSION["name"] = $name; $_SESSION["id"] = $id; $database->closeConnection(); header("location: dashboard.php"); ) ?>

U ovom članku ćete naučiti kako kreirati obrazac za registraciju i autorizaciju koristeći HTML, JavaScript, PHP i MySql. Takvi oblici se koriste na gotovo svim stranicama, bez obzira na njihovu vrstu. Kreirani su za forum, i za online prodavnicu i za društvene mreže (kao što su Facebook, Twiter, Odnoklassniki) i za mnoge druge vrste stranica.

Ako imate web lokaciju na svom lokalnom računalu, nadam se da već imate . Ništa neće raditi bez toga.

Kreiranje tabele u bazi podataka

Da bismo implementirali registraciju korisnika, najprije nam je potrebna Baza podataka. Ako ga već imate, onda odlično, inače, morate ga kreirati. U članku detaljno objašnjavam kako to učiniti.

I tako, imamo bazu podataka (skraćeno DB), sada treba da kreiramo tabelu korisnika u koje ćemo dodati naše registrovane korisnike.

Kako napraviti tablicu u bazi podataka, također sam objasnio u članku. Prije kreiranja tabele, moramo definirati koja će polja sadržavati. Ova polja će odgovarati poljima iz obrasca za registraciju.

Dakle, pomislili smo, zamislili koja polja će imati naš obrazac i kreirali tabelu korisnika sa ovim poljima:

  • id- Identifikator. Polje id treba biti u svakoj tabeli iz baze podataka.
  • ime- Da sačuvam ime.
  • prezime- Da sačuvam prezime.
  • email- Da sačuvate poštansku adresu. Koristićemo e-mail kao login, tako da ovo polje mora biti jedinstveno, odnosno da ima JEDINSTVEN indeks.
  • email_status- Polje za označavanje da li je pošta potvrđena ili ne. Ako je pošta potvrđena, tada će imati vrijednost 1, u suprotnom vrijednost 0.
  • lozinka- Da sačuvate lozinku.


Ako želite da vaš formular za registraciju ima još polja, možete ih dodati i ovdje.

To je to, naš sto korisnika spreman. Idemo na sljedeći korak.

Veza sa bazom podataka

Napravili smo bazu podataka, sada se moramo povezati s njom. Povezićemo se pomoću MySQLi PHP ekstenzije.

U folderu naše stranice kreirajte datoteku s imenom dbconnect.php, a u njemu pišemo sljedeću skriptu:

Greška u vezi sa bazom podataka. Opis greške: ".mysqli_connect_error()."

"; exit(); ) // Postavite kodiranje veze $mysqli->set_charset("utf8"); //Radi praktičnosti, dodajte varijablu ovdje koja će sadržavati ime naše stranice $address_site = "http://testsite .local" ; ?>

Ovaj fajl dbconnect.php morat će biti spojen na rukovaoce obrascima.

Obratite pažnju na varijablu $address_site, ovdje sam naznačio naziv moje test stranice na kojoj ću raditi. U skladu s tim naznačavate naziv svoje stranice.

Struktura sajta

Pogledajmo sada HTML strukturu naše web stranice.

Premjestite zaglavlje i podnožje stranice u zasebne fajlove, header.php i footer.php. Povezat ćemo ih na svim stranicama. Naime, na glavnoj (fil index.php), na stranicu sa formularom za registraciju (fil form_register.php) i na stranici sa obrascem ovlaštenja (fil form_auth.php).

Blokirajte našim linkovima, provjeri i autorizacija, dodajte u zaglavlje stranice tako da se prikazuju na svim stranicama. Jedan link će ući stranica obrasca za registraciju(fajl form_register.php), a drugi na stranicu sa obrazac autorizacije(fajl form_auth.php).

Sadržaj header.php fajla:

Naziv naše stranice

Kao rezultat, naša glavna stranica izgleda ovako:


Naravno, vaša stranica može imati potpuno drugačiju strukturu, ali to nam sada nije važno. Glavna stvar je da postoje veze (dugmad) za registraciju i autorizaciju.

Sada idemo na formular za registraciju. Kao što ste već shvatili, imamo to u dosijeu form_register.php.

Idemo u bazu podataka (u phpMyAdmin), otvaramo strukturu tabele korisnika i vidimo koja polja su nam potrebna. Dakle, potrebna su nam polja za unos imena i prezimena, polje za unos poštanske adrese (Email) i polje za unos lozinke. I iz sigurnosnih razloga, dodaćemo polje za unos captcha.

Na serveru, kao rezultat obrade obrasca za registraciju, mogu doći do raznih grešaka zbog kojih se korisnik neće moći registrovati. Stoga, kako bi korisnik razumio zašto registracija nije uspjela, potrebno mu je prikazati poruke o ovim greškama.

Prije prikaza obrasca, dodajemo blok za prikaz poruka o grešci iz sesije.

I još jedan trenutak, ako je korisnik već autorizovan, i radi interesa, direktno ulazi na stranicu za registraciju pisanjem u adresnoj traci pretraživača website_url/form_register.php, tada ćemo u ovom slučaju, umjesto obrasca za registraciju, prikazati naslov za njega da je već registriran.

Općenito, kod datoteke form_register.php dobili smo ovako:

Već ste registrovani

U pretraživaču stranica za registraciju izgleda ovako:


Korišćenjem potreban atribut, sva polja smo učinili obaveznim.

Obratite pažnju na šifru obrasca za registraciju gdje captcha se prikazuje:


Mi smo u vrijednosti atributa src za sliku naveli putanju do datoteke captcha.php, koji generiše ovu captcha.

Pogledajmo kod datoteke captcha.php:

Kod je dobro komentarisan, pa ću se fokusirati samo na jednu tačku.

Unutar funkcije imageTtfText(), put do fonta je specificiran verdana.ttf. Dakle, da bi captcha radila ispravno, moramo kreirati folder fontove, i stavite datoteku fonta tamo verdana.ttf. Možete ga pronaći i preuzeti s Interneta ili preuzeti iz arhive s materijalima ovog članka.

Završili smo sa HTML strukturom, vrijeme je da krenemo dalje.

Provjera valjanosti e-pošte pomoću jQueryja

Bilo kojoj formi je potrebna validacija unesenih podataka, kako na strani klijenta (koristeći JavaScript, jQuery) tako i na strani servera.

Posebnu pažnju moramo obratiti na polje Email. Veoma je važno da unesena email adresa bude važeća.

Za ovo polje za unos postavljamo tip email (type="email"), ovo nas malo upozorava na neispravne formate. Ali, to nije dovoljno, jer preko kodnog inspektora koji nam pruža pretraživač možete lako promijeniti vrijednost atributa tip With email on tekst, i to je to, naš ček više neće vrijediti.


I u tom slučaju moramo izvršiti pouzdaniju provjeru. Da bismo to uradili, koristićemo jQuery biblioteku iz JavaScript-a.

Da biste povezali jQuery biblioteku, u datoteci header.php između oznaka , prije završne oznake , dodajte ovaj red:

Odmah nakon ovog retka dodajte kod za provjeru valjanosti e-pošte. Ovdje dodajemo kod za provjeru dužine unesene lozinke. Mora imati najmanje 6 znakova.

Uz pomoć ove skripte provjeravamo ispravnost unesene adrese e-pošte. Ako je korisnik unio pogrešan e-mail, tada prikazujemo grešku o tome i deaktiviramo dugme za slanje obrasca. Ako je sve u redu, uklanjamo grešku i aktiviramo dugme za slanje obrasca.

I tako, sa validacijom obrasca na strani klijenta, gotovi smo. Sada ga možemo poslati na server, gdje ćemo također napraviti par provjera i dodati podatke u bazu podataka.

Registracija korisnika

Obrazac šaljemo na obradu u fajl register.php, putem POST metode. Ime ove datoteke rukovanja, navedeno u vrijednosti atributa akcija. A metoda slanja je navedena u vrijednosti atributa metoda.

Otvorite ovaj fajl register.php i prva stvar koju treba da uradimo je da napišemo funkciju pokretanja sesije i uključimo datoteku koju smo kreirali ranije dbconnect.php(U ovoj datoteci smo uspostavili vezu sa bazom podataka). Pa ipak, odmah proglasite ćelije error_messages i uspjeh_poruke u globalnom nizu sesije. AT error_mesages zabilježit ćemo sve poruke o greškama koje se javljaju tokom obrade obrasca i u uspjeh_poruke Hajde da napišemo srećne poruke.

Prije nego što nastavimo, moramo provjeriti da li je obrazac uopšte dostavljen. Napadač može pogledati vrijednost nekog atributa akcija iz obrasca i saznajte koja datoteka obrađuje ovaj obrazac. I on može doći na ideju da ide direktno na ovu datoteku tako što će upisati sljedeću adresu u adresnu traku pretraživača: http://site_site/register.php

Dakle, moramo provjeriti postoji li ćelija u globalnom POST nizu čije ime odgovara imenu našeg dugmeta "Registriraj se" iz obrasca. Tako provjeravamo da li je pritisnuto dugme "Registriraj se" ili ne.

Ako napadač pokuša da ode direktno na ovu datoteku, dobiće poruku o grešci. Podsjećam vas da varijabla $address_site sadrži ime stranice i da je deklarirana u datoteci dbconnect.php.

Greška! glavna stranica .

"); } ?>

Captcha vrijednost u sesiji je dodata tokom njenog generiranja, u datoteci captcha.php. Podsjećamo, pokazaću još jednom ovaj dio koda iz datoteke captcha.php, gdje se captcha vrijednost dodaje sesiji:

A sada da pređemo na sam test. U fajlu register.php, unutar if bloka, gdje provjeravamo da li je pritisnuto dugme "Registriraj se", odnosno gdje je komentar " // (1) Mjesto za sljedeći dio koda"mi pišemo:

//Provjera primljene captcha //Skrati razmake od početka i od kraja stringa $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Uporedi primljenu vrijednost sa vrijednošću iz sesije. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Ako captcha nije tačna, vratite korisnika na stranicu za registraciju i tamo ćemo prikazati poruku o grešci da je unio pogrešan captcha. $error_message = "

Greška! Uneli ste pogrešan captcha

"; // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 trajno premješten"); header("Lokacija: " .$address_site ."/form_register.php"); //Zaustavi skriptu exit(); ) // (2) Mjesto za sljedeći dio koda )else( //Ako captcha nije proslijeđena ili je prazan izlaz ("

Greška! Ne postoji verifikacioni kod, odnosno captcha kod. Možete otići na glavnu stranicu.

"); }

Zatim moramo obraditi primljene podatke iz POST niza. Prije svega, trebamo provjeriti sadržaj globalnog POST niza, odnosno da li tamo postoje ćelije čija se imena poklapaju s nazivima polja za unos iz našeg obrasca.

Ako ćelija postoji, onda iz ove ćelije skraćujemo razmake od početka i od kraja niza, u suprotnom preusmjeravamo korisnika nazad na stranicu sa formularom za registraciju.

Dalje, nakon što su razmaci srezani, dodamo string varijablu i provjeravamo ovu varijablu da li je prazna, ako nije prazna, onda idemo dalje, u suprotnom preusmjeravamo korisnika nazad na stranicu sa formularom za registraciju.

Zalijepite ovaj kod na navedenu lokaciju // (2) Mjesto za sljedeći dio koda".

/* Provjerava da li globalni niz $_POST sadrži podatke poslane iz obrasca i priloži dostavljene podatke u regularne varijable.*/ if(isset($_POST["first_name"]))( // Skrati razmake od početka i kraja string $first_name = trim($_POST["first_name"]); //Provjerite da li je varijabla prazna if(!empty($first_name))( // Radi sigurnosti, pretvorite posebne znakove u HTML entitete $first_name = htmlspecialchars( $first_name, ENT_QUOTES) ; )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Unesite svoje ime

Nedostaje polje za ime

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) if( isset($_POST["last_name"]))( // Skrati razmake od početka i kraja niza $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Radi sigurnosti, pretvorite posebne znakove u HTML entitete $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Unesite svoje prezime

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Nedostaje polje za ime

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) if( isset($_POST["email"]))( // Skrati razmake od početka i kraja niza $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Mjesto koda za provjeru formata adrese e-pošte i njene jedinstvenosti )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages" ] .="

Unesite svoju e-poštu

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) if( isset($_POST["password"]))( // Skrati razmake od početka i kraja niza $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Šifriranje lozinke $password = md5($password."top_secret"); )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .="

Unesite svoju lozinku

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) // (4) Mjesto za kod za dodavanje korisnika u bazu podataka

Oblast je od posebnog značaja. email. Moramo provjeriti format primljene poštanske adrese i njenu jedinstvenost u bazi podataka. Odnosno, da li je korisnik sa istom adresom e-pošte već registrovan.

Na navedenoj lokaciji" // (3) Mjesto koda za provjeru formata poštanske adrese i njene jedinstvenosti" dodajte sljedeći kod:

//Provjerite format primljene email adrese koristeći regularni izraz $reg_email = "/^**@(+(*+)*\.)++/i"; //Ako format primljene adrese e-pošte ne odgovara regularnom izrazu if(!preg_match($reg_email, $email))( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Unijeli ste nevažeći email

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) // Provjerite da li već postoji takva adresa u bazi podataka $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); Ako postoji su tačno jedan red, onda je korisnik sa ovom adresom e-pošte već registrovan if($result_query->num_rows == 1)( //Ako rezultat nije netačan if(($row = $result_query->fetch_assoc()) ! = false) ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Korisnik sa ovom email adresom je već registrovan

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); )else( //Sačuvajte poruku o grešci na sesiju .$_SESSION["error_messages"] .= "

Greška u upitu baze podataka

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); ) /* zatvorite odabir */ $ result_query-> close(); //Zaustavi skriptu exit(); ) /* zatvori odabir */ $result_query->close();

I tako, završili smo sa svim provjerama, vrijeme je da dodamo korisnika u bazu podataka. Na navedenoj lokaciji" // (4) Mjesto za kod za dodavanje korisnika u bazu podataka" dodajte sljedeći kod:

//Upit za dodavanje korisnika u bazu podataka $result_query_insert = $mysqli->query("INSERT INTO `users` (ime_ime, prezime, email, lozinka) VRIJEDNOSTI ("".$first_name."", "".$last_name ." ", ".$email."", ".$password."")"); if(!$result_query_insert)( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Greška zahtjeva za dodavanje korisnika u bazu podataka

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); )else( $_SESSION["success_messages"] = "

Registracija uspješno obavljena!!!
Sada se možete prijaviti koristeći svoje korisničko ime i lozinku.

"; //Pošalji korisnika na stranicu za prijavu header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); ) /* Dovrši zahtjev */ $ result_query_insert-> close(); //Zatvaranje veze baze podataka $mysqli->close();

Ako dođe do greške u zahtjevu za dodavanje korisnika u bazu podataka, sesiji dodajemo poruku o ovoj grešci i vraćamo korisnika na stranicu za registraciju.

Inače, ako je sve prošlo kako treba, dodajemo i poruku sesiji, ali ona je već ugodnija, naime, kažemo korisniku da je registracija uspjela. I mi ga preusmjeravamo na stranicu sa formularom za autorizaciju.

Skripta za provjeru formata email adrese i dužine lozinke je u datoteci header.php, tako da će uticati i na polja iz tog obrasca.

Sesija je također pokrenuta u datoteci header.php, dakle u fajlu form_auth.php sesija ne mora biti pokrenuta, jer dobijamo grešku.


Kao što sam rekao, ovdje radi i skripta za provjeru formata mail adrese i dužine lozinke. Stoga, ako korisnik unese pogrešnu adresu e-pošte ili kratku lozinku, odmah će dobiti poruku o grešci. Dugme ućiće postati neaktivan.

Nakon ispravljanja grešaka, dugme ući postaje aktivan i korisnik može poslati obrazac na server gdje će biti obrađen.

Autorizacija korisnika

Pripisati vrijednost akcija formular za autorizaciju ima fajl auth.php, što znači da će obrazac biti obrađen u ovoj datoteci.

Pa hajde da otvorimo fajl auth.php i napišite kod za obradu formulara za autorizaciju. Prva stvar koju treba učiniti je započeti sesiju i uključiti datoteku dbconnect.php za povezivanje sa bazom podataka.

//Objavite ćeliju za dodavanje grešaka koje se mogu pojaviti tokom obrade obrasca. $_SESSION["error_messages"] = ""; //Proglasite ćeliju za dodavanje uspješnih poruka $_SESSION["success_messages"] = "";

/* Provjerite da li je obrazac poslat, odnosno da li je kliknuto na dugme Prijava. Ako da, onda idemo dalje, ako ne, tada ćemo korisniku prikazati poruku o grešci u kojoj se navodi da je otišao direktno na ovu stranicu. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Mjesto za sljedeći dio koda )else( exit("

Greška! Direktno ste pristupili ovoj stranici, tako da nema podataka za obradu. Možete otići na glavnu stranicu.

"); }

//Provjerite primljenu captcha if(isset($_POST["captcha"]))( //Skratite razmake od početka i kraja niza $captcha = trim($_POST["captcha"]); if(!empty ($captcha ))( //Uporedi primljenu vrijednost sa vrijednošću iz sesije. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != ""))( // Ako je captcha nevažeći, vraćamo korisnika na stranicu za autorizaciju i tamo ćemo prikazati poruku o grešci da je unio pogrešan captcha. $error_message = "

Greška! Uneli ste pogrešan captcha

"; // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu autorizacije header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: " .$address_site ."/form_auth.php"); //Zaustavite skriptu exit(); ) )else( $error_message = "

Greška! Polje za unos captcha ne smije biti prazno.

"; // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu autorizacije header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: " .$address_site ."/form_auth.php"); //Zaustavi skriptu exit(); ) //(2) Mjesto za obradu mail adrese //(3) Mjesto za obradu lozinke //(4) Mjesto za postavljanje upita bazi podataka ) else ( //Ako captcha nije proslijeđena exit("

Greška! Ne postoji verifikacioni kod, odnosno captcha kod. Možete otići na glavnu stranicu.

"); }

Ako je korisnik ispravno unio verifikacioni kod, idemo dalje, u suprotnom ga vraćamo na stranicu za autorizaciju.

Provjera adrese e-pošte

// Skrati razmake od početka i kraja stringa $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Provjerite format primljene email adrese koristeći regularni izraz $ reg_email = " /^**@(+(*+)*\.)++/i"; //Ako format primljene adrese e-pošte ne odgovara regularnom izrazu if(!preg_match($reg_email, $email ))( // Sačuvaj u poruku o grešci sesije.$_SESSION["error_messages"] .= "

Unijeli ste nevažeći email

"; //Vratite korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Polje za unos poštanske adrese (e-mail) ne smije biti prazno.

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Ne postoji polje za unos e-pošte

"; //Vratite korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavite skriptu exit(); ) // (3) Mjesto za obradu lozinke

Ako je korisnik unio adresu e-pošte u pogrešnom formatu ili je vrijednost polja e-mail adrese prazna, onda ga vraćamo na stranicu za autorizaciju, gdje prikazujemo poruku o tome.

Provjera lozinke

Sljedeće polje koje treba obraditi je polje lozinke. Na određeno mjesto" //(3) Mjesto za obradu lozinke", mi pišemo:

If(isset($_POST["password"]))( // Skratite razmake od početka i kraja niza $password = trim($_POST["password"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); // Šifrirajte lozinku $password = md5($password."top_secret"); )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] . = "

Unesite svoju lozinku

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Ne postoji polje za unos lozinke

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavite skriptu exit(); )

Ovdje pomoću funkcije md5 () šifriramo primljenu lozinku, jer u bazi podataka imamo lozinke u šifriranom obliku. Dodatna tajna riječ u šifriranju, u našem slučaju " top_secret" mora biti onaj koji je korišten prilikom registracije korisnika.

Sada trebate napraviti upit bazi podataka o odabiru korisnika čija je e-mail adresa jednaka primljenoj mail adresi, a lozinka je jednaka primljenoj lozinki.

//Upit u bazu podataka o odabiru korisnika. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND password = ".$password."""); if(!$result_query_select)( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Greška upita pri odabiru korisnika iz baze podataka

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavite skriptu exit(); )else( //Provjeri da li u bazi nema korisnika sa takvim podacima, a zatim prikaži poruku o grešci if($result_query_select->num_rows == 1)( // Ako se uneseni podaci poklapaju sa podacima iz baze podataka, onda sačuvaj login i lozinka za niz sesije. $_SESSION["email"] = $email; $_SESSION["password"] = $password; //Vrati korisnika na zaglavlje glavne stranice("HTTP/1.1 301 trajno premješten" ); header("Lokacija: ".$address_site ."/index.php"); )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Pogrešno korisničko ime i/ili lozinka

"; //Vratite korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavite skriptu exit(); ) )

Izlaz sa lokacije

I posljednja stvar koju implementiramo je izlaznu proceduru. Trenutno u zaglavlju prikazujemo linkove na stranicu za autorizaciju i stranicu za registraciju.

U zaglavlju stranice (datoteka header.php), koristeći sesiju, provjeravamo da li je korisnik već prijavljen. Ako nije, onda prikazujemo linkove za registraciju i autorizaciju, u suprotnom (ako je ovlašten), tada umjesto veza za registraciju i autorizaciju prikazujemo link Izlaz.

Modificiran dio koda iz datoteke header.php:

Registracija

Izlaz

Kada kliknete na izlaznu vezu sa stranice, ulazimo u datoteku logout.php, gdje jednostavno uništavamo ćelije sa email adresom i lozinkom iz sesije. Nakon toga vraćamo korisnika nazad na stranicu na kojoj je kliknuo na link izlaz.

Šifra datoteke logout.php:

To je sve. Sada znate kako implementirati i obraditi obrasce za registraciju i autorizaciju korisnika na vašoj web stranici. Ovi obrasci se nalaze na gotovo svim stranicama, tako da bi svaki programer trebao znati kako ih kreirati.

Takođe smo naučili kako da potvrdimo ulazne podatke, kako na strani klijenta (u pretraživaču, koristeći JavaScript, jQuery) tako i na strani servera (koristeći PHP jezik). I mi smo naučili implementirati proceduru odjave.

Sve skripte su testirane i rade. Arhivu sa fajlovima ovog malog sajta možete preuzeti sa ovog linka.

U budućnosti ću napisati članak u kojem ću opisati. I također planiram napisati članak gdje ću objasniti (bez ponovnog učitavanja stranice). Dakle, kako biste bili svjesni objavljivanja novih članaka, možete se pretplatiti na moju stranicu.

Ako imate bilo kakvih pitanja, obratite se, također, ako primijetite bilo kakvu grešku u članku, javite mi.

Plan lekcije (5. dio):

  1. Kreiranje HTML strukture za formular za autorizaciju
  2. Primljene podatke obrađujemo
  3. U zaglavlju stranice prikazujemo pozdrav korisnika

Svidio vam se članak?

Reg.ru: domeni i hosting

Najveći registrator i hosting provajder u Rusiji.

Preko 2 miliona imena domena u upotrebi.

Promocija, mail za domen, rješenja za poslovanje.

Više od 700 hiljada kupaca širom svijeta već je odlučilo.

*Pređite mišem za pauziranje pomicanja.

Nazad napred

Kreiranje jednostavnog sistema registracije korisnika u PHP i MySQL

Stvaranje sistema registracije je dosta posla. Morate napisati kod koji potvrđuje adrese e-pošte, šalje e-poštu za potvrdu registracije, potvrđuje ostala polja obrasca i još mnogo toga.

A i nakon što sve ovo napišete, korisnici će nerado da se registruju, jer. to zahtijeva određeni napor sa njihove strane.

U ovom vodiču ćemo kreirati vrlo jednostavan sistem za prijavu koji uopće ne zahtijeva niti pohranjuje lozinke! Rezultat će biti lako modificirati i dodati na već postojeću PHP stranicu. Želite li saznati kako funkcionira? Pročitajte u nastavku.



Evo kako bi naš super jednostavan sistem funkcionirao:

Kombinovaćemo formular za autorizaciju i registraciju. Ovaj obrazac će imati polje za unos adrese e-pošte i dugme za registraciju;
- Prilikom popunjavanja polja sa email adresom, klikom na dugme za registraciju kreiraće se zapis o novom korisniku, ali samo ako unesena adresa e-pošte nije pronađena u bazi.

Nakon toga se kreira određeni nasumični jedinstveni skup znakova (token) koji se šalje na mail koji je korisnik odredio u obliku linka koji će biti relevantan 10 minuta;
- Klikom na link korisnik odlazi na našu web stranicu. Sistem utvrđuje prisustvo tokena i ovlašćuje korisnika;

Prednosti ovog pristupa:

Nema potrebe za pohranjivanjem lozinki i validacijom polja;
- Nema potrebe za vraćanjem lozinke, tajnim pitanjima itd.;
- Od trenutka kada se korisnik registruje/prijavljuje, uvijek možete biti sigurni da će ovaj korisnik biti u vašoj pristupnoj zoni (da je adresa e-pošte tačna);
- Nevjerovatno jednostavan proces registracije;

Nedostaci:

Sigurnost korisničkog naloga. Ako neko ima pristup korisničkoj pošti, može se prijaviti.
- E-pošta nije sigurna i može se presresti. Imajte na umu da je ovo pitanje relevantno iu slučaju kada je lozinka zaboravljena i treba je vratiti, ili u bilo kojem sistemu autorizacije koji ne koristi HTTPS za prijenos podataka (login/lozinka);
- Sve dok mail server postavite prema potrebi, postoji šansa da će poruke sa linkovima za autorizaciju završiti u neželjenoj pošti;

Upoređujući prednosti i nedostatke našeg sistema, možemo reći da sistem ima visoku upotrebljivost (maksimalna pogodnost za krajnjeg korisnika) i da istovremeno ima nizak pokazatelj sigurnosti.

Stoga se predlaže da se koristi za registracije na forumima i servisima koji ne rade sa važnim informacijama.

Kako koristiti ovaj sistem

U slučaju kada samo trebate koristiti sistem za autorizaciju korisnika na svojoj web stranici, a ne želite da rastavljate ovu lekciju, evo šta trebate učiniti:

Morate preuzeti izvorne datoteke priložene lekciji
- Pronađite datoteku u arhivi tables.sql Uvezite ga u svoju bazu podataka koristeći opciju uvoza u phpMyAdmin. Alternativni način: otvorite ovu datoteku u uređivaču teksta, kopirajte SQL upit i pokrenite ga;
- Otvori uključuje/main.php i popunite postavke za povezivanje na vašu bazu podataka (navedite korisnika i lozinku za povezivanje na bazu, kao i host i naziv baze podataka). U istoj datoteci morate navesti i adresu e-pošte koja će se koristiti kao originalna adresa za poruke koje sistem šalje. Neki domaćini će blokirati odlazne e-poruke sve dok obrazac ne pokaže pravu adresu e-pošte koja je generirana iz kontrolne ploče domaćina, pa unesite pravu adresu;
- Preuzmite sve datoteke index.php, protected.php i sredstva i uključuje foldere preko FTP-a do vašeg hosta;
- Dodajte kod u nastavku na svaku PHP stranicu na kojoj želite da prikažete obrazac za autorizaciju;

Require_once "includes/main.php"; $user = novi korisnik(); if(!$user->loggedIn())( redirect("index.php"); )
- Spreman!

Za one koje zanima kako sve to funkcionira, pročitajte u nastavku!

Prvi korak je pisanje HTM koda za formular za autorizaciju. Ovaj kod se nalazi u datoteci index.php. Ovaj fajl takođe sadrži PHP kod koji rukuje podacima obrasca i drugim korisnim karakteristikama sistema autorizacije. Možete saznati više o ovome u odeljku za pregled PHP koda ispod.

index.php

Vodič: Super jednostavan sistem registracije sa PHP i MySQL

Prijavite se ili registrujte

Unesite svoju email adresu iznad i mi ćemo poslati
ti link za prijavu.

U odeljku za glavu (između oznaka i) Uključio sam glavne stilove (oni se ne analiziraju u ovom tutorijalu, tako da ih možete sami vidjeti. folder assets/css/style.css). Prije završne oznake Uključio sam jQuery biblioteku i datoteku script.js, koju ćemo napisati i analizirati u nastavku.


JavaScript

jQuery prati stanje dugmeta "Sign Up/Login" sa funkcijom e.preventDefault() i šalje AJAX zahtjeve. U zavisnosti od odgovora servera, prikazuje određenu poruku i određuje dalje radnje /

sredstva/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), funkcija (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("učitavanje"); )); ));

je dodan u obrazac za prikaz trenutnog stanja AJAX zahtjeva (ovo je omogućeno zahvaljujući metodama ajaxStart()) i ajaxComplete(), koji možete pronaći na kraju datoteke).

Ova klasa prikazuje vrteću animiranu gif datoteku (kao da nam nagoveštava da se zahtev obrađuje), a takođe deluje kao zastavica koja sprečava da se obrazac ponovo pošalje (kada je dugme za registraciju već jednom kliknuto). Klasa .prijavljeni- ovo je druga zastavica - postavljena kada je e-mail poslan. Ova zastavica trenutno blokira svaku daljnju radnju na obrascu.

Šema baze podataka

Naš neverovatno jednostavan sistem evidentiranja koristi 2 MySQL tabele (SQL kod je u datoteci tables.sql). Prvi pohranjuje podatke o korisničkim nalozima. Drugi pohranjuje informacije o broju pokušaja prijave.


Shema korisničke tablice.

Sistem ne koristi lozinke, što se može vidjeti na dijagramu. Na njemu se vidi kolona token sa tokenima uz kolonu token_validity. Token se postavlja čim se korisnik poveže na sistem, postavlja svoj email da pošalje poruku (malo više o tome u sljedećem bloku). Kolona token_validity postavlja vrijeme 10 minuta kasnije, nakon čega token više nije važeći.


Shema tablice koja broji broj pokušaja autorizacije.

U obje tabele, IP adresa je pohranjena u obrađenom obliku, koristeći funkciju ip2long, u cijelobrojnom polju.

Sada možemo napisati neki PHP kod. Glavna funkcionalnost sistema je dodijeljena klasi user.class.php koje možete vidjeti u nastavku.

Ova klasa aktivno koristi idorm (docs), ove biblioteke su minimum potrebnih alata za rad sa bazama podataka. On se bavi pristupom bazi podataka, generisanjem tokena i validacijom. To je jednostavno sučelje koje olakšava povezivanje sistema registracije na vašu stranicu ako koristi PHP.

user.class.php

Class User( // Private ORM case private $orm; /** * Pronađi korisnika po tokenu. U obzir se uzimaju samo važeći tokeni. Token se generiše samo 10 minuta od trenutka kada je kreiran * @param string $token Ovo je onaj koji tražite token * @return User. Vratite vrijednost korisničke funkcije */ javna statička funkcija findByToken($token)( // pronađite token u bazi podataka i provjerite je li postavljena ispravna vremenska oznaka $ rezultat = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > SADA()") ->find_one(); if(!$result)( return false; ) vrati novog korisnika($result); ) /** * Ovlasti ili registriraj korisnika * @param string $email.Korisnička adresa e-pošte * @return Korisnik */ javna statička funkcija loginOrRegister($email)( // Ako je takav korisnik već postoji, vrati vrijednost funkcije User sa navedene adrese e-pošte pohranjene u bazi podataka if(User::exists($email))( return new User($email); ) // U suprotnom, kreiraj novog korisnika tel u bazi podataka i vrati vrijednost funkcije User::create iz navedenog emaila vrati User::create($email); ) /** * Kreirajte novog korisnika i sačuvajte u bazi podataka * @param string $email. Adresa e-pošte korisnika * @return User */ privatna statička funkcija create($email)( // Registrirajte novog korisnika i vratite rezultat korisničke funkcije iz ovih vrijednosti $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); vrati novog korisnika($result); ) /** * Provjerite postoji li takav korisnik u bazi podataka i vrati logičku vrijednost varijabla * @param string $email. Adresa e-pošte korisnika * @return boolean */ javna statička funkcija postoji($email)( // Da li korisnik postoji u bazi podataka? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Kreirajte novi korisnički objekat * @param instanca $param ORM , id, email ili 0 * @return Korisnik */ javna funkcija __construct($param = null) ( if($param instanceof ORM)( // ORM provjera je prošla $this->orm = $param; ) else if(is_string($param))( // Provjera e-pošte je prošla $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // ID-u korisnika se prosljeđuje vrijednost $ param varijabla $id = $param; ) else if(isset($_SESSION["loginid"]))( // Inače pogledajte sesiju $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generiraj novi SHA1 autorizacijski token, piše u bazu podataka i vraća njenu vrijednost * @return string */ public function generateToken()( // Generiraj token za ovlaštenog korisnika i spremi ga u bazu podataka $token = sha1($this->email.time().rand (0, 1000000 )); // Pohraniti token u bazu podataka // I označiti ga kao važeći samo sljedećih 10 minuta $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); return $token; ) /** * Ovlastite korisnika * @return void */ public function login()( // Označite korisnika kao prijavljenog u $_SESSION["loginid"] = $this->orm->id; // Ažurirajte vrijednost polja baze podataka last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Uništite sesiju i odjavite korisnika * @return void */ odjava javne funkcije ()( $_SESSION = array(); unset($_SESSION); ) /** * Provjerite da li je korisnik prijavljen * @return boolean */ javna funkcija loggedIn()( return isset($ this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Provjerite da li je korisnik administrator * @return boolean */ javna funkcija jeAdmin() ( return $this->rank() = = "administrator"; ) /** * Pronađi tip korisnika, može biti administrator ili običan * @return string */ javna funkcija rank()( if($this->orm- >rank == 1)( return "administrator "; ) return "regular"; ) /** * Metoda koja vam omogućava da dobijete privatne informacije * kao svojstva User objekta * @param string $key Ime svojstva kojem se pristupa * @return miješano */ javna funkcija __get($key)( if(isset($this->orm->$key)) (vrati $this->orm->$key; ) vrati null; ) )

Tokeni se generiraju pomoću SHA1 algoritma i pohranjuju u bazi podataka. Koristim MySQL-ove vremenske funkcije da postavim ograničenje isteka tokena od 10 minuta.

Kada token prođe proceduru validacije, direktno govorimo rukovaocu da razmatramo samo tokene koji još nisu istekli, pohranjene u stupcu token_validity.

Imajte na umu da koristim magičnu metodu __get docs biblioteka na kraju datoteke za presretanje pristupa svojstvima objekta User.

Zahvaljujući tome, postaje moguć pristup informacijama pohranjenim u bazi podataka, zahvaljujući svojstvima $user->email, $user->token itd. U sljedećem isječku koda, uzmimo primjer kako koristiti ove klase.


Zaštićena stranica

Još jedna datoteka koja pohranjuje korisne i neophodne funkcionalnosti je datoteka functions.php. Ovdje postoji nekoliko takozvanih pomoćnika - pomoćnih funkcija koje vam omogućavaju da kreirate čišći i čitljiviji kod u drugim datotekama.

functions.php

Funkcija send_email($from, $to, $subject, $message)( // Pomoćnik koji šalje e-poštu $headers = "MIME-Verzija: 1.0" . "\r\n"; $headers .= "Tip sadržaja: tekst /plain; charset=utf-8" . "\r\n"; $headers .= "Od: ".$from . "\r\n"; vrati poštu ($za, $subject, $message, $headers ); ) function get_page_url()( // Dobiti URL PHP datoteke $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"]; ) return $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Broj pokušaja prijave u posljednjem satu na ovoj IP adresi $count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")") ->count(); // Broj pokušaja prijave u posljednjih 10 minuta na ovoj IP adresi $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprint f("%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("Previše pokušaja prijave!"); ) ) function rate_limit_tick($ip, $email)( // Kreiraj novi unos u tabeli brojeći broj pokušaja prijave $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $e-pošta; $login_attempt->ip = sprintf("%u", ip2long($ip) ); $login_attempt->save(); ) funkcija preusmjeravanje($url)( header("Lokacija: $url"); izlaz; )

Funkcije rate_limit i rate_limit_tick pratiti broj pokušaja autorizacije za protekli vremenski period od prvog pokušaja. Pokušaj prijave se bilježi u bazi podataka u stupcu reg_login_attempt. Ove funkcije se pozivaju kada se podaci obrasca obrađuju i šalju, kao što možete vidjeti iz sljedećeg isječka koda.

Kod ispod je preuzet iz datoteke index.php i obrađuje podnošenje obrasca. Vraća JSON odgovor koji zauzvrat obrađuje jQuery u datoteci sredstva/js/script.js o čemu smo već ranije govorili.

index.php

Pokušajte( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Iznesite JSON zaglavlje("Content-type: application/json"); // Da li je ova adresa e-pošte važeća ako (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Molimo unesite važeći email."); ) // Provjerite. Je li korisniku je dozvoljeno da se prijavi, da li je premašio broj dozvoljenih veza? (functions.php fajl za više informacija) rate_limit($_SERVER["REMOTE_ADDR"]); // Zabilježi ovaj pokušaj prijave rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Pošaljite e-mail korisniku $message = ""; $email = $_POST["email"]; $subject = "Vaša veza za prijavu"; if(!User:: exists($email) )( $subject = "Hvala na registraciji!"; $message = "Hvala što ste se registrovali na našem sajtu!\n\n"; ) // Pokušaj autorizacije ili registracije korisnika $user = Korisnik ::loginOrRegister($_POST[ "email"]); $message.= "Možete se prijaviti sa ovog URL-a:\n" ; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Link će automatski isteći nakon 10 minuta."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Došlo je do greške pri slanju vaše e-pošte. Molimo pokušajte ponovo."); ) die(json_encode(array("message" => "Hvala! Poslali smo link u vašu pristiglu poštu. Provjerite i vašu spam folder.")))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( ) ))); )

Nakon uspješne autorizacije/registracije, gornji kod će poslati korisniku link za autorizaciju. Token postaje dostupan jer prosljeđuje se kao varijabla u generiranoj vezi metodom $_GET sa markerom tkn

index.php

If(isset($_GET["tkn"]))( // Je li ovaj token važeći za autorizaciju? $user = User::findByToken($_GET["tkn"]); if($user)( // Da, je. Preusmjerite na zaštićenu stranicu $user->login(); redirect("protected.php"); ) // Ne, token nije važeći. Preusmjerite na stranicu sa formularom za prijavu/registraciju redirect("index. php"); )

$user->login()

će kreirati potrebne varijable za sesiju, tako da će korisnik, pregledavajući sljedeće stranice stranice, ostati ovlašten cijelo vrijeme.

Slično je uređena obrada funkcije za izlazak iz sistema.

index.php

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

Na kraju koda, ponovo sam preusmjerio na index.php, dakle parametar ?logout=1 proslijeđen URL-om nije potreban.

Naš dosije index.php zahtijeva dodatne zaštita - ne želimo da ljudi koji su se ikada prijavili na sistem ponovo vide obrazac za registraciju. U ove svrhe koristimo metodu $user->loggedIn().

index.php

$user = novi korisnik(); if($user->loggedIn())( redirect("protected.php"); )

Konačno, ovdje je dio koda koji vam omogućava da zaštitite stranice vaše stranice i učinite ih dostupnim tek nakon autorizacije.

protected.php

// Da biste osigurali svaku stranicu na vašem sajtu, uključite datoteku // main.php i kreirajte novi User objekat. Eto kako je to lako! require_once "includes/main.php"; $user = novi korisnik(); if(!$user->loggedIn())( redirect("index.php"); )

Nakon ove provjere, možete biti sigurni da je korisnik uspješno autoriziran. Također možete pristupiti pohranjenim informacijama u bazi podataka koristeći svojstva objekta $user. Za prikaz e-pošte i statusa korisnika koristite ovaj kod:

echo "Vaša e-pošta: ".$user->email; echo "Vaš rang: ".$user->rank();

Metoda rang() se ovdje koristi jer se brojevi obično pohranjuju u bazi podataka (0 za normalnog korisnika, 1 za administratora) i te podatke moramo pretvoriti u statuse kojima pripadaju, u čemu nam ova metoda pomaže.

Da biste običnog korisnika učinili administratorom, jednostavno uredite unos korisnika kroz phpMyAdmin (ili bilo koji drugi program koji vam omogućava upravljanje bazama podataka). Status administratora ne daje nikakve privilegije, u ovom primjeru stranica će prikazati da ste administrator - i to je to.

Ali šta učiniti s tim - ostaje po vašem nahođenju, možete sami napisati i sastaviti kod koji postavlja određene privilegije i mogućnosti za administratore.

Gotovi smo!

Sa ovim neverovatno super kvazi jednostavnim oblikom, gotovi smo! Možete ga koristiti na svojim PHP stranicama, prilično je jednostavno. Možete ga i modificirati za sebe i napraviti kako želite.

Materijal je pripremio Denis Malyshok posebno za stranicu

P.S. Da li želite da napredujete u savladavanju PHP-a i OOP-a? Pogledajte premium tutorijale o različitim aspektima izgradnje web stranica, uključujući PHP programiranje, kao i besplatni kurs o izgradnji vašeg PHP CMS sistema od nule koristeći OOP:

Svidio vam se materijal i želite da se zahvalite?
Samo podijelite sa svojim prijateljima i kolegama!


Danas ćemo pogledati eksploataciju kritične jednodnevne ranjivosti u popularnom Joomla CMS-u, koji je eksplodirao na Internetu krajem oktobra. O ranjivosti ćemo govoriti brojkama CVE-2016-8869, CVE-2016-8870 i CVE-2016-9081. Sva tri dolaze iz istog komada koda koji je čamio u utrobi okvira pet dugih godina, čekajući u krilima da se oslobodi i donese haos, hakovane stranice i suze nevinih korisnika ove Joomle. Samo najhrabriji i najhrabriji programeri, čije su oči crvene od svetlosti monitora, a tastature posute mrvicama hleba, uspeli su da izazovu pobesnele zle duhove i polože svoje glave na oltar popravki.

UPOZORENJE

Sve informacije su date samo u informativne svrhe. Ni uredništvo ni autor nisu odgovorni za bilo kakvu moguću štetu uzrokovanu materijalima ovog članka.

Kako je sve počelo

Dana 6. oktobra 2016, Demis Palma je napravio temu na Stack Exchangeu, u kojoj je pitao: zašto, zapravo, u Joomli verziji 3.6 postoje dva metoda za registraciju korisnika sa istim imenom register()? Prvi je u kontroleru UsersControllerRegistration, a drugi u UsersControllerUser. Damis je želio znati da li se metoda UsersControllerUser::register() negdje koristi ili je to samo evolucijski anahronizam koji je ostao od stare logike. Bio je zabrinut zbog činjenice da čak i ako ovu metodu ne koristi nijedan pogled, ona se i dalje može pozvati s generiranim zahtjevom. Na šta sam dobio odgovor od programera pod nadimkom itoktopus, koji je potvrdio da problem zaista postoji. I poslao izvještaj Joomla programerima.

Dalji događaji su se razvijali najbrže. 18. oktobra, Joomla programeri prihvataju izvještaj od Damisa, koji je do tada izradio PoC koji dozvoljava registraciju korisnika. Objavio je bilješku na svojoj web stranici, u kojoj je općenito govorio o problemu koji je pronašao i svojim razmišljanjima o njemu. Istog dana izlazi nova verzija Joomle 3.6.3, koja još uvijek sadrži ranjivi kod.

Nakon toga, Davide Tampellini vrti grešku u stanje registracije ne jednostavnog korisnika, već administratora. A već 21. oktobra novi slučaj stiže u Joomla sigurnosni tim. Već govori o eskalaciji privilegija. Istog dana na Joomla web stranici se pojavljuje najava da će u utorak, 25. oktobra, biti objavljena sljedeća verzija sa serijskim brojem 3.6.3, koja popravlja kritičnu ranjivost u jezgri sistema.

25. oktobra, Joomla Security Strike Team pronalazi najnoviji problem koji je stvorio komad koda koji je otkrio Damis. Zatim, urezivanje od 21. oktobra sa neupadljivim imenom Prepare 3.6.4 Stable Release se gura u glavnu granu zvaničnog Joomla spremišta, čime se popravlja nesrećna greška.

Nakon ovog izlaska, brojni zainteresovani pojedinci pridružuju se kovali programera - počinju da vrte ranjivost i pripremaju sploite.

27. oktobra, istraživač Harry Roberts postavlja gotov exploit u Xiphos Research repozitorijum koji može da otpremi PHP fajl na server sa ranjivim CMS-om.

Detalji

Pa, predistorija je gotova, pređimo na ono najzanimljivije – analizu ranjivosti. Kao eksperimentalnu verziju, instalirao sam Joomla 3.6.3, tako da će svi brojevi redova biti relevantni za ovu verziju. I sve staze do datoteka koje vidite sljedeće će biti naznačene u odnosu na korijen instaliranog CMS-a.

Zahvaljujući nalazu Damisa Palme, znamo da postoje dvije metode koje vrše registraciju korisnika u sustav. Prvi koristi CMS i nalazi se u datoteci /components/com_users/controllers/registration.php:108. Drugi (onaj koji trebamo pozvati) živi u /components/com_users/controllers/user.php:293 . Pogledajmo to izbliza.

286: /** 287: * Metoda za registraciju korisnika. 288: * 289: * @return boolean 290: * 291: * @od 1.6 292: */ 293: javna funkcija register() 294: ( 295: JSession::checkToken("post") ili jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Dobijte podatke obrasca 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Provjera grešaka 318: if ($return === false) 319: ( ... 345: / / Završite registraciju.346: $return = $model->register($data);

Ovdje sam ostavio samo zanimljive redove. Puna verzija ranjive metode može se vidjeti u Joomla spremištu.

Hajde da shvatimo šta se dešava tokom normalne registracije korisnika: koji se podaci šalju i kako se obrađuju. Ako je registracija korisnika omogućena u postavkama, tada se obrazac može naći na http://joomla.local/index.php/component/users/?view=registration .


Zahtjev za legitimnu registraciju korisnika izgleda kao na sljedećem snimku ekrana.


Komponenta com_users je odgovorna za rad sa korisnicima. Obratite pažnju na parametar zadatka u zahtjevu. Ima format $controller.$method. Pogledajmo strukturu fajla.

Imena skripti u folderu kontrolori odgovaraju imenima pozvanih kontrolera. Pošto naš zahtjev sada ima $controller = "registration" , fajl će biti pozvan registracija.php i njegovu metodu register().

Pažnja, postavlja se pitanje: kako prenijeti obradu registracije na ranjivo mjesto u kodu? Verovatno ste već pogodili. Imena ranjivih i stvarnih metoda su ista (registr), tako da samo trebamo promijeniti ime pozvanog kontrolera. A gdje je ranjivi kontroler? Tako je, u dosijeu user.php. Ispostavilo se da je $controller = "user" . Stavljajući sve zajedno, dobijamo zadatak = user.register. Sada se zahtjev za registraciju obrađuje metodom koja nam je potrebna.


Druga stvar koju treba da uradimo je da pošaljemo podatke u ispravnom formatu. Ovdje je sve jednostavno. Legitimni register() od nas očekuje niz pod nazivom jform , u koji prosljeđujemo podatke za registraciju - ime, login, lozinku, mail (pogledajte snimku ekrana sa zahtjevom).

  • /components/com_users/controllers/registration.php: 124: // Dobiti korisničke podatke. 125: $requestData = $this->input->post->get("jform", array(), "array");

Naše dijete prima ove podatke od niza pod nazivom korisnik.

  • /components/com_users/controllers/user.php: 301: // Dobijte podatke obrasca. 302: $data = $this->input->post->get("user", array(), "array");

Stoga mijenjamo imena svih parametara u zahtjevu iz jfrom u user .

Naš treći korak je da pronađemo važeći CSRF token, jer bez njega neće biti registracije.

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

Izgleda kao MD5 hash, a možete ga uzeti, na primjer, iz obrasca za autorizaciju na stranici /index.php/component/users/?view=login .


Sada možete kreirati korisnike na željeni način. Ako je sve uspjelo, čestitam - upravo ste iskoristili ranjivost CVE-2016-8870"Nedostaje provjera dozvole za registraciju novih korisnika."

Evo kako to izgleda u "radnoj" metodi register() iz kontrolera UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Ako je registracija onemogućena - Preusmjeri na stranicu za prijavu. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: vrati false; 119: )

I tako u ranjivim:

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

Da, nema šanse.

Da bismo razumjeli drugi, mnogo ozbiljniji problem, pošaljimo zahtjev koji smo formirali i pogledajmo kako se on izvršava u raznim dijelovima koda. Evo dijela koji je odgovoran za validaciju podataka koje je korisnik poslao u radnoj metodi:

I dalje dostupno samo članovima

Opcija 1. Pridružite se zajednici "site" da pročitate sve materijale na stranici

Članstvo u zajednici tokom navedenog perioda će vam omogućiti pristup SVIM Hakerskim materijalima, povećati vaš lični kumulativni popust i omogućiti vam da akumulirate profesionalnu ocjenu Xakep Score!

Posljednja izmjena 23. jula 2019. od strane Vincyja.

Registracija ili registracija korisnika sastavni je dio mnogih web aplikacija i od ključne je važnosti da to bude ispravno za uspjeh aplikacije. To je početna točka korisničkog angažmana s vašom aplikacijom.

Trebalo bi da bude što jednostavnije sa najboljim UI/UX. Implementacija funkcionalnosti registracije korisnika pomoću PHP-a je jednostavan zadatak i provest ću vas kroz korake uz primjer u ovom članku.

Šta je unutra?

Kako funkcionira ovaj primjer registracije PHP korisnika?

Ovaj primjer koda može se podijeliti na 3 dijela.

  1. Dobivanje korisničkih informacija putem HTML obrasca.
  2. Provjera valjanosti podataka koje je korisnik dostavio prilikom slanja obrasca.
  3. Rukovanje bazom podataka za spremanje registrovanog korisnika u bazu podataka nakon validacije.

Treći korak će se izvršiti nakon što se uvjerimo da korisnik nije već dodan. Ova provjera jedinstvenosti podataka će se izvršiti na osnovu njihove e-pošte i korisničkog imena koje su oni unijeli.

Prilikom registracije uglavnom prikupljamo podatke o korisnicima koji su spremni za registraciju s našom aplikacijom. Neki od njih će biti obavezni, a neki opcioni.

Dakle, ova funkcionalnost također može uključivati ​​dio za provjeru valjanosti kako bi se osiguralo nepraznost i format korisničkih podataka. Validacija se može obaviti ili na strani klijenta ili na strani servera.

Provjera valjanosti na strani servera je uvijek bolja. Možete odabrati da ga imate na strani klijenta i radi lakšeg korištenja korisnika. Ali posjedovanje na strani servera nije opciono i minimalni zahtjev.

strukturu fajla

HTML obrazac koji omogućava korisniku da se registruje

U ovom primjeru, obrazac za registraciju sadrži polja Korisničko ime, Ime(Ime za prikaz), Lozinka i Email. Takođe ima polje za potvrdu lozinke koje omogućava korisniku da ponovo unese svoju lozinku za potvrdu. Ove dvije lozinke će se uporediti kasnije u vrijeme .

Podnošenjem ovog obrasca, od korisnika se očekuje da se složi sa odredbama i uslovima. Dakle, polje za potvrdu se dodaje ispred dugmeta Registracija da bi se to osiguralo.

PHP obrazac za registraciju korisnika

prijaviti se
"; } ?>
">
">
">
Prihvatam odredbe i uslove

A stilovi jesu

Tijelo (familija fontova: Arial; boja: #333; veličina fonta: 0,95em; ) .form-head (boja: #191919; težina fonta: normalna; težina fonta: 400; margina: 0; poravnanje teksta : center; font-size: 1.8em; ) .error-message ( padding: 7px 10px; pozadina: #fff1f2; granica: #ffd5da 1px solid; boja: #d6001c; border-radius: 4px; margina: 30px 0px 10px 0px ; ) .success-message (padding: 7px 10px; background: #cae0c4; border: #c3d0b5 1px solid; color: #027506; border-radius: 4px; margin: 30px 0px 10px 0px; ) .demo-table (pozadina: #ffffff; razmak između granica: početni; margina: 15px auto; word-break: break-word; table-layout: auto; line-height: 1.8em; boja: #333; border-radius: 4px; padding: 20px 40px ;width: 380px;border: 1px solid;border-color: #e5e6e9 #dfe0e4 #d0d1d5; ) .demo-table .label (boja: #888888; ) .demo-table .field-column (padding: 15px 0px; .demo-input-box ( padding: 13px; granica: #CCC 1px solid; border-radius: 4px; širina: 100%; ) .btnRegister ( padding: 13px; boja pozadine: #5d9cec; boja: #f5f7fa; kursor: pokazivač; radijus granice: 4px širina: 100% granica: #5791da 1px čvrsta; veličina fonta: 1.1em ) .response-text (max-width: 380px; font-size: 1.5em; text-align: center; background: #fff3de; padding: 42px; border-radius: 3px; border: #f5e9d4 1px solid; font-family : arial; visina linije: 34px; margina: 15px auto; ) .terms ( margin-bottom: 5px; )

Kako provjeriti valjanost korisničkih podataka na obrascu

Skripta za provjeru valjanosti obrasca na strani poslužitelja je dodana ovom primjeru za provjeru valjanosti podataka registracije korisnika. Ova PHP skripta za validaciju će biti pozvana prilikom slanja obrasca za registraciju.

Ova skripta provjerava valjanost svih polja obrasca kako bi provjerila nepraznost za svako polje. Zatim potvrđuje format korisničke e-pošte koristeći PHP-ovu funkciju filter_var().

Kako registracija uključuje funkciju potvrde lozinke, poređenje lozinke će se odvijati u ovom dijelu ovog primjera.

Konačno, skripta za provjeru valjanosti će provjeriti da li korisnik prihvaća uvjete i odredbe tako što će označiti odgovarajući okvir na obrascu.

Kada se sva provjera valjanosti dovrši vraćanjem booleanskog true, tada će se odvijati stvarni proces registracije.

Funkcija validateMember() ( $valid = true; $errorMessage = array(); foreach ($_POST kao $key => $value) (if (prazno($_POST[$key])) ( $valid = false; ) ) if($valid == true) (if ($_POST["password"] != $_POST["confirm_password"]) ( $errorMessage = "Lozinke bi trebale biti iste."; $valid = false; ) if (! isset ($error_message)) ( if (! filter_var($_POST["userEmail"], FILTER_VALIDATE_EMAIL)) ( $errorMessage = "Nevažeća adresa e-pošte."; $valid = false; ) ) if (! isset($ error_message)) ( if (! isset($_POST["terms"])) ( $errorMessage = "Prihvatam odredbe i uslove."; $valid = netačno; ) ) ) else ( $errorMessage = "Sva polja su obavezna." ; ) if ( $valid == false) ( vrati $errorMessage; ) return; )

PHP MySQL kod za pristup bazi podataka za spremanje registrovanog korisnika

Provjera valjanosti korisničkog obrasca na strani servera

Ovo je PHP ulazna tačka za rukovanje svim skriptama na strani servera za validaciju forme i za rukovanje operacijama baze podataka na osnovu rezultata validacije.

validateMember($username, $displayName, $password, $email); if (empty($errorMessage)) ( $memberCount = $member->isMemberExists($username, $email); if ($memberCount == 0) ( $insertId = $member->insertMemberRecord($username, $displayName, $ lozinka, $email); if (! prazno($insertId)) ( header("Lokacija: thankyou.php"); ) ) else ( $errorMessage = "Korisnik već postoji."; ) ) ) ?>

Provjerite da li korisnik već postoji

IsMemberExists() funkcija se koristi za provjeru jedinstvenosti korisničkih podataka na osnovu njihove e-pošte i korisničkog imena. Ako uneseno korisničko ime ili email postoji u korisničkoj bazi podataka, tada će proces registracije biti zaustavljen vraćanjem i potvrdom.

Ova potvrda će obavijestiti da „korisnik već postoji“. kod je,

Funkcija isMemberExists($username, $email) ( $query = "odaberi * FROM registered_users WHERE user_name = ? OR email = ?"; $paramType = "ss"; $paramArray = array($username, $email); $memberCount = $this->ds->numRows($query, $paramType, $paramArray); vrati $memberCount; )

Ubacite podatke o članu u bazu podataka

Ako vrati 0 onda to znači da ne postoje takvi korisnici s unesenim e-mailom ili korisničkim imenom. I tako će se registracijski podaci ubaciti u bazu podataka. Sljedeći kod prikazuje metodu umetanja članova.

Funkcija insertMemberRecord($username, $displayName, $password, $email) ( $passwordHash = md5($password); $query = "INSERT INTO registered_users (user_name, display_name, password, email) VRIJEDNOSTI (?, ?, ?, ? )"; $paramType = "ssss"; $paramArray = array($username, $displayName, $passwordHash, $email); $insertId = $this->ds->insert($query, $paramType, $paramArray); vrati $insertId; )

DataSource.php

Ovo je generička klasa izvora podataka u PHP-u za izvođenje operacija baze podataka. Uključuje funkcije za povezivanje baze podataka i izvršavanje različitih upita za dobivanje rezultata baze podataka, brojanja redova, izvršavanja umetanja i još mnogo toga.

Ova klasa izvora podataka je generička i održava se što je moguće jednostavnijom. Efikasan je i koristim ga u većini svojih mikro projekata i tutorijala. Možete ga besplatno preuzeti i koristiti.

važna stvar je nikada ne zaboravite koristiti Pripremljene izjave. Pomaže vam da se zaštitite od napada SQL injekcije i to je prvi korak u smislu implementacije sigurnosti u web aplikaciju.

conn = $this->getConnection(); ) /** * Ako je potreban objekt veze, koristite ovaj metod i pristupite mu. * U suprotnom, koristite donje metode za umetanje / ažuriranje / itd. * * @return \mysqli */ javna funkcija getConnection() ( $conn = new \mysqli(self::HOST, self::USERNAME, self::PASSWORD, self::DATABASENAME); if (mysqli_connect_errno()) ( trigger_error ("Problem sa povezivanjem na bazu podataka."); ) $conn->set_charset("utf8"); return $conn; ) /** * Da dobijete rezultate baze podataka * @param string $query * @param string $paramType * @ param niz $paramArray * @return niz */ javna funkcija select($query, $paramType="", $paramArray=array()) ( $stmt = $this->conn->prepare($query); if(! empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($sql, $paramType, $paramArray); ) $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) ( while ($red = $result->fetch_assoc()) ( $resultset = $red; ) ) if (! prazno($resultset)) (vrati $resultset; ) ) / ** * Za umetanje * @param string $query * @param string $paramType * @param niz $paramArray * @return int */ public function insert($query, $paramType, $p aramArray) ( print $query; $stmt = $this->conn->prepare($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->izvrši(); $insertId = $stmt->insert_id; return $insertId; ) /** * Za izvršavanje upita * @param string $query * @param string $paramType * @param niz $paramArray */ javna funkcija execute($query, $paramType="", $paramArray=array()) ( $ stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType="", $paramArray= array()); ) $stmt->execute(); ) /** * 1. Priprema vezivanje parametara * 2. Povežite prametre sa sql naredbom * @param string $stmt * @param string $paramType * @param array $ paramArray */ javna funkcija bindQueryParams($stmt, $paramType, $paramArray=array()) ( $paramValueReference = & $paramType; za ($i = 0; $i< count($paramArray); $i ++) { $paramValueReference = & $paramArray[$i]; } call_user_func_array(array($stmt, "bind_param"), $paramValueReference); } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function numRows($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType, $paramArray); ) $stmt->execute(); $stmt->store_result(); $recordCount = $stmt->num_rows; return $recordCount; ) )

Skripta baze podataka

Ova skripta baze podataka ima naredbu kreiranja za tablicu registered_users. Uvezite ovu skriptu u svoje razvojno okruženje da biste pokrenuli ovaj kod.

Struktura tabele za tabelu `registrovani_korisnici` -- KREIRAJ TABELU AKO NE POSTOJI `registrovani_korisnici` (`id` int(8) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL prezime` varchar(255) NOT NULL, `password` varchar(25) NOT NULL, `email` varchar(55) NOT NULL, `gender` varchar(20) NOT NULL, PRIMARY KEY (`id`));

Ako provjera obrasca za registraciju ne uspije, tada će se korisniku prikazati poruka o grešci kao što je dolje.

Komentari na “PHP obrazac za registraciju korisnika (registrirajte se) sa MySQL bazom podataka”

    Zdravo Vinsi, dobijam sledeće greške prilikom pokretanja šifre registra, molim za pomoć.

    UMETNI U registrirane_korisnike (korisničko_ime, ime za prikaz, lozinka, email) VRIJEDNOSTI (?, ?, ?, ?)
    Upozorenje: call_user_func_array() očekuje da parametar 1 bude važeći povratni poziv, prvi član niza nije valjano ime klase ili objekta u C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php na liniji 136

    Fatalna greška: Neuhvaćena greška: Poziv funkcije člana execute() na booleanu u C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php:99 Praćenje steka: #0 C:\xampp\htdocs\PHP\JAMII -CASH\Member.php(83): Phppot\DataSource->insert('INSERT INTO reg…', 'ssss', Array) #1 C:\xampp\htdocs\PHP\JAMII-CASH\index.php(20 ): Phppot\Member->insertMemberRecord('chuki10', 'Ray', '202020', ' [email protected]…’) #2 (glavni) bačen u C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php na liniji 99