Home » Articole » Articole » Calculatoare » Programare » PHP » Autentificare HTTP cu PHP

Autentificare HTTP cu PHP

postat în: PHP, HTML 2

Este posibil să utilizați funcția header() pentru a trimite un mesaj "Authentication Required" către browser-ul clientului, determinând apariția unei ferestre de introducere a numelui de utilizator/parolă. Odată ce utilizatorul a completat un nume de utilizator și o parolă, URL-ul care conține scriptul PHP va fi apelat din nou cu variabilele predefinite PHP_AUTH_USER, PHP_AUTH_PW și AUTH_TYPE setate la numele de utilizator, parola și respectiv tipul de autentificare. Aceste variabile predefinite se găsesc în tabloul $_SERVER. Sunt acceptate doar metodele de autentificare „Basic” și „Digest”. Consultați funcția header() pentru mai multe informații.

Un exemplu de fragment de script care ar forța autentificarea clientului pe o pagină este următorul:

Exemplul #1 Exemplu de autentificare HTTP Basic


<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
header('WWW-Authenticate:
Basic realm="My Realm"');
header('HTTP/1.0
401 Unauthorized');
echo 'Text to send if user hits
Cancel button';
exit;
} else {
echo "<p>Hello
{$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered
{$_SERVER['PHP_AUTH_PW']}
as your password.</p>";
}
?>

Exemplul #2 Exemplu de autentificare HTTP Digest

Acest exemplu vă arată cum să implementați un script simplu de autentificare HTTP Digest. Pentru mai multe informații, citiți RFC 2617.


<?php
$realm =
'Restricted area';

//user => password
$users
= array('admin'
=>
'mypass',
'guest'
=>
'guest');

if (empty($_SERVER['PHP_AUTH_DIGEST']))
{
header('HTTP/1.1
401 Unauthorized');
header('WWW-Authenticate:
Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

die('Text to send if user hits
Cancel button');
}

// analyze the PHP_AUTH_DIGEST
variable
if (!($data
=
http_digest_parse($_SERVER['PHP_AUTH_DIGEST']))
||
!isset($users[$data['username']]))
die('Wrong Credentials!');

// generate the valid response
$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'].':'.$A2);

if ($data['response'] != $valid_response)
die('Wrong Credentials!');

// ok, valid username & password
echo
'You are logged in as: '
.
$data['username'];

// function to parse the http
auth header
function
http_digest_parse($txt)
{
// protect against missing data
$needed_parts
= array('nonce'=>1,
'nc'=>1,
'cnonce'=>1,
'qop'=>1,
'username'=>1,
'uri'=>1,
'response'=>1);
$data
= array();
$keys
=
implode('|',
array_keys($needed_parts));

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

foreach ($matches
as
$m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}

return $needed_parts
?
false :
$data;
}
?>

Notă: Notă de compatibilitate: Vă rugăm să aveți grijă când codificați liniile de antet HTTP. Pentru a garanta compatibilitatea maximă cu toți clienții, cuvântul cheie „Basic” trebuie scris cu „B” majuscul, șirul de domeniu trebuie să fie cuprins între ghilimele duble (nu simple) și exact un spațiu ar trebui să preceadă codul 401 în Linia antet HTTP/1.0 401. Parametrii de autentificare trebuie să fie separați prin virgulă, așa cum se vede în exemplul de mai sus.

În loc să imprimați pur și simplu PHP_AUTH_USER și PHP_AUTH_PW, așa cum s-a făcut în exemplul de mai sus, poate doriți să verificați validitatea numelui de utilizator și a parolei. Poate trimițând o interogare la o bază de date sau căutând utilizatorul într-un fișier dbm.

Atenție la browserele Internet Explorer cu erori. Par foarte pretențioase în ceea ce privește ordinea antetelor. Trimiterea antetului WWW-Authenticate înainte de antetul HTTP/1.0 401 pare să facă trucul pentru moment.

Notă: Notă de configurare: PHP folosește prezența unei directive AuthType pentru a determina dacă autentificarea externă este în vigoare.

Rețineți, totuși, că cele de mai sus nu împiedică pe cineva care controlează o adresă URL neautentificată să fure parole de la adresele URL autentificate de pe același server.

Atât Netscape Navigator, cât și Internet Explorer vor șterge memoria cache de autentificare a ferestrei browserului local pentru domeniu la primirea unui răspuns de server de 401. Acest lucru poate „deconecta” efectiv un utilizator, forțându-l să-și introducă din nou numele de utilizator și parola. Unii oameni folosesc acest lucru pentru a „expira” conectările sau pentru a oferi un buton de „deconectare”.

Exemplul #3 Exemplu de autentificare HTTP forțând un nou nume/parolă


<?php
function
authenticate()
{
header('WWW-Authenticate:
Basic realm="Test Authentication System"');
header('HTTP/1.0
401 Unauthorized');
echo "You must enter a valid
login ID and password to access this resource\n";
exit;
}

if (!isset($_SERVER['PHP_AUTH_USER'])
||
($_POST['SeenBefore'] == 1
&&
$_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER']))
{
authenticate();
} else {
echo "<p>Welcome: "
.
htmlspecialchars($_SERVER['PHP_AUTH_USER'])
. "<br />";
echo "Old: "
.
htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action=''
method='post'>\n";
echo "<input type='hidden'
name='SeenBefore' value='1' />\n";
echo "<input type='hidden'
name='OldAuth' value=\"" .
htmlspecialchars($_SERVER['PHP_AUTH_USER'])
. "\" />\n";
echo "<input type='submit'
value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>

Acest comportament nu este cerut de standardul de autentificare HTTP Basic, așa că nu ar trebui să depindeți niciodată de acest lucru. Testarea cu Lynx a arătat că Lynx nu șterge acreditările de autentificare cu un răspuns de server 401, așa că apăsând înapoi și apoi înainte din nou va deschide resursa atâta timp cât cerințele de autentificare nu s-au schimbat. Cu toate acestea, utilizatorul poate apăsa tasta „_” pentru a-și șterge informațiile de autentificare.

Pentru ca autentificarea HTTP să funcționeze folosind serverul IIS cu versiunea CGI a PHP, trebuie să editați configurația IIS „Directory
Security
„. Faceți clic pe „Edit” și bifați doar „Anonymous Access„, toate celelalte câmpuri ar trebui lăsate nebifate.

Notă: Notă IIS: Pentru ca autentificarea HTTP să funcționeze cu IIS, directiva PHP cgi.rfc2616_headers trebuie să fie setată la 0 (valoarea implicită).

Sursa: PHP Manual, licența CC BY 3.0. Traducere și adaptare: Nicolae Sfetcu

Ghid WordPress pentru dezvoltatori
Ghid WordPress pentru dezvoltatori

Resursa esențială care te va ghida pas cu pas în lumea complexă a platformei WordPress.

Nu a fost votat 19.26 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Ghid WordPress pentru începători
Ghid WordPress pentru începători

Descoperă arta gestionării site-urilor web cu WordPress!

Nu a fost votat 14.43 lei26.45 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Proiectarea, dezvoltarea şi întreţinerea siturilor web
Proiectarea, dezvoltarea şi întreţinerea siturilor web

Ghidul complet pentru proiectarea, dezvoltarea și întreținerea siturilor web, o resursă indispensabilă

Nu a fost votat 14.43 lei57.78 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.

2 Responses

  1. Nicolae Sfetcu
    |

    Sigur, cu plăcere, puteți trimite pe adresa de email office@multimedia.com.ro. Atenție la drepturile de autor.

  2. STANESCU DAN VIFOR
    |

    DORESC spre publicare o serie de RECENZII ale unor volume si articole din lb.franceza ,traduse si prelucrate in timpul sederii in ELVETIA si CANADA.

    O voi face negresit,in curand,pt.a fi introduse in circuit ,cu remarca ca nu le-am regasit niciodata in publicatiile din ROMANIA.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *