Contacte

HTTP Instalarea securității pe o pagină folosind MySQL și PHP. HTTP Instalarea securității pe o pagină utilizând codul sursă MySQL și PHP PHP

O zi buna prieteni! Să aruncăm o privire la înregistrarea utilizatorilor în PHP. Mai întâi, să definim condițiile pentru înregistrarea utilizatorului nostru:

  • Parola este criptată folosind un algoritm MD5
  • Parola va fi „sare”
  • Verificare autentificare ocupată
  • Activarea utilizatorului prin scrisoare.
  • Înregistrarea și stocarea datelor în DBMS MySQL

Pentru a scrie acest script, trebuie să înțelegem ce este înregistrarea utilizatorului. Înregistrarea utilizatorilor este achiziția de date reale de utilizator, prelucrarea și stocarea datelor.

Cu cuvinte simple, înregistrarea este doar o înregistrare și stocare a anumitor date prin care putem autoriza utilizatorul în cazul nostru - acesta este Login și Parola.

Autorizare - acordarea unei anumite persoane sau a unui grup de persoane a drepturilor de a efectua anumite acțiuni, precum și procesul de verificare a acestor drepturi atunci când se încearcă efectuarea acestor acțiuni. Mai simplu spus, cu ajutorul autorizației, putem restricționa accesul la un anumit conținut de pe site-ul nostru.

Să aruncăm o privire la structura directorului de script pentru a implementa autentificarea noastră cu autorizare. Trebuie să împărțim scripturile în părți logice. Am plasat modulele de înregistrare și autorizare într-un director separat. De asemenea, vom plasa conexiunea la baza de date în directoare separate. MySQL, fișier cu funcții personalizate, fișier de stil cssși șablonul nostru HTML. Această structură vă permite să navigați rapid prin scripturi. Imaginați-vă că aveți un site mare cu o grămadă de module și așa mai departe. iar dacă nu există ordine, va fi foarte greu să găsești ceva într-o asemenea mizerie.

Deoarece vom stoca toate datele în DBMS MySQL, apoi să creăm un mic tabel în care vom stoca datele de înregistrare.

Mai întâi trebuie să creați un tabel în baza de date. Să sunăm la masă bez_reg Unde bez este prefixul tabelului și reg numele tabelului.

Structura tabelului: bez_reg

-- -- Structura tabelului `bez_reg` -- CREATE TABLE IF NU EXISTIS `bez_reg` (`id` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(200) NOT NULL, `pass` varchar(32) NOT NULL , `salt` varchar(32) NOT NULL, `active_hex` varchar(32) NOT NULL, `status` int(1) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Acum să creăm scripturile principale pentru lucrări ulterioare.

FIȘIER INDEX.PHP

FIȘIER CONFIG.PHP

"); ?>

Fișierul 404.HTML

Eroare 404

Eroare 404

A apărut o eroare 404 pe pagină

Întoarcere


Fișier BD.PHP

FIȘIER INDEX.HTML

Înregistrarea utilizatorului PHP MySQL cu e-mail de activare



FIȘIER FUNCT.PHP

"."\n"; if(is_array($date)) ( foreach($data as $val) $err .= "

  • ".$val."
  • "."\n"; ) else $err .= "
  • ".$date."
  • "."\n"; $err .= ""."\n"; return $err; ) /**Wrapper de interogare MySQL simplu * @param șir $sql */ function mysqlQuery($sql) ( $res = mysql_query($sql); /* Verificați rezultatul Acesta este afișat interogarea efectivă trimisă către MySQL, precum și eroarea.*/ if(!$res) ( $message = "Interogare greșită: " . mysql_error() . "\n"; $message .= "Întreaga interogare: " . $ sql; die($mesaj); ) return $res; ) /**Generator simplu de sare * @param șir $sql */ function salt() ( $salt = substr(md5(uniqid()), - 8); return $sare;)

    Să începem să scriem înregistrarea. Pentru început, va trebui să facem un șablon de formular de înregistrare, astfel încât utilizatorul să-și poată introduce datele pentru prelucrare. În continuare, va trebui să scriem propriul handler de formular, care va verifica corectitudinea datelor introduse de utilizator. După ce datele sunt verificate cu succes, le scriem în baza noastră de date și trimitem un e-mail utilizatorului pentru a-și activa contul.

    FIȘIER REG.PHP

    Te-ai înregistrat cu succes! Vă rugăm să vă activați contul!!"; //Activează contul if(isset($_GET["key"])) ( //Verifică cheia $sql = "SELECT * FROM `". BEZ_DBPREFIX ."reg` WHERE `active_hex` = "". escape_str ( $_GET["cheie"]) ."""; $res = mysqlQuery($sql); if(mysql_num_rows($res) == 0) $err = "Cheia de activare este nevalidă!"; //Verificați erori și afișați utilizatorului if(count($err) > 0) echo showErrorMessage($err); else ( //Obțineți adresa utilizatorului $row = mysql_fetch_assoc($res); $email = $row["login"]; //Activează utilizatorul contului $sql = "UPDATE `".BEZ_DBPREFIX ."reg` SET `status` = 1 WHERE `login` = "".$email ."""; $res = mysqlQuery($sql); / /Trimite e-mail de activare $title = "(!LANG:Contul dvs. de la http://site-ul web a fost activat cu succes"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [email protected](+\.)+(2,6)$/i", $_POST["e-mail"])) $err = "E-mail introdus incorect"."\n"; ) if(empty($_POST[ "trece") ])) $err = "Câmpul pentru parola nu poate fi gol"; if(empty($_POST["pass2"])) $err = "Câmpul de confirmare a parolei nu poate fi gol"; //Verificați erorile și afișați utilizatorului dacă (count($err) > 0) echo showErrorMessage($err); else ( /*Continuați să verificați datele introduse Verificați parolele care se potrivesc*/ if($_POST["pass"] != $_POST["pass2" ] ) $err = „Parolele nu se potrivesc”; //Verificați erorile și afișați utilizatorului if(count($err) > 0) echo showErrorMessage($err); else ( /*Verificați dacă avem un astfel de utilizator în baza de date* / $sql = "SELECT `login` FROM `".BEZ_DBPREFIX ."reg` WHERE `login` = "".escape_str($_POST["email"]) ."""; $res = mysqlQuery($ sql); if(mysql_num_rows($res) > 0) $err = "Ne pare rău pentru autentificare: ". $_POST["e-mail"] ." ocupat!"; //Verificați erorile și afișați utilizatorului if(count($err) > 0) echo showErrorMessage($err); else ( //Obțineți HASH-ul sării $salt = salt(); // Salt parola $pass = md5(md5($_POST["pass"]).$salt); /*Dacă totul merge bine, scrieți datele în baza de date*/ $sql = "INSERT INTO `". BEZ_DBPREFIX ."reg ` VALUES("", "" .escape_str($_POST["email"]) ."", "". $pass ."", "". $salt ."", "". md5($salt) . "", 0)"; $ res = mysqlQuery($sql); //Trimite e-mail de activare $url = BEZ_HOST ."less/reg/?mode=reg&key=". md5($salt); $title = "(! LANG:Înregistrare pe http://site-ul web"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    REG_FORM.HTML FILE

    Înregistrarea utilizatorului PHP MySQL cu e-mail de activare

    E-mail *:
    Parola *:
    Confirmarea parolei *:

    Câmpuri cu o pictogramă * necesar

    Deoarece înregistrarea noastră de utilizator este gata, este timpul să scriem autorizarea. Vom crea un formular pentru autorizarea utilizatorului, apoi vom scrie un handler de formular de autorizare și, în final, vom face un script arată.php care ne va arăta dacă suntem sau nu autorizați în sistem.

    FIȘIER AUTH.PHP

    0) echo showErrorMessage($err); else ( /*Creează o interogare de preluare a bazei de date pentru a autentifica utilizatorul*/ $sql = "SELECT * FROM `". BEZ_DBPREFIX ."reg` WHERE `login` = "". escape_str($_POST["email"]) ." " AND `status` = 1"; $res = mysqlQuery($sql); //Dacă autentificarea se potrivește, verificați parola if(mysql_num_rows($res) > 0) ( //Obțineți date din tabel $row = mysql_fetch_assoc( $res ); if(md5(md5($_POST["pass"]).$row["salt"]) == $row["pass"]) ( $_SESSION["user"] = true; // Resetați parametrii header("Locație:". BEZ_HOST .."less/reg/?mode=auth"); ieșire; ) else echo showErrorMessage("Parolă greșită!"); ) else echo showErrorMessage ("Autentificare ". $_POST["e-mail"] ." nu a fost găsit!"); ) ) ?>

    Pentru cei care au cea mai recentă versiune de PHP, postez acest script folosind DOP deoarece extensie MySQL este depreciat și a fost eliminat din noua versiune de PHP. Descărcați înregistrarea și autorizarea php mysql pdo

    Arhiva a fost actualizată la 24 februarie 2015.

    Atenţie: Dacă utilizați acest script pe un server local, cum ar fi DENWER,XAMPP, atunci nu ar trebui să așteptați scrisorile către căsuța poștală. Scrisorile sunt în ciot sendmail. ÎN Denver le poți găsi pe parcurs Z:\tmp\!sendmail\ Puteți deschide aceste fișiere în orice client de e-mail.

    Vom învăța cum să facem autentificarea simplă a utilizatorului pe site. Site-ul poate avea pagini doar pentru utilizatori autorizați și vor funcționa pe deplin dacă le adăugăm blocul nostru de autentificare. Pentru a-l crea, aveți nevoie de o bază de date MySQL. Poate avea 5 coloane (minimum) sau mai multe dacă doriți să adăugați informații despre utilizatori. Să denumim baza de date „Userauth”.

    Să creăm următoarele câmpuri în el: ID pentru numărarea numărului de utilizatori, UID pentru numărul unic de identificare al utilizatorului, Nume de utilizator pentru numele de utilizator, E-mail pentru adresa sa de e-mail și Parolă pentru parolă. Puteți folosi utilizatorul și baza de date pe care o aveți deja pentru autorizare, doar, ca și în cazul unei noi baze de date, creați în ea următorul tabel.

    Cod MySQL

    CREATE TABLE `users` (`ID` int (11) NOT NULL AUTO_INCREMENT, `UID` int (11) NOT NULL, `Username` text NOT NULL, `Email` text NOT NULL, `Parolă` text NOT NULL, CHEIE PRIMARĂ (`ID`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

    Acum să creăm fișierul „sql.php”. Este responsabil pentru conectarea la baza de date. Acest cod creează mai întâi variabile pentru server și utilizator atunci când se conectează la server. În al doilea rând, va selecta baza de date, în acest caz „USERAUTH”. Acest fișier trebuie inclus în „log.php” și „reg.php” pentru a accesa baza de date.

    Cod PHP

    //Numele dvs. de utilizator MySQL$pass = "redere"; //parola $conn = mysql_connect ($server, $utilizator, $pass); //conexiune la server$db = mysql_select_db("userauth", $conn); //selectați baza de date dacă (!$db) ( //dacă nu se poate selecta baza de date echo „Ne pare rău, eroare:(/>”; //Afișează mesajul de eroare Ieșire(); //Permite rularea altor scripturi PHP } ?>

    Urmează pagina de autentificare, să o numim „login.php”. În primul rând, verifică datele introduse pentru erori. Pagina are câmpuri pentru nume de utilizator, parolă, un buton de trimitere și un link de înregistrare. Când utilizatorul face clic pe butonul „Login”, formularul va fi procesat de codul din fișierul „log.php”, iar apoi va avea loc autentificarea.

    Cod PHP

    0) { //dacă există erori de sesiune$err = "

    "; //Începe un tabel pentru fiecare ($_SESSION["ERRMSG"] ca $msg) ( //recunoaștem fiecare eroare$err .=" "; //scrieți-l într-o variabilă) $err .="
    " . $msg ."
    "; //închiderea mesei unset($_SESSION["ERRMSG"]); //sterge sesiunea } ?> Formular de autentificare
    Nume de utilizator
    Parola
    înregistrare


    Apoi scriem un script pentru autentificare. Să-i denumim „log.php”. Are o caracteristică pentru a curăța intrările de injecție SQL care vă pot distruge scriptul. În al doilea rând, primește datele formularului și le validează pentru valabilitate. Dacă datele de intrare sunt corecte, scriptul trimite utilizatorul la pagina de utilizatori autorizați, dacă nu, setează erori și trimite utilizatorul la pagina de autentificare.

    Cod PHP

    //porniți sesiunea pentru înregistrare funcția Fix($str) ( // șterge câmpurile $str = trim($str); if (get_magic_quotes_gpc()) ( $str = bare bare ($str); ) //matrice pentru a stoca erori$errflag = false ; //marker eroare $nume utilizator = Fix($_POST[„nume utilizator”]); //Nume de utilizator$parolă = Fix($_POST[„parolă”]);//parolă) //verificați parola if ($parolă == "") ( $errmsg = "Parola lipsește"; //eroare $errflag = adevărat ; //ridicați steag la eroare ) //dacă semnalul de eroare este ridicat, redirecționează înapoi la formularul de înregistrare // înregistrează erorile session_write_close(); //închiderea sesiunii //redirecţiona Ieșire(); ) //cerere către baza de date$qry = "SELECT * FROM `users` WHERE `Username` = "$username" AND `Password` = "" . md5 ($parola) . """; $rezultat = mysql_query($qry); // verifică dacă cererea a avut succes (dacă există date despre ea) if (mysql_num_rows ($rezultat) == 1) ( while ($row = mysql_fetch_assoc ($rezult)) ( $_SESSION["UID"] = $row["UID"]; // obțineți UID-ul din baza de date și puneți-l în sesiune$_SESSION["USERNAME"] = $nume utilizator; //setează dacă numele de utilizator se potrivește cu cel al sesiunii session_write_close(); //închiderea sesiunii header("locație: membru.php"); //redirecţiona) ) else ( $_SESSION["ERRMSG"] = "Nume de utilizator sau parola nevalide"; //eroare session_write_close(); //închiderea sesiunii header("locație: login.php"); //redirecţiona Ieșire(); ) ?>

    Să facem o pagină de înregistrare, să o numim „register.php”. Este asemănător cu pagina de autentificare, doar că mai are câteva câmpuri, iar în loc de un link de înregistrare, un link către login.php în cazul în care utilizatorul are deja un cont.

    Cod PHP

    0) { //dacă există erori de sesiune$err = "

    "; //începutul tabelului foreach ($_SESSION["ERRMSG"] ca $msg) ( // setează fiecare eroare$err .=" "; //le scrie într-o variabilă) $err .="
    " . $msg ."
    "; // sfârşitul tabelului nesetat ($_SESSION["ERRMSG"]); //distruge sesiunea } ?> Formular de înregistrare
    Nume de utilizator
    E-mail
    Parola
    Repetați parola
    am un cont


    Acum să facem un script de înregistrare în fișierul „reg.php”. Acesta va include „sql.php” pentru a se conecta la baza de date. Este folosită aceeași funcție ca și în scriptul de conectare pentru a șterge câmpul de introducere. Sunt setate variabile pentru posibile erori. Urmează o funcție pentru a crea un identificator unic care nu a fost furnizat niciodată înainte. Datele sunt apoi preluate din formularul de înregistrare și validate. Verifică dacă adresa de e-mail este în formatul corect și dacă parola este reintrodusă corect. Apoi, scriptul verifică dacă există un utilizator cu același nume în baza de date și, dacă da, raportează o eroare. Și, în sfârșit, codul adaugă utilizatorul la baza de date.

    Cod PHP

    //porniți sesiunea pentru înregistrare funcția Fix($str) ( // șterge câmpurile $str = @trim($str); if (get_magic_quotes_gpc()) ( $str = bare oblice ($str); ) returnează mysql_real_escape_string($str); ) $errmsg = array(); //matrice pentru a stoca erori$errflag = false ; //marca de eroare $UID = "12323543534523453451465685454";//ID unic $username = Fix($_POST["username"]); //Nume de utilizator$email = $_POST[„e-mail”]; //E-mail $parolă = Fix($_POST["parolă"]);//parolă $rparolă = Remediare($_POST["rparolă"]);//repetare parolă //verificați numele de utilizator if ($username == "") ( $errmsg = "Nume de utilizator lipsește"; //eroare $errflag = true ; //ridicați steag la eroare) //verifică E-mail if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@+(\.+)*(\.(2,3) ))$", $email)) ( //trebuie să urmeze formatul: [email protected]$errmsg = "E-mail nevalid"; //eroare $errflag = true ; //ridicați steag la eroare } //verificați parola if ($parolă == "") ( $errmsg = "Parola lipsește"; //eroare $errflag = true ; //ridicați steag la eroare } //verificați repetarea parolei if ($rpassword == "") ( $errmsg = "Parola repetată lipsește";//eroare $errflag = true ; //ridicați steag la eroare } // verifică dacă parola este validă if (strcmp($parolă, $rparolă) != 0) ( $errmsg = "Parolele nu se potrivesc";//error $errflag = true ; //ridicați steag la eroare } //verificați dacă numele de utilizator este gratuit if ($username != "") ( $qry = "SELECT * FROM `users` WHERE `Username` = "$username"""; // interogare MySQL $result = mysql_query ($qry); if ($result) ( dacă (mysql_num_rows ($rezultat) > 0) ( //dacă numele este deja folosit$errmsg = "Nume de utilizator deja folosit"; //mesaj de eroare$errflag = adevărat; //ridicați steag la eroare) mysql_free_result($rezultat); ) ) //dacă datele nu sunt validate, redirecționează înapoi la formularul de înregistrare if ($errflag) ( $_SESSION["ERRMSG"] = $errmsg; //mesaj de eroare session_write_close(); //închiderea sesiunii antet("locație: register.php"); //redirecţiona Ieșire(); ) //adăugarea datelor la baza de date$qry = "INSERT INTO `userauth`.`users`(`UID`, `Username`, `E-mail`, `Parolă`) VALUES("$UID","$username","$email","" . md5 ($parolă). """); $rezultat = mysql_query($qry); //verifică dacă cererea de adăugare a avut succes if ($rezultat) ( echo „Vă mulțumim pentru înregistrare, „ .$username . ". Vă rugăm să vă conectați Aici"; exit (); ) else ( die ("Eroare, verificați mai târziu"); ) ?>

    De asemenea, trebuie să creați un script pentru a deconecta utilizatorul din sistem. Acesta încheie sesiunea pentru utilizator cu id-ul și numele unic dat, apoi redirecționează utilizatorul către pagina de conectare.

    Cod PHP

    În cele din urmă, scriptul „auth.php” poate fi folosit pentru a face paginile accesibile numai utilizatorilor autorizați. Verifică datele de conectare și, dacă sunt corecte, permite utilizatorului să vizualizeze paginile, iar dacă nu, solicită să se autentifice. În plus, dacă cineva încearcă să pirateze site-ul prin crearea uneia dintre sesiuni, acesta va fi avortat, ca în cazul general.

    Cod PHP

    Una dintre condițiile din codul de mai sus este subiectul întrebării în .

    Următorul cod trebuie introdus în pagina pentru utilizatorii autorizați, se numește, de exemplu, „member.php”, și îl puteți numi cum doriți.

    Cod PHP

    Sunteți autorizat să accesați această pagină. Ieși ( )

    Autentificarea utilizatorului este gata!

    Restricționarea accesului la o anumită zonă a site-ului arată de obicei
    monoton: fiecărui utilizator i se oferă un login și o parolă sau el însuși
    le selectează și trebuie să le introduceți pentru a intra în partea securizată a site-ului. Din punct de vedere tehnic, verificarea parolei folosește
    metode diferite. Un formular HTML poate fi folosit pentru a introduce un nume de utilizator și o parolă.
    În acest caz, parola este trimisă serverului în text clar în cererea POST.
    Acest lucru este inacceptabil dacă utilizatorul se află în LAN acolo unde este posibil
    folosind un sniffer. Pentru a rezolva această problemă, a fost dezvoltată o metodă
    autentificare hash, în care parola nu este transmisă, dar
    se transmite un șir hash, în funcție de parolă, o singură dată
    parametru și, eventual, din orice alți parametri. Această metodă este încă
    se numește provocare/răspuns pentru că atunci când îl folosești, clientul
    primește o solicitare cu un parametru unic și trimite un răspuns care conține hash-ul. La nivel de protocol HTTP 1.1, autentificarea este posibilă folosind metoda
    Basic, care nu este mai bun decât utilizarea unui formular HTML, și Digest, care
    vom lua în considerare în detaliu.

    Când utilizați metoda Digest, așa cum sa menționat deja, parola
    nu se transmite și nu poate fi adulmecat, dar există o altă latură
    Probleme. Pentru a verifica parola, serverul trebuie să calculeze
    răspunsul și comparați-l cu răspunsul clientului, prin urmare, serverul trebuie
    stoca parola sau datele dependente de aceasta, necesare pt
    autentificare de trecere. Rezultă că o persoană care a primit drepturi
    pentru a citi conturile (de exemplu, folosind SQL-injection), va putea obține
    acces la paginile protejate prin metoda Digest. Când se utilizează metoda
    De bază, este posibil să stocați hash-uri în loc de parole, ceea ce nu permite ridicarea drepturilor,
    după citirea acestor hash-uri (mai jos vom vedea că Digest poate stoca și hash-uri,
    dar astfel încât cunoștințele lor sunt suficiente pentru a calcula răspunsul). Astfel, ne confruntăm cu o dilemă: fie parola noastră va fi adulmecată,
    sau o vor obține printr-o vulnerabilitate web pe care cineva o va găsi cu siguranță,
    pentru că cine caută va găsi mereu. Există o metodă de autentificare fără
    ambele deficiențe - metoda de autentificare cu cheie publică:
    aveți nevoie de o cheie publică pentru verificare și de o cheie secretă pentru verificare,
    totuși, HTTP 1.1 nu oferă o astfel de metodă. RFC 2069
    recomandă utilizarea SSL dacă securitatea este atât de importantă. Doar transmiterea parolei este protejată, iar conținutul nu este criptat, deci
    că nu are sens să protejăm resursele cu această metodă, de unde utilizatorul
    primește informații secrete. Au nevoie de SSL. Și are sens
    pentru a proteja, de exemplu, un forum sau pentru a încărca conținut pe un site. Deci, dacă găzduirea nu acceptă SSL, și autentificarea trebuie
    pentru a fi în siguranță, atunci vom folosi Digest. Apache are un modul mod_digest. Pentru a-l folosi
    în config (sau în .htaccess) scriem:

    AuthType Digest
    AuthUserFile<файл>
    AuthName<название защищаемой области>
    Necesită valid_user

    Fișierele utilizator sunt create de utilitar
    htdigest. Mod_digest a fost raportat de ceva vreme ca fiind vulnerabil, deci,
    poate că mai sunt câteva probleme de găsit. În plus, când
    Am încercat să-l folosesc acasă, am primit o eroare
    500 Eroare internă server. În plus, dacă ar trebui să apară adăugarea de conturi
    automat și ar trebui să fie mulți, ar trebui
    să fie stocat nu în configurația Apache, ci în MySQL. Soluție -
    utilizați php. PHP nu are suport încorporat pentru aceasta.
    metoda, deci va trebui implementata. Pentru aceasta, este necesar să studiezi
    această metodă în detaliu. Observ imediat că articolul prezentat în acest articol
    implementarea funcționează numai pe Apache, deoarece accesul complet la anteturi
    cererea (funcția apache_request_headers) funcționează numai în Apache, dar activă
    este posibil ca alte servere să nu fie disponibile. Trebuie doar să citim
    Antetul de autorizare.

    Descrierea metodei

    Descrierea completă a metodei poate fi găsită în RFC 2069 și dacă
    pe scurt, metoda funcționează așa. Când serverul primește o solicitare legată de o zonă protejată,
    se afișează o eroare 401 Authorization Required și un antet de solicitare
    autentificare astfel:

    WWW-Authenticate: Digest realm="zonă sigură", nonce="123456123456"

    tărâmul este numele ariei protejate, iar nonce este o singură dată
    sens. Există mai mulți parametri opționali pe care îi discutăm
    nu vom. Clientul repetă cererea cu un antet ca acesta:

    Autorizare: Digest realm="zonă securizată", username="123", uri="/index.php", nonce="123456123456", response="1234567890abcdef1234567890abcdef"

    Parametrul uri trebuie să se potrivească cu URI-ul din cerere și răspunsul este
    răspunsul, care se calculează astfel:

    răspuns = H(H(A1) + ":" + nonce + ":" + H(A2))
    H - funcție hash, implicit MD5
    A1 = autentificare + ":" + tărâm + ":" + parolă
    A2 = metoda de solicitare + ":" + URI
    metoda de solicitare este GET, POST etc.

    După cum puteți vedea, A1 nu depinde nici de interogare, nici de o singură dată
    valori, astfel încât serverul poate să nu stocheze parola, dar
    H(A1). Acesta este modul în care este implementat în mod_digest în Apache.
    Totuși, aceleași date sunt suficiente pentru client. Atacatorul, după ce a primit
    acest hash, poate calcula răspunsul cu formulele de mai sus și
    generați o solicitare HTTP, de exemplu, folosind programul
    AccessDriver și instrumentul său HTTP
    depanator. Acest proces va fi prezentat mai detaliat mai jos. Serverul trebuie să verifice dacă valoarea este un nonce
    cel care a fost eliberat anterior clientului și dacă este depășit.
    Dacă răspunsul se potrivește cu parametrul nonce, dar cu valoarea acestui parametru
    nu este relevant, răspunsul descris mai sus cu codul 401 este emis cu singurul
    diferența este că antetul WWW-Authenticate este adăugat cu parametrul
    stale=true indicând faptul că accesul este refuzat numai din acest motiv,
    și ar trebui să încerce din nou fără a solicita utilizatorului o nouă parolă. Acest lucru, IMHO, este incomod, pentru că dacă apare o astfel de situație
    la solicitarea unui POST sau PUT cu un bloc mare de date, clientul va trebui
    transferați toate datele de două ori. Pentru a evita acest lucru, standardul prevede
    antetul Authentication-Info, în care serverul poate, atunci când răspunde la
    o cerere reușită informează clientul despre următoarea nonce.
    Sintaxa este aceeași cu WWW-Authenticate, cu excepția nonce
    este înlocuit cu nextnonce. Cu toate acestea, judecând după rezultatele mele
    experimente, Opera ignoră acest antet. O altă soluție: conform
    RFC 2068 (HTTP/1.1), serverul POATE să răspundă înainte ca cererea să se finalizeze,
    astfel încât clientul întrerupe transferul de date inutil, dar pe Apache+PHP asta
    nu este implementat, deoarece scriptul începe să se execute abia după
    modul în care Apache va primi și analiza complet cererea.

    Stocarea datelor între cereri

    Există un punct subtil în implementarea de către PHP a metodei provocare/răspuns.
    Parametrul unic este format și eliberat clientului într-un singur răspuns și
    verificat deja într-o altă sesiune a scriptului.
    Adică trebuie să fie salvat de la un apel de script la altul, iar pentru asta trebuie
    utilizați fișiere sau baze de date. Exemplul meu folosește fișiere numite,
    valorile unice corespunzătoare și fișierele în sine le conțin
    Adresele IP ale clienților cărora le sunt emise. Colectarea nu este implementată în exemplu
    gunoi: trebuie să ștergeți periodic fișierele vechi.

    Analiza codului

    Acest script verifică doar parola și funcționează indiferent de
    Autentificare. În funcție de succesul verificării, se emit răspunsuri simple.

    $realm = „zonă sigură”; // Denumirea zonei protejate
    $trece = "trece"; // Parola
    $fileprefix = "./"; // Calea pentru fișierele de etichetă care indică valabilitatea nonce

    /* Să construim un parametru unic așa cum este recomandat în RFC2069, deși este posibil într-un alt mod. Parametrul, conform recomandării, ar trebui să depindă de adresa clientului, ora curentă și șirul secret. */
    $nonce = md5($_SERVER["REMOTE_ADDR"] . ":" . time() . ":MyCooolPrivateKey");

    // Obținerea antetelor
    $headers = apache_request_headers();

    // Marcați pe care îl vom seta la TRUE la validarea cu succes
    $auth_success = FALSE;
    $stale = "";

    // Dacă nu există un antet de autorizare, atunci nu este nimic de verificat
    if (isset($headers[„Autorizare”]))
    {
    $authorization = $headers[„Autorizare”];

    /* Analizați titlul folosind o expresie regulată. Titlul conține cuvântul „Rezumat” și o listă
    parametri de forma param="valoare" sau param=valoare separați prin virgule. Această expresie regulată se potrivește cu un astfel de parametru.
    */
    preg_match_all("/(,|\s|^)(\w+)=("([^"]*)"|([\w\d]*))(,|$)/",
    $autorizare, $potriviri, PREG_SET_ORDER);

    /* Acum, pentru confortul prelucrării ulterioare, vom forma o matrice, în care cheile sunt numele parametrilor, iar valorile elementelor matricei sunt
    valorile parametrilor.
    */
    $auth_params = array();
    pentru ($i = 0; $i< count($matches); $i++)
    {
    $match = $match[$i];

    /* Numele se află întotdeauna în al doilea grup de paranteze, în funcție de faptul că este între ghilimele sau nu, se poate
    să fie în grupa a 4-a sau a 5-a. Pentru grupurile de paranteze prinse
    la o ramură nerealizată, un șir gol din matrice,
    deci puteți doar să adăugați valorile.
    */
    $auth_params[$match] = $match . $match;
    }

    /* Calculați răspunsul care se potrivește
    login-ul introdus de utilizator, parola noastră și parametrul unic transmis de utilizator.
    */
    $a1 = $auth_params[„nume utilizator”] . ":" . $auth_params[„tărâmuri”] . ":" . $trece;
    $a2 = $_SERVER[„RECQUEST_METHOD”] . ":" . $_SERVER[„CERERE_URI”];
    $resp = md5(md5($a1) . ":" . $auth_params["nonce"] . ":" . md5($a2));

    // Verificăm răspunsul.
    dacă ($resp == $auth_params[„răspuns”])
    {
    //
    Verificarea relevanței unui parametru unic
    $fn = $fileprefix . $auth_params["nonce"];
    dacă (@file_get_contents($fn) == $_SERVER[„REMOTE_ADDR”])
    {
    deconectați($fn); //
    Această opțiune nu mai este relevantă.
    $auth_success = TRUE; //
    Autentificare a trecut
    ) altfel
    {
    // Parametrul unic este irelevant
    $stale = ", stale=adevarat";
    }
    }
    }

    dacă ($auth_success)
    {
    imprimare(" Test de autentificare Digest

    print("Autentificat cu succes\n");
    var_dump($auth_params);

    imprimare("");

    ) altfel
    {
    file_put_contents($fileprefix . $nonce, $_SERVER["REMOTE_ADDR"]);

    $proto = $_SERVER[„PROTOCOL_SERVER”];
    Antet ("$proto 401 neautorizat");
    Antet("WWW-Authenticate: Digest realm=\"$realm\", nonce=\"$nonce\"$stale");

    imprimare(" Test de autentificare Digest

    ");
    print("Trebuie să vă autentificați cu metoda Digest");
    imprimare("


    ");
    }

    Trecerea Auth Digest cu H(A1) cunoscut

    Voi arăta prin exemplu cum să trec verificarea dacă parola este necunoscută,
    dar H(A1) este cunoscut. Pentru a face acest lucru, așa cum am menționat deja, aveți nevoie
    AccessDriver. Voi face calcule hash apelând din linia de comandă
    PHP CLI. Lăsați pagina protejată să fie localizată la
    http://mrblack.local/auth1.php și hash-ul H(A1) este „a8fb5b2d780a7bf0782207a51a013f04”.

    Deschideți AccessDriver->Tools->HTTP Debugger și introduceți adresa
    „http://mrblack.local/auth1.php”. Faceți clic pe „Conectați”. Primim:

    Antet HTTP = HTTP/1.1 401 Este necesară autorizarea
    Antet HTTP = Data: Luni, 04 Iul 2005 08:09:17 GMT
    Antet HTTP = Server: Apache/1.3.31 (Win32) PHP/5.0.2
    Antet HTTP=X-Powered-By: PHP/5.0.2
    Antet HTTP = WWW-Authenticate: Digest realm="zonă sigură", nonce="5925bea78552224abda11bfe318a8a03"
    Antet HTTP = Conexiune: închis
    Antet HTTP = Tip de conținut: text/html

    Deschideți consola, accesați folderul cu PHP și conduceți următoarea comandă:

    php -r "printează md5 ("a8fb5b2d780a7bf0782207a51a013f04:
    : ".md5("GET:http://mrblack.local/auth1.php"));"

    Obținem răspunsul Digest dorit: c6d0af0db239d75c
    3f59640a4896d096
    Acum, în AccessDriver, bifați caseta de selectare „Header Data”, copiați-o în afișat
    anteturile de câmp care au fost trimise în cererea anterioară și se adaugă acestora
    Autorizare. Iată ce se întâmplă:

    GET http://mrblack.local/auth1.php HTTP/1.1
    Accept: imagine/gif, imagine/x-xbitmap, imagine/jpeg, imagine/pjpeg, aplicație/x-shockwave-flash, */*
    Limba de acceptare: en-us,en;q=0,5
    Agent utilizator: compatibil Mozilla
    Gazdă: mrblack.local
    Pragma: fără cache
    Autorizare: Digest username="mrblack", realm="zonă securizată", nonce="5925bea78552224ab
    da11bfe318a8a03", uri="http://mrblack.local/auth1.php", response="c6d0af0db239d75c3f59
    640a4896d096"

    Faceți clic pe „Conectați”. Obtinem rezultatul:



    Este posibil să utilizați funcția antet() pentru a trimite un mesaj "Autentificare necesara" browser, forțându-l să arate o fereastră pentru introducerea unui nume de utilizator și a unei parole. Odată ce utilizatorul a completat datele de conectare și parola, linkul care conține scriptul PHP va fi apelat din nou cu variabilele predefinite PHP_AUTH_USER , PHP_AUTH_PW și AUTH_TYPE setate la login, parola și respectiv tip de autentificare. Aceste variabile predefinite sunt stocate în matricele $_SERVER și $HTTP_SERVER_VARS. Sunt acceptate ambele tipuri: „Basic” și „Digest” (începând cu PHP 5.1.0). Consultați funcția pentru detalii. antet().

    Un exemplu de fragment de script care obligă clientul să se conecteze pentru a vedea pagina:

    Beispiel #6 Exemplu de autentificare HTTP de bază

    dacă (!isset($_SERVER [ „PHP_AUTH_USER” ])) (
    antet( „WWW-Authenticate: Basic realm="Tărâmul meu"”);

    ecou „Text de trimis dacă
    dacă utilizatorul a făcut clic pe butonul Anulare"
    ;
    Ieșire;
    ) altfel (
    ecou
    "

    Bună ziua ( $_SERVER [ „PHP_AUTH_USER” ]) .

    " ;
    ecou "

    Ați introdus o parolă( $_SERVER [ „PHP_AUTH_PW” ]) .

    " ;
    }
    ?>

    Beispiel #7 Digest Exemplu de autentificare HTTP

    Acesta este un exemplu de implementare a unui script simplu de autentificare HTTP Digest. Consultați » RFC 2617 pentru detalii.

    $realm = "Zona restricționată" ;

    //utilizator => parola
    $users = array("admin" => "mypass" , "guest" => "guest" );

    dacă (gol ($_SERVER [ "PHP_AUTH_DIGEST" ])) (
    antet ("HTTP/1.1 401 Neautorizat");
    antet( „WWW-Authenticate: Digest realm="”. $tărâmuri.
    "",qop="auth",nonce="" . uniqid(). "",opac="" . md5 ($tărâm ). """);

    A muri( „Textul trimis dacă utilizatorul a făcut clic pe Anulare”);
    }

    // analizează variabila PHP_AUTH_DIGEST
    dacă (!($date = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
    !isset($utilizatori [ $date [ „nume utilizator” ]]))
    a muri( „Date greșite!”);

    // generează răspunsul corect
    $A1 = md5 ($date [ "nume utilizator" ] . ":" . $realm . ":" . $utilizatori [ $date [ "nume utilizator" ]]);
    $A2 = md5($_SERVER [ "METODA_CERERE" ]. ":" . $date [ "uri" ]);
    $valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $date [ "qop" ]. ":" . $A2 );

    if ($date [ "răspuns" ] != $răspuns_valid )
    a muri( „Date greșite!”);

    // ok, autentificarea și parola sunt corecte
    echo „Sunteți autentificat ca: „ . $date[„nume utilizator”];

    // Funcția de analiză a antetului de autentificare http
    funcția http_digest_parse($txt )
    {
    // protejează împotriva datelor lipsă
    $needed_parts = array("nonce" => 1 , "nc" => 1 , "cnonce" => 1 , "qop" => 1 , "nume utilizator" => 1 , "uri" => 1 , "răspuns" => 1);
    $date = array();
    $keys = implode ("|" , array_keys ($needed_parts ));

    preg_match_all ("@(" . $keys . ")=(?:([\""])([^\2]+?)\2|([^\s,]+))@", $txt , $potriviri , PREG_SET_ORDER );

    Foreach ($se potrivește ca $m ) (
    $date [ $m [ 1 ]] = $m [ 3 ] ? $m [ 3 ] : $m [ 4 ];
    unset($părți_necesare [ $m [ 1 ]]);
    }

    Returnați $needed_parts? false : $date ;
    }
    ?>

    cometariu: Notă de compatibilitate

    Fiți deosebit de atenți când specificați antetele HTTP. Pentru a garanta compatibilitatea maximă cu cel mai mare număr de clienți diferiți, cuvântul „De bază” trebuie scris cu majusculă „B”, regiunea (tărâmul) trebuie încadrată între ghilimele duble (nu simple!) și exact un spațiu trebuie să precedă cod 401 în titlu HTTP/1.0 401. Parametrii de autentificare trebuie separați prin virgule, așa cum se arată în exemplul de autentificare Digest de mai sus.

    În loc să afișați doar variabilele PHP_AUTH_USER și PHP_AUTH_PW pe ecran, poate fi necesar să verificați dacă sunt corecte. Pentru a face acest lucru, utilizați o interogare de bază de date sau căutați un utilizator într-un fișier dbm.

    Puteți observa caracteristicile browserului Internet Explorer. Este foarte solicitant la parametrul antetelor transmise. Truc de antet WWW-Autentificareînainte de a trimite starea HTTP/1.0 401 pana acum merge pentru el.

    Începând cu PHP 4.3.0, pentru a preveni pe cineva să scrie un script care dezvăluie parola unei pagini care utilizează autentificare externă, variabilele PHP_AUTH nu sunt setate dacă pagina respectivă folosește autentificare externă și este setat modul securizat. Indiferent, variabila REMOTE_USER poate fi folosită pentru a autentifica un utilizator autentificat extern. Deci puteți utiliza întotdeauna variabila $_SERVER["REMOTE_USER"].

    cometariu: Notă de configurare

    PHP folosește indicația directivă AuthType pentru a indica dacă se utilizează sau nu autentificare externă.

    Trebuie remarcat faptul că toate cele de mai sus nu împiedică furtul parolelor pentru paginile care necesită autorizare de către oricine controlează paginile fără autorizație situate pe același server.

    Atât Netscape Navigator, cât și Internet Explorer șterg memoria cache de autentificare a ferestrei curente pentru domeniul dat atunci când sunt primite de la server. Aceasta poate fi folosită pentru a forța utilizatorul să se deconecteze și să afișeze din nou caseta de dialog numele de utilizator și parola. Unii dezvoltatori folosesc acest lucru pentru a limita în timp conectările sau pentru a oferi un buton de deconectare.

    Beispiel #8 Exemplu de autentificare HTTP care forțează o nouă pereche de autentificare/parolă

    funcția de autentificare()(
    antet( "WWW-Authenticate: Basic realm="Testează sistemul de autentificare"");
    antet ("HTTP/1.0 401 Neautorizat");
    ecou „Trebuie să introduceți un nume de utilizator și o parolă valide pentru a accesa resursa \n”;
    Ieșire;
    }

    dacă (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
    ($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
    autentifica();
    ) altfel (
    ecou "

    Bine ati venit: ". htmlspecialchars ($_SERVER [ „PHP_AUTH_USER” ]) . "
    " ;
    ecou "Autentificare anterioară: ". htmlspecialchars($_REQUEST["OldAuth"]);
    ecou "

    \n";
    ecou "\n";
    ecou ". htmlspecialchars ($_SERVER [ „PHP_AUTH_USER” ]) . "\" />\n" ;
    ecou "\n";
    ecou"

    \n" ;
    }
    ?>

    Acest comportament nu este reglementat de standarde HTTP Basic-autentificare, prin urmare, nu ar trebui să depindeți de ea. Testarea browserului Râsul a aratat ca Râsul nu șterge memoria cache de autorizare la primirea unei stări 401 de la server, iar făcând clic pe „Înapoi” și apoi „Înainte” în secvență, este posibilă deschiderea unei astfel de pagini, cu condiția ca atributele de autorizare necesare să nu se fi schimbat. Cu toate acestea, utilizatorul poate apăsa tasta "_" pentru a goli memoria cache de autentificare.

    De asemenea, rețineți că înainte de PHP 4.3.3, autentificarea HTTP nu funcționa pe serverele care rulau Microsoft IIS dacă PHP era instalat ca modul CGI, din cauza unor restricții IIS. Pentru ca acesta să funcționeze corect în PHP 4.3.3+, trebuie să editați setarea de configurare IIS numită „ Securitate director". Faceți clic pe inscripția " Editați | ×" și setați opțiunea " Acces anonim", toate celelalte câmpuri ar trebui lăsate nebifate.

    O altă limitare dacă utilizați IIS prin ISAPI și PHP 4: Variabile PHP_AUTH_* nu sunt definite, dar în același timp variabila este disponibilă HTTP_AUTHORIZATION. Exemplu de cod pe care l-ați putea folosi: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

    cometariu: Notă privind IIS:
    Pentru ca autentificarea HTTP să funcționeze corect în IIS, opțiunea cgi.rfc2616_headers din configurația PHP trebuie să fie setată la 0 (valoare implicită).

    cometariu:

    În cazul în care se folosește modul sigur, se va adăuga UID-ul scriptului curent tărâmuri-partea antetului WWW-Autentificare.

    Este posibil să utilizați funcția antet() pentru a trimite un mesaj "Autentificare necesara" browser, forțându-l să arate o fereastră pentru introducerea unui nume de utilizator și a unei parole. Odată ce utilizatorul a completat datele de conectare și parola, linkul care conține scriptul PHP va fi apelat din nou cu variabilele predefinite PHP_AUTH_USER , PHP_AUTH_PW și AUTH_TYPE setate la login, parola și respectiv tip de autentificare. Aceste variabile predefinite sunt stocate în matricele $_SERVER și $HTTP_SERVER_VARS. Sunt acceptate ambele tipuri: „Basic” și „Digest” (începând cu PHP 5.1.0). Consultați funcția pentru detalii. antet().

    Un exemplu de fragment de script care obligă clientul să se conecteze pentru a vedea pagina:

    Beispiel #1 Exemplu de autentificare HTTP de bază

    dacă (!isset($_SERVER [ „PHP_AUTH_USER” ])) (
    antet( „WWW-Authenticate: Basic realm="Tărâmul meu"”);

    ecou „Text de trimis dacă
    dacă utilizatorul a făcut clic pe butonul Anulare"
    ;
    Ieșire;
    ) altfel (
    ecou
    "

    Bună ziua ( $_SERVER [ „PHP_AUTH_USER” ]) .

    " ;
    ecou "

    Ați introdus o parolă( $_SERVER [ „PHP_AUTH_PW” ]) .

    " ;
    }
    ?>

    Beispiel #2 Digest Exemplu de autentificare HTTP

    Acesta este un exemplu de implementare a unui script simplu de autentificare HTTP Digest. Consultați » RFC 2617 pentru detalii.

    $realm = "Zona restricționată" ;

    //utilizator => parola
    $users = array("admin" => "mypass" , "guest" => "guest" );

    dacă (gol ($_SERVER [ "PHP_AUTH_DIGEST" ])) (
    antet ("HTTP/1.1 401 Neautorizat");
    antet( „WWW-Authenticate: Digest realm="”. $tărâmuri.
    "",qop="auth",nonce="" . uniqid(). "",opac="" . md5 ($tărâm ). """);

    A muri( „Textul care trebuie trimis atunci când utilizatorul face clic pe butonul Anulare”);
    }

    // analizează variabila PHP_AUTH_DIGEST
    dacă (!($date = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
    !isset($utilizatori [ $date [ „nume utilizator” ]]))
    a muri( „Date greșite!”);

    // generează răspunsul corect
    $A1 = md5 ($date [ "nume utilizator" ] . ":" . $realm . ":" . $utilizatori [ $date [ "nume utilizator" ]]);
    $A2 = md5($_SERVER [ "METODA_CERERE" ]. ":" . $date [ "uri" ]);
    $valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $date [ "qop" ]. ":" . $A2 );

    if ($date [ "răspuns" ] != $răspuns_valid )
    a muri( „Date greșite!”);

    // ok, autentificarea și parola sunt corecte
    echo „Sunteți autentificat ca: „ . $date[„nume utilizator”];

    // Funcția de analiză a antetului de autentificare http
    funcția http_digest_parse($txt )
    {
    // protejează împotriva datelor lipsă
    $needed_parts = array("nonce" => 1 , "nc" => 1 , "cnonce" => 1 , "qop" => 1 , "nume utilizator" => 1 , "uri" => 1 , "răspuns" => 1);
    $date = array();
    $keys = implode ("|" , array_keys ($needed_parts ));

    preg_match_all ("@(" . $keys . ")=(?:([\""])([^\2]+?)\2|([^\s,]+))@", $txt , $potriviri , PREG_SET_ORDER );

    Foreach ($se potrivește ca $m ) (
    $date [ $m [ 1 ]] = $m [ 3 ] ? $m [ 3 ] : $m [ 4 ];
    unset($părți_necesare [ $m [ 1 ]]);
    }

    Returnați $needed_parts? false : $date ;
    }
    ?>

    cometariu: Notă de compatibilitate

    Fiți deosebit de atenți când specificați antetele HTTP. Pentru a garanta compatibilitatea maximă cu cel mai mare număr de clienți diferiți, cuvântul „De bază” trebuie scris cu majusculă „B”, regiunea (tărâmul) trebuie încadrată între ghilimele duble (nu simple!) și exact un spațiu trebuie să precedă cod 401 în titlu HTTP/1.0 401. Parametrii de autentificare trebuie separați prin virgule, așa cum se arată în exemplul de autentificare Digest de mai sus.

    În loc să afișați doar variabilele PHP_AUTH_USER și PHP_AUTH_PW pe ecran, poate fi necesar să verificați dacă sunt corecte. Pentru a face acest lucru, utilizați o interogare de bază de date sau căutați un utilizator într-un fișier dbm.

    Puteți observa caracteristicile browserului Internet Explorer. Este foarte solicitant la parametrul antetelor transmise. Truc de antet WWW-Autentificareînainte de a trimite starea HTTP/1.0 401 pana acum merge pentru el.

    Pentru a preveni pe cineva să scrie un script care dezvăluie parola unei pagini care utilizează autentificare externă, variabilele PHP_AUTH nu sunt setate dacă pagina respectivă folosește autentificare externă și este setat modul securizat. Indiferent, variabila REMOTE_USER poate fi folosită pentru a autentifica un utilizator autentificat extern. Deci puteți utiliza întotdeauna variabila $_SERVER["REMOTE_USER"].

    cometariu: Notă de configurare

    PHP folosește indicația directivă AuthType pentru a indica dacă se utilizează sau nu autentificare externă.

    Trebuie remarcat faptul că toate cele de mai sus nu împiedică furtul parolelor pentru paginile care necesită autorizare de către oricine controlează paginile fără autorizație situate pe același server.

    Atât Netscape Navigator, cât și Internet Explorer șterg memoria cache de autentificare a ferestrei curente pentru domeniul dat atunci când primește starea 401 de la server. Aceasta poate fi folosită pentru a forța un utilizator să se deconecteze și să afișeze din nou caseta de dialog numele de utilizator și parola. Unii dezvoltatori folosesc acest lucru pentru a limita în timp conectările sau pentru a oferi un buton de deconectare.

    Exemplu #3 de autentificare HTTP care forțează o nouă pereche nume de utilizator/parolă

    funcția de autentificare()(
    antet( "WWW-Authenticate: Basic realm="Testează sistemul de autentificare"");
    antet ("HTTP/1.0 401 Neautorizat");
    ecou „Trebuie să introduceți un nume de utilizator și o parolă valide pentru a accesa resursa \n”;
    Ieșire;
    }

    dacă (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
    ($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
    autentifica();
    ) altfel (
    ecou "

    Bine ati venit: ". htmlspecialchars ($_SERVER [ „PHP_AUTH_USER” ]) . "
    " ;
    ecou "Autentificare anterioară: ". htmlspecialchars($_REQUEST["OldAuth"]);
    ecou "

    \n";
    ecou "\n";
    ecou ". htmlspecialchars ($_SERVER [ „PHP_AUTH_USER” ]) . "\" />\n" ;
    ecou "\n";
    ecou"

    \n" ;
    }
    ?>

    Acest comportament nu este reglementat de standarde HTTP Basic-autentificare, prin urmare, nu ar trebui să depindeți de ea. Testarea browserului Râsul a aratat ca Râsul nu șterge memoria cache de autorizare la primirea unei stări 401 de la server, iar făcând clic pe „Înapoi” și apoi „Înainte” în secvență, este posibilă deschiderea unei astfel de pagini, cu condiția ca atributele de autorizare necesare să nu se fi schimbat. Cu toate acestea, utilizatorul poate apăsa tasta "_" pentru a goli memoria cache de autentificare.

    Pentru ca autentificarea HTTP să funcționeze corect pe un server IIS cu o versiune CGI a PHP, trebuie să editați setarea de configurare IIS numită „ Securitate director". Faceți clic pe inscripția " Editați | ×" și setați opțiunea " Acces anonim", toate celelalte câmpuri ar trebui lăsate nebifate.

    cometariu: Notă privind IIS:
    Pentru ca autentificarea HTTP să funcționeze corect în IIS, opțiunea cgi.rfc2616_headers din configurația PHP trebuie să fie setată la 0 (valoare implicită).

    cometariu:

    În cazul în care se folosește modul sigur, se va adăuga UID-ul scriptului curent tărâmuri-partea antetului WWW-Autentificare.



    Ți-a plăcut articolul? Împărtășește-l