Neustrašiva autentifikacija php. HTTP Instaliranje zaštite na stranicu koristeći MySQL i PHP. Primjer #7 Primjer sažete HTTP provjere autentičnosti

Naučit ćemo kako napraviti jednostavnu autentifikaciju korisnika na stranici. Stranica može imati stranice samo za ovlaštene korisnike, a one će u potpunosti funkcionirati ako im dodamo našu blokadu provjere autentičnosti. Za izradu vam je potrebna MySQL baza podataka. Može imati 5 stupaca (minimalno) ili više ako želite dodati podatke o korisnicima. Nazovimo bazu podataka “Userauth”.

Kreirajmo u njemu sljedeća polja: ID za brojanje broja korisnika, UID za jedinstveni identifikacijski broj korisnika, Korisničko ime za ime korisnika, Email za njegovu e-mail adresu i Lozinka za lozinku. Svoju postojeću bazu podataka možete koristiti za autorizaciju korisnika, samo, kao i u slučaju nove baze podataka, u njoj napravite sljedeću tablicu.

MySQL kod

CREATE TABLE `korisnici` (`ID` int (11) NOT NULL AUTO_INCREMENT, `UID` int (11) NOT NULL, `Korisničko ime` tekst NIJE NULL, `Email` tekst NIJE NULL, `Password` tekst NIJE NULL, PRIMARNI KLJUČ (`ID`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Kreirajmo sada datoteku "sql.php". Odgovoran je za povezivanje s bazom podataka. Ovaj kod, prvo, kreira varijable za poslužitelj i korisnika kada se spoji na poslužitelj. Drugo, odabrat će bazu podataka, u ovom slučaju "USERAUTH". Ova datoteka mora biti uključena u "log.php" i "reg.php" za pristup bazi podataka.

PHP kod

//Vaše MySQL korisničko ime$pass = "redere"; //lozinka $conn = mysql_connect ($server, $user, $pass); //spoj na poslužitelj$db = mysql_select_db("userauth", $conn); //odaberite bazu podataka ako (!$db) ( //ako ne može odabrati bazu podataka echo "Oprostite, pogreška:(/>"; //Pokazuje poruku greške Izlaz(); //Omogućuje pokretanje drugih PHP skripti } ?>

Sljedeća je stranica za prijavu, neka se zove “login.php”. Prvo provjerava ima li pogrešaka u unesenim podacima. Stranica ima polja za korisničko ime, lozinku, gumb za slanje i poveznicu za registraciju. Kada korisnik klikne na gumb "Prijava", forma će biti obrađena kodom iz datoteke "log.php", a zatim će se prijaviti.

PHP kod

0) { //ako postoje pogreške sesije$greška = "

"; //Pokreni tablicu foreach ($_SESSION["ERRMSG"] kao $msg) ( //prepoznati svaku grešku$pogreška .= " "; //zapisati u varijablu) $pogreška .= "
" . $msg . "
"; //zatvaranje stola poništeno ($_SESSION["ERRMSG"]); //brisanje sesije } ?> Obrazac za prijavu
Korisničko ime
Lozinka
Registracija


Zatim napišemo skriptu za prijavu u sustav. Nazovimo to "log.php". Ima funkciju čišćenja ulaznih podataka od SQL injekcija koje mogu uništiti vašu skriptu. Drugo, prima podatke obrasca i provjerava njihovu ispravnost. Ako su ulazni podaci ispravni, skripta šalje korisnika na stranicu ovlaštenih korisnika, ako nisu, postavlja greške i šalje korisnika na stranicu za prijavu.

PHP kod

//pokreni sesiju snimanja funkcija Fix($str) ( //čišćenje polja $str = trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) //niz za spremanje grešaka$errflag = netočno; //oznaka pogreške $username = Fix($_POST["username"]); //Korisničko ime$password = Fix($_POST["password"]);//password ) //provjera lozinke if ($password == "") ( $errmsg = "Lozinka nedostaje"; //greška $errflag = istina; //podiže zastavicu u slučaju greške) //ako se pojavi zastavica pogreške, preusmjerava natrag na obrazac za registraciju //bilježi pogreške session_write_close(); //zatvaranje sjednice //preusmjeravanje Izlaz(); )//upit u bazu podataka $qry = "SELECT * FROM `users` WHERE `Username` = "$username" AND `Password` = "" . md5 ($password) . """; $rezultat = mysql_query($qry);//provjeriti je li zahtjev uspješan (ima li podataka na njemu) if (mysql_num_rows ($result) == 1) ( while ($row = mysql_fetch_assoc ($result)) ( $_SESSION["UID"] = $row["UID"];//dobivanje UID-a iz baze podataka i njegovo postavljanje u sesiju $_SESSION["USERNAME"] = $korisničko ime; session_write_close(); //zatvaranje sjednice//postavlja odgovara li korisničko ime onom sesije //preusmjeravanje zaglavlje("lokacija: član.php"); //zatvaranje sjednice) ) else ( $_SESSION["ERRMSG"] = "Nevažeće korisničko ime ili lozinka"; //pogreška session_write_close(); //preusmjeravanje zaglavlje("lokacija: login.php");

Izlaz();

PHP kod

0) { //ako postoje pogreške sesije$greška = "

) ?> Napravimo stranicu za registraciju, nazovimo je "register.php". Slična je stranici za prijavu, samo što ima nekoliko polja više, a umjesto linka za registraciju nalazi se link na login.php u slučaju da korisnik već ima račun.$pogreška .= " "; "; //početak tablice foreach ($_SESSION["ERRMSG"] kao $msg) () $pogreška .= "
" . $msg . "
//postavlja svaku grešku //zapisuje ih u varijablu } ?> "; //kraj tablice poništen ($_SESSION["ERRMSG"]);
Korisničko ime
//uništava sesiju
Lozinka
Upisnica
ponovi lozinku


Sada ćemo kreirati skriptu za registraciju u datoteci "reg.php". Sadržat će "sql.php" za povezivanje s bazom podataka. Za brisanje polja za unos koristi se ista funkcija kao u skripti za prijavu. Varijable su postavljene za moguće pogreške. Sljedeća je funkcija za stvaranje jedinstvenog identifikatora koji nikada prije nije bio dan. Podaci iz obrasca za registraciju se potom izdvajaju i provjeravaju. Provjerava se da je adresa e-pošte u ispravnom formatu i da je lozinka ponovno ispravno unesena. Skripta zatim provjerava postoji li korisnik s istim imenom u bazi podataka i, ako postoji, prijavljuje pogrešku. Na kraju, kod dodaje korisnika u bazu podataka.

PHP kod

//pokreni sesiju snimanja funkcija Fix($str) ( //brisanje polja $str = @trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) vrati mysql_real_escape_string($str); ) $errmsg = niz(); //niz za spremanje grešaka$errflag = netočno; //oznaka pogreške $UID = "12323543534523453451465685454";//jedinstveni ID $username = Fix($_POST["username"]); //Korisničko ime$e-pošta = $_POST["e-pošta"]; //E-pošta $password = Fix($_POST["password"]);//lozinka $rpassword = Fix($_POST["rpassword"]);//ponovi lozinku //provjeri korisničko ime if ($username == "") ( $errmsg = "Korisničko ime nedostaje"; //greška $errflag = true ; //podiže zastavu u slučaju greške) //provjeri e-poštu if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@+(\.+)*(\.(2,3 ))$", $email)) ( //mora odgovarati formatu: [e-mail zaštićen]$errmsg = "Nevažeća e-pošta"; //pogreška $errflag = istina ; //podiže zastavu u slučaju greške } //provjera lozinke if ($password == "") ( $errmsg = "Lozinka nedostaje"; //greška $errflag = true ; //podiže zastavu u slučaju greške } //provjera ponavljanja lozinke if ($rpassword == "") ( $errmsg = "Nedostaje ponovljena lozinka";//greška $errflag = true ; //podiže zastavu u slučaju greške } //provjeri valjanost lozinke if (strcmp($password, $rpassword) != 0) ( $errmsg = "Lozinke se ne podudaraju";//greška $errflag = istina; //podiže zastavu u slučaju greške } //provjeri je li korisničko ime dostupno if ($username != "") ( $qry = "SELECT * FROM `users` WHERE `Username` = "$username""; //upit u MySQL $result = mysql_query ($qry); if ($result) ( if (mysql_num_rows ($result) > 0) ( //ako je ime već u upotrebi$errmsg = "Korisničko ime već u upotrebi"; //poruka pogreške$errflag = točno; //podiže zastavu u slučaju greške) mysql_free_rezultat($rezultat); ) ) //ako podaci nisu potvrđeni, preusmjerava natrag na obrazac za registraciju if ($errflag) ( $_SESSION["ERRMSG"] = $errmsg; //poruka pogreške session_write_close(); //zatvaranje sjednice zaglavlje("lokacija: registar.php"); //preusmjeravanje Izlaz(); //dodavanje podataka u bazu podataka$qry = "INSERT INTO `userauth`.`users`(`UID`, `Korisničko ime`, `Email`, `Password`) VALUES("$UID","$username","$email","" . md5 ($lozinka) """); $rezultat = mysql_query($qry); //provjerite je li zahtjev za dodavanjem bio uspješan if ($rezultat) ( echo "Hvala na registraciji, " .$korisničko ime." Molimo prijavite se ovdje"; izlaz (); ) else ( die ("Pogreška, provjerite ponovno kasnije"); ) ?>

Također morate izraditi skriptu za odjavu korisnika sa sustava. Prekida sesiju za korisnika s danim jedinstvenim ID-om i imenom, a zatim preusmjerava korisnika na stranicu za prijavu.

PHP kod

Konačno, skripta "auth.php" može se koristiti kako bi stranice bile dostupne samo ovlaštenim korisnicima. Provjerava podatke za prijavu i, ako su točni, omogućuje korisniku pregledavanje stranica, a ako nisu, traži od njega da se prijavi. Osim toga, ako netko pokuša hakirati stranicu stvaranjem jedne od sesija, ona će biti prekinuta, kao iu općem slučaju.

PHP kod

Jedan od uvjeta u gornjem kodu predmet je pitanja u .

Sljedeći kod je potrebno ubaciti na stranicu za ovlaštene korisnike, zove se npr. “member.php”, ali vaš se može zvati kako god želite.

PHP kod

Ovlašteni ste za pristup ovoj stranici. izađi van ( )

Autentifikacija korisnika je spremna!

Moguće je koristiti funkciju Zaglavlje() poslati poruku "Potrebna provjera" preglednik, prisiljavajući ga da prikaže prozor za unos vaše prijave i lozinke. Nakon što korisnik ispuni korisničko ime i lozinku, poveznica koja sadrži PHP skriptu bit će ponovno pozvana s unaprijed definiranim varijablama PHP_AUTH_USER, PHP_AUTH_PW i AUTH_TYPE postavljenim na prijavu, lozinku i vrstu provjere autentičnosti. Ove unaprijed definirane varijable pohranjene su u nizovima $_SERVER i $HTTP_SERVER_VARS. Podržane su obje vrste: "Basic" i "Digest" (od PHP 5.1.0). Pogledajte funkciju za detalje Zaglavlje().

Primjer fragmenta skripte koji prisiljava klijenta da se prijavi za pregled stranice:

Primjer #6 Osnovni primjer HTTP provjere autentičnosti

if (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
Zaglavlje( "WWW-Authenticate: Basic realm="My Realm"");

jeka "Poslana poruka kada
ako je korisnik kliknuo gumb Odustani"
;
Izlaz;
) inače (
jeka
"

Pozdrav ($_SERVER [ "PHP_AUTH_USER" ]).

" ;
jeka "

Unijeli ste lozinku( $_SERVER [ "PHP_AUTH_PW" ]) .

" ;
}
?>

Primjer #7 Primjer sažete HTTP provjere autentičnosti

Ovo je primjer implementacije jednostavne Digest HTTP skripte za provjeru autentičnosti. Za detalje pogledajte » RFC 2617.

$realm = "Zabranjena zona" ;

//korisnik => lozinka
$users = array("admin" => "mypass" , "guest" => "guest" );

if (prazno($_SERVER [ "PHP_AUTH_DIGEST" ])) (
zaglavlje ("HTTP/1.1 401 neovlašteno");
Zaglavlje( "WWW-Authenticate: Digest realm="". $područje.
"",qop="auth",nonce="" . uniqid(). "", neproziran="" . md5 ($područje). """ );

Umrijeti( "Tekst se šalje ako korisnik klikne Odustani");
}

// analizirati PHP_AUTH_DIGEST varijablu
if (!($data = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
!isset($users [ $data [ "username" ]]))
umrijeti( "Krivi podaci!");

// generiraj točan odgovor
$A1 = md5 ($data [ "username" ] . ":" . $realm . ":" . $users [ $data [ "username" ]]);
$A2 = md5($_SERVER["REQUEST_METHOD"]. ":" . $data["uri" ]);
$valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $data [ "qop" ].

if ($data [ "response" ] != $valid_response )
umrijeti( "Krivi podaci!");

// ok, prijava i lozinka su točni
echo "Prijavljeni ste kao: " . $podaci["korisničko ime"];

// Funkcija analize zaglavlja http auth
funkcija http_digest_parse ($txt)
{
// zaštita od podataka koji nedostaju
$needed_parts = array("nonce" => 1, "nc" => 1, "cnonce" => 1, "qop" => 1, "username" => 1, "uri" => 1, "response" => 1);
$podaci = polje();
$keys = implode ("|", array_keys ($needed_parts ));

Preg_match_all ("@(" . $ključevi . ")=(?:([\""])([^\2]+?)\2|([^\s,]+))@", $txt , $podudaranja , PREG_SET_ORDER );

Foreach ($ odgovara kao $m) (
$podaci [$m [1]] = $m [3]? $m [3] : $m [4];
poništi($potrebni_dijelovi [ $m [ 1 ]]);
}

Vratiti $needed_parts? lažno: $podaci;
}
?>

Komentar: Napomena o kompatibilnosti

Budite posebno oprezni kada navodite HTTP zaglavlja. Kako bi se osigurala maksimalna kompatibilnost s najvećim brojem različitih klijenata, riječ "Basic" mora biti napisana velikim slovom "B", regija (realm) mora biti u dvostrukim (ne jednostrukim!) navodnicima, a ispred mora biti točno jedan razmak kod 401 u naslovu HTTP/1.0 401. Parametri provjere autentičnosti moraju biti odvojeni zarezima, kao što je prikazano u gornjem primjeru provjere autentičnosti sažetka.

Umjesto jednostavnog prikazivanja varijabli PHP_AUTH_USER i PHP_AUTH_PW na ekranu, možda ćete morati provjeriti jesu li ispravne. Da biste to učinili, upotrijebite upit baze podataka ili potražite korisnika u dbm datoteci.

Možete promatrati značajke rada preglednika Internet Explorer. Vrlo je izbirljiv u pogledu parametara odaslanih zaglavlja. Trik s naslovom WWW-Autentifikacija prije slanja statusa HTTP/1.0 401 radi za njega do sada.

Od PHP 4.3.0, kako bi se spriječilo da netko napiše skriptu koja otkriva lozinku za stranicu koja koristi vanjsku provjeru autentičnosti, varijable PHP_AUTH nisu postavljene ako stranica koristi vanjsku provjeru autentičnosti i ako je postavljena na siguran način rada. Međutim, varijabla REMOTE_USER može se koristiti za provjeru autentičnosti eksterno ovjerenog korisnika. Dakle, uvijek možete koristiti varijablu $_SERVER["REMOTE_USER"].

Komentar: Napomena o konfiguraciji

PHP koristi indikaciju direktive AuthType za označavanje koristi li se vanjska provjera autentičnosti ili ne.

Treba napomenuti da sve navedeno ne sprječava krađu lozinki stranicama koje zahtijevaju autorizaciju od strane nekoga tko neovlašteno kontrolira stranice koje se nalaze na istom serveru.

I Netscape Navigator i Internet Explorer brišu autentifikacijsku predmemoriju trenutnog prozora za određeno područje kada su primljeni od poslužitelja. Ovo se može koristiti za prisiljavanje korisnika da se odjavi i ponovno prikaže dijaloški okvir korisničkog imena i lozinke. Neki programeri koriste ovo za vremensko ograničenje prijava ili davanje gumba za odjavu.

Primjer #8 Primjer HTTP autentifikacije s prisilnim unosom novog para prijava/lozinka

funkcija authenticate() (
Zaglavlje( "WWW-Authenticate: Basic realm="Test Authentication System"");
zaglavlje ("HTTP/1.0 401 neovlašteno");
jeka "Morate unijeti ispravno korisničko ime i lozinku da biste dobili pristup resursu \n";
Izlaz;
}

if (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
ovjeri();
) inače (
jeka "

dobrodošli:". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "
" ;
jeka "Prethodna prijava: ". htmlspecialchars($_REQUEST["OldAuth"]);
jeka "

\n";
jeka "\n";
jeka ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "\" />\n" ;
jeka "\n";
jeka "

\n" ;
}
?>

Ovo ponašanje nije regulirano standardima HTTP Basic-autentifikacija, stoga ne biste trebali ovisiti o njoj. Testiranje preglednika Ris pokazao da Ris ne briše autorizacijsku predmemoriju kada primi status 401 od poslužitelja, a klikom na “Natrag” i zatim “Naprijed” u nizu, moguće je otvoriti takvu stranicu, pod uvjetom da traženi atributi autorizacije nisu promijenjeni. Međutim, korisnik može pritisnuti tipku "_" za brisanje predmemorije za provjeru autentičnosti.

Također treba napomenuti da prije PHP-a 4.3.3, HTTP provjera autentičnosti nije radila na poslužiteljima koji pokreću Microsoft IIS ako je PHP bio instaliran kao CGI modul, zbog nekih IIS ograničenja. Kako bi ispravno radio u PHP-u 4.3.3+, morate urediti postavku konfiguracije IIS-a pod nazivom " Sigurnost imenika". Kliknite na natpis " Uredi" i postavite opciju " Anonimni pristup", sva ostala polja trebaju ostati neoznačena.

Još jedno ograničenje ako koristite IIS putem ISAPI i PHP 4: varijable PHP_AUTH_* nisu definirani, ali je u isto vrijeme varijabla dostupna HTTP_AUTHORIZATION. Primjer koda koji možete koristiti: popis($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Komentar: Napomena u vezi s IIS-om:
Kako bi HTTP provjera autentičnosti radila ispravno u IIS-u, u PHP konfiguraciji opcija cgi.rfc2616_headers mora biti postavljena na 0 (zadana vrijednost).

Komentar:

U slučaju da se koristi sigurni način rada, UID trenutne skripte bit će dodan carstvo- dio zaglavlja WWW-Autentifikacija.

Ponekad ga je potrebno zatvoriti od vanjskog pristupa PHP stranicu ako pravite zatvoreni dio stranice. To mogu biti neke skrivene informacije za vaše klijente ili posjetitelje stranice, neka vrsta administrativnog sučelja za vas itd. Možete smisliti stotine različitih zadataka koji zahtijevaju ograničenja pristupa.

Takvu stranicu možete zatvoriti na nekoliko komplementarnih načina:

  1. Zaštita lozinkom (login/lozinka) pomoću varijabli $_SERVER["PHP_AUTH_USER"] I $_SERVER["PHP_AUTH_PW"].
  2. Zaštita od strane IP adresa klijenta pomoću varijable $_SERVER["REMOTE_ADDR"].
  3. Zaštita od strane MAC adresa u lokalnim mrežama (pored zaštite od strane IP).

Pogledajmo prvo prvu metodu, koja je glavna. Omogućuje vam da blokirate pristup stranici koristeći svoju prijavu i lozinku, tako da samo osobe koje znaju prijavu i lozinku mogu dobiti pristup. Osim toga, mogu se podijeliti prema ovom kriteriju i, u skladu s tim, mogu se dati različite informacije za svaku. Implementirano izdavanjem posebnih polja u zaglavlju protokola HTTP. Kreirajmo funkciju auth_send():

" ,"

Pogreška provjere autentičnosti

" ,"

Obratite se administratoru kako biste dobili svoju prijavu i lozinku.

" ,""; izlaz; ); ?>

Ova funkcija obavještava preglednik da pristup zahtijeva autorizaciju pomoću prijave i lozinke. I također prikazuje stranicu u HTML za korisnika.

" ,"

Dobrodošli!

" ,"

Prijavljeni ste pomoću prijave ",$auth_user," i lozinke ",$auth_pass,".

" ,"

"; ?>

Kôd za potvrdu prijave i lozinke u ovom slučaju nije previše kompliciran, budući da se implementira za jednu osobu. Logika rada je jednostavna ako nema varijable $_SERVER["PHP_AUTH_USER"] I $_SERVER["PHP_AUTH_PW"] ili njihove vrijednosti ne odgovaraju traženim, tada pozovite funkciju auth_send(). Ne zaboravite da na kraju zove Izlaz, pa se izvođenje programa zaustavlja.

Sljedeća razina zaštite implementirana je filtriranjem IP adrese klijenta koji se povezuje. Naravno, na internetu, mnogi pružatelji izdaju IP privremene adrese i ova zaštita je beskorisna, ali ako govorimo o korporativnim lokalnim mrežama, onda će ova provjera pružiti dodatnu zaštitu.

Vaš IP nije pronađen!!!"; izlaz; ); ?>

Ovdje u redu $allowed_ips označeni razdvojeni razmacima IP adrese kojima je dopušten pristup. Zatim dobivamo niz pomoću eksplodirati() i potražite adresu klijenta od $_SERVER["REMOTE_ADDR"]. Koristio sam funkciju za pretraživanje pretraživanje_niza(), budući da je malo vjerojatno da će njegov kod implementiran u C-u raditi nešto brže od onoga što možemo napisati u PHP pomoću petlji za ili za svakoga. Ali brzina ovdje nije glavna :)

I posljednji korak zaštite je provjera MAC adrese. Klasificira se kao paranoičan i trebao bi se koristiti ako pristupate s lokalne mreže, a podaci koje štitite su zaista vrlo važni. Do sada sam implementirao ovu provjeru samo na sustavu Linux, zbog relativne jednostavnosti implementacije. Ali možete ga pokušati implementirati za bilo koju drugu platformu. Napišemo funkciju:

Kao što su korisnici Linuxa već shvatili, temelji se na ARP tablica sustava, kojoj se može pristupiti pomoću datoteke /proc/net/arp. Funkcija traži tražene nizove IP adresu i vraća je MAC adresa:

Vaš IP=192.168.10.15 i MAC=00:04:31:E4:F8:37

U sustavu Windows Možda postoje i neki načini za dobivanje MAC jednostavniji, ali od onih koji stvarno rade, ovo je zaključak ARP sistemske tablice naredbom:

C:\WINDOWS\>arp -a sučelje: 192.168.10.15 na sučelju 0x1000003 IP adresa Tip fizičke adrese 192.168.10.1 00-50-22-b0-6a-aa dinamički 192.168.10.2 00-0f-38-68-e9- e8 dinamički 192.168.10.3 00-04-61-9e-26-09 dinamički 192.168.10.5 00-0f-38-6a-b1-18 dinamički

Možete sami implementirati zaštitu temeljenu na ovoj adresi ako vam je stvarno potrebna :) Ali zapamtite da ako na mreži imate neupravljanu opremu bez mogućnosti vezanja MAC adrese na port, ova zaštita možda neće raditi jer svi vaši identifikacijski podaci korišteni za zaštitu (prijava, lozinka, IP i MAC adresa) mogu biti krivotvoreni.



Uvod

Ovo je vodič osmišljen kako bi vam pokazao osnove zaštite vaših web stranica pomoću HTTP provjere autentičnosti. Umjesto tradicionalne metode .htaccess (Apache poslužitelj), koristit ćemo MySQL za pohranu korisničkih podataka i njihovih lozinki. Pokušat ću što više objasniti što je, po mom mišljenju, potrebno početniku da nauči MySQL i PHP. U principu, na temelju ovog programa možete koristiti bilo koji DBMS (sustav za upravljanje bazom podataka). Zašto je ova metoda zanimljiva? Pa, na primjer, ako samo zato što ako koristite bazu podataka, možete lako dopustiti da samo određena grupa (osoba) ima određena prava pristupa ovim ili onim informacijama. Ako koristite tradicionalnu .htaccess Apache metodu, morate ručno dodati korisnike i lozinku u datoteku zaporke. A prednost ove metode je...potražite sami.

Potreban softver:

· *nix platforma (Linux, Unix, *BSD) · PHP 3.0.x ili PHP 4.x · MySQL (bilo koja verzija)

Korak broj jedan

Samo naprijed, prva stvar koju moramo shvatiti je da želimo dopustiti korisnicima koji su u našoj bazi podataka pristup navedenoj stranici? A kako ćemo to učiniti? (mnogi ljudi to baš i ne vole, ali trebamo se naviknuti uzeti komad papira prije programiranja i zapisati sve zahtjeve koje želimo dobiti od programa, dugoročno gledano uštedjet ćete sate ili možda dane za izmjene koda (cca.))

Provjerite je li korisnik već autentificiran.

Ako nije, pošaljite poruku pregledniku s porukom i pristupnim obrascem.

Ako korisnik klikne na gumb za odustajanje, nemojte mu dopustiti pristup i preusmjerite ga na... 403: Pristup odbijen ili pokažite (kolačić J) jednostavnu poruku.

Ako je korisnik ispunio kombinaciju korisničkog imena i lozinke, provjerite ih u MySQL bazi i uvjerite se da su točni, ako da, dopustite pristup.

Ako ne razumijete sve, ne brinite, bit će jasno kasnije (ili možda nikada)!

Drugi korak - Stvorite našu bazu podataka

Želimo da baza podataka pohranjuje prijavu i lozinku naših korisnika. Potrebna polja mogu se jednostavno dodati u postojeću bazu podataka, ali za sada ćemo pretpostaviti da ne dodajete u postojeću bazu podataka, već stvarate novu. Sljedeći kod je opis kako to učiniti. Pretpostavka: ako imate Apache na računalu, možete početi odmah :)

mysql> stvoriti članove baze podataka;
mysql> kreiraj korisnike tablice (
korisničko ime varchar(25) NOT NULL,
lozinka varchar(15) NIJE NULL,
primarni ključ (korisničko ime),
jedinstveno korisničko ime (korisničko ime)
);

Sada imamo bazu podataka u koju pohranjujemo korisnike, pretpostavlja se da korisničko ime ima do 25 znakova, a zaporke do 15 znakova. (ako vam iz nekog razloga ne odgovara, postavite ga kako vam odgovara) Korisničko ime treba imati vrijednost "primarni ključ" i biti "unique", jer ne želimo da 2 ili više ljudi imaju isto korisničko ime.

Imajte na umu da će korisnička imena biti osjetljiva na sljedeća velika i mala slova, korisnik "Vasya" bit će identificiran drugačije od korisnika "vasya", drugim riječima osjetljivo na velika i mala slova. Sada ćemo dodati testnog korisnika u MySQL kako bismo mogli koristiti njegove podatke za testove kada kreiramo PHP stranicu.

mysql> odobri odabir na members.users
na httpuser@localhost
identificiran pomoću "MyPassword";

To je tako da kada želimo provjeriti korisnika i lozinku osobe registrirane u našoj bazi podataka, koristit ćemo korisnika "httpuser" sa lozinkom "MyPassword". Na kraju moramo dodati korisničko ime i lozinku osobe kojoj želimo dopustiti pristup.

mysql> umetni u korisničku vrijednost ("john_doe", "eod_nhoj");

Namjerno nisam kriptirao podatke u programu, da ih u slučaju gubitka lozinke ne bih morao dešifrirati, i pojednostavio na minimum :)) To je to, gotovi smo s MySQL-om, sad idemo na!

Treći korak - napišite PHP kod

Prije nego počnemo, ukratko ću opisati što će paga učiniti. Kada dođete do sigurne stranice, poslužitelj će poslati zahtjev i prikazati stranicu za unos vašeg imena i lozinke. Ako kliknete na gumb za odustajanje ili unesete netočne podatke, poslužitelj će vam poslati (401 Neovlašteno zaglavlje i zabraniti pristup.) - ovako upit obično prevodi redak (401 Neautorizirano zaglavlje i zabraniti pristup) Neću ne objašnjavaj, po mom mišljenju ne postoji bolji način da se to kaže !!! U slučaju da sve unesete ispravno, ispada da ćete jednostavno dobiti pristup (to je ono što je trebalo dokazati). Namjerno je napisano brojevima redaka, nakon šifre (ispod) navedena su objašnjenja za retke.

01 02
03 funkcija access_denied() (
04 echo "401 Neovlašteno: Kombinacija korisničkog imena i lozinke koju ste unijeli je nevažeća.n";
05 }
06
07 funkcija auth_headers($title) (
08 Header("WWW-Authenticate: Basic realm="$title"");
09 Zaglavlje ("HTTP/1.0 401 neovlašteno");
10 }
11
12 if(!isset($PHP_AUTH_USER)) (
13 auth_headers("Moja zaštićena web stranica");
14 access_denied();
15 izlaz;
16 }
17 drugo (
18
19 $hostname = "localhost";
20 $username = "httpuser";
21 $lozinka = "Moja lozinka";
22 $baza podataka = "članovi";
23
24 $query = "odaberite korisničko ime, lozinku od korisnika gdje korisničko ime="$PHP_AUTH_USER" i lozinka="$PHP_AUTH_PW"";
25 $link = mysql_connect($localhost, $username, $password) or die("Nije moguće spojiti se na poslužitelj baze podataka");
26
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) (
28 auth_headers("Moja zaštićena web stranica");
29 access_denied();
30 izlaz;
31 }
32
33 mysql_close($link);
34 }
35 ?>

U tome je trik, radi, radi, možete ga koristiti gdje god hoćete, kad god hoćete i kako hoćete, mijenjate ga, poboljšavate, ako uspijete smanjiti kod na dvije linije a da zadržite funkcionalnost programa, onda mi ga obavezno pošalji!!!

U ovom ćemo odjeljku brzo istražiti svaki redak kako bismo spriječili žestoke razmjene pitanja u komentarima na ovaj članak.

Redak 3:
Ova funkcija će prikazati poruku ako "zločesti korisnik" uporno upisuje netočne podatke. Napravio sam ovo kao funkciju jer je koristimo dva puta, i samo da skratim izvorni kod.

Redak 7:
Budući da i ovo zaglavlje koristimo dvaput, napravio sam i ovo funkcijom.

Redak 8:
Proslijedite zaglavlje u preglednik koji će prisiliti korisnika da unese svoje korisničko ime i lozinku. Varijabla $title bit će prikazana u dijalogu za prijavu.

Redak 9:
Pri prvom zahtjevu prikazuje se zaglavlje; kada se ponovno otkaže, prikazuje se poruka koja označava da je pristup odbijen.

Redak 12:
$PHP_AUTH_USER je petlja koja prikazuje poruku koja kaže da je stranica zaštićena i izlazite!

Redak 19-23:
To je nešto što nitko osim vas ne zna, odnosno način spajanja na bazu podataka, ime hosta, imena baze podataka, korisničko ime i lozinku. (za spajanje na MySQL)

Redak 24:
MySQL upit koji vraća korisnička imena i lozinke.

Redak 25:
Uspostavite vezu s MySQL i prikažite prokletstvo ako nema veze!!! (ovo znači da nešto nije u redu u redovima 19-23, ili uopće ne postoji MySQL)

Redak 27:
Obradi $query. Ako vrati - 0, to znači da je unesena neispravna kombinacija.

Redak 33:
Prekini vezu s MySQL-om.

Preporučio bih spremanje PHP koda u datoteku pod nazivom user_auth.php, user_auth.php3 ili... (evo vaše mašte o ovoj temi) Pretpostavimo da ste spremili ovaj kod u datoteku user_auth.php. Kad god iznenada želimo zaštititi svoju strogo povjerljivu stranicu na mreži, jednostavno uključimo ovu datoteku. Jedino na što bih vam želio skrenuti pozornost je da ga, logično, morate spojiti na samom vrhu vaše zaštićene PHP stranice, savjetujem vam da u red broj 1 svojih stranica napišete sljedeće:

gdje je "user_auth.php" naziv datoteke pod kojom ste spremili kod.

Vaše pitanje - Ne koristim MySQL, što da radim?

Posavjetuj se sa adminom svog servera, ako se pokaže ljubazan, onda će ti pomoći, za njega je to 5 minuta posla, ako zli ne pomogne, onda idi na forum vezan za bazu podataka koju si koristeći i vikati u pomoć! Ili ako se smatrate normalnim programerom, onda... ovaj kod vam uopće neće trebati, a stvarat ćete "sesije", šifrirati pomoću PGP-a i općenito pervertirati kao da radite zaštitu za amazon.com

Ovaj članak je zastario.

Ovaj je članak napisan za uslugu dijeljenog hostinga koja je zastarjela 1. lipnja 2019.

Aktualnu uslugu hostinga možete naručiti na našoj web stranici

HTTP autorizacija pomoću PHP-a

Ovaj članak govori o stvaranju HTTP autorizacije pomoću PHP-a, što će vam omogućiti da zatvorite bilo koji odjeljak web stranice, na primjer administrativni dio.

Za provjeru autentičnosti, HTTP pruža jednostavan mehanizam izazov-odgovor koji poslužitelj može koristiti za osporavanje zahtjeva klijenta, a klijent za pružanje informacija o provjeri autentičnosti. Najčešća autorizacijska shema je osnovna autentifikacijska shema.

"Osnovna" shema provjere autentičnosti temelji se na činjenici da se korisnički agent (preglednik) mora autentificirati koristeći korisnički ID (korisničko ime) i lozinku za svako zaštićeno područje. Poslužitelj će uvažiti zahtjev ako može potvrditi da su korisnički ID i lozinka točni za dano zaštićeno područje. U ovoj shemi nisu navedeni dodatni identifikacijski parametri.

Nakon što primi zahtjev za autentifikaciju, poslužitelj odgovara izazovom sličnim sljedećem:

WWW-Authenticate: Basic realm="Restricted Area" HTTP/1.1 401 Neovlašteno

Ovdje je "Ograničeno područje" niz dodijeljen od strane poslužitelja koji identificira zaštićeno područje zatraženog URI-ja (Request-URI). Jednostavnim rječnikom, naziv zaštićenog područja.

Zatim, za dobivanje vjerodajnica za pristup, korisnički agent (preglednik) šalje korisnički ID (korisničko ime) i lozinku, odvojene jednim znakom dvotočke (":"), poslužitelju unutar niza vjerodajnica kodiranih base64:

Basic-credentials = "Osnovni" osnovni kolačić

Ovdje

  • basic-cookie -- base64-kodirani niz koji sadrži korisničku propusnicu
  • user-pass -- niz poput "userid:password"
  • userid -- tekst koji ne sadrži znakove ":".
  • lozinka -- tekst

Imajte na umu da i korisničko ime i lozinka razlikuju velika i mala slova. To jest, na primjer, Korisnik i korisnik dva su različita korisnička imena.

HTTP autorizacija i PHP

Možda ste već koristili osnovnu autorizacijsku shemu s PHP-om i znate da je bit metode primiti PHP_AUTH_USER i PHP_AUTH_PW varijable od web poslužitelja, koje definiraju korisničko ime i lozinku, te ih na neki način obraditi unutar PHP skripte . Ali imajte na umu da je ova metoda učinkovita samo kada PHP funkcionira kao modul Apache web poslužitelja. Na našem hostingu, PHP radi u CGI/FastCGI modu i gore opisana metoda neće raditi, budući da PHP_AUTH_USER i PHP_AUTH_PW varijable neće biti proslijeđene unutar skripte.

Međutim, postoji način da se zaobiđe ovo ograničenje i proslijede vrijednosti korisničkog imena i lozinke koje korisnik unese unutar PHP skripte. U te svrhe koriste se alati mod_rewrite - Apache web server modul. Pravila koja ćemo koristiti su sljedeća:

RewriteCond %(HTTP:Authorization) ^Basic.* RewriteRule (.*) index.php?authorization=%(HTTP:Authorization)

Kada postavljate zahtjev putem HTTP-a u datoteku sitename.ru/www/index.php, ovo pravilo će prenijeti sadržaj nepraznog polja za autorizaciju u parametar za autorizaciju kao GET zahtjev. Ako koristimo PHP da pogledamo sadržaj varijable $_GET["authorization"], vidjet ćemo samo gore opisane osnovne vjerodajnice - redak poput:

Preg_match("/^Basic\s+(.*)$/i", $_GET["autorizacija"], $user_pass); lista($user,$pass)=explode(":",base64_decode($user_pass));

Na taj način ćemo dobiti dvije varijable - $user i $pass, koje sadrže korisničko ime, odnosno lozinku. Sada ih, kao što je gore spomenuto, treba samo na neki način obraditi - na primjer, usporediti sa sličnim varijablama iz baze podataka ili iz datoteke s korisničkim računima.

Zaključak

Metoda o kojoj se govori u ovom članku uspješno će funkcionirati ne samo na našem hostingu, već i svugdje gdje PHP radi u CGI/FastCGI modu i Apache + mod_rewrite se koristi kao web poslužitelj.

Izvorne tekstove radnih primjera možete pronaći u Dodatku ovog članka.

Primjena. Izvori skripti

Izvorni tekst datoteke .htaccess

RewriteEngine na RewriteBase / RewriteCond %(HTTP:Authorization) ^Basic.* RewriteRule (.*) index.php?authorization=%(HTTP:Authorization)

Izvorni tekst PHP skripte

$autentificirano=0; if(isset($_GET["autorizacija"])) ( if(preg_match("/^Basic\s+(.*)$/i", $_GET["autorizacija"], $user_pass)) ( lista($user ,$pass)=explode(":",base64_decode($user_pass)); 1; ) ) if($authenticated) ( // Autorizacija uspješno završena echo("korisnik: ".$korisnik."
pass: ".$pass); ) else ( header("WWW-Authenticate: Basic realm="Restricted Area""); header("HTTP/1.1 401 Unauthorized"); echo("Pristup odbijen."); )


Vrh