Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Vlerësime
  • Crimson auth php. HTTP Instalimi i mbrojtjes në një faqe duke përdorur MySQL dhe PHP

Crimson auth php. HTTP Instalimi i mbrojtjes në një faqe duke përdorur MySQL dhe PHP

Prezantimi

Ky është një tutorial i krijuar për t'ju treguar bazat e sigurimit të faqeve tuaja të internetit duke përdorur vërtetimin HTTP. Në vend të metodës tradicionale .htaccess (server Apache), ne do të përdorim MySQL për të ruajtur të dhënat e përdoruesve dhe fjalëkalimet e tyre. Do të përpiqem të shpjegoj sa më shumë që të jetë e mundur se çfarë, sipas mendimit tim, kërkohet që një fillestar të mësojë MySQL dhe PHP. Në parim, bazuar në këtë program ju mund të përdorni çdo DBMS (sistemi i menaxhimit të bazës së të dhënave). Pse është interesante kjo metodë? Epo, për shembull, vetëm sepse nëse përdorni një bazë të dhënash, lehtë mund të lejoni vetëm një grup (person) të caktuar të ketë të drejta të caktuara për të hyrë në këtë apo atë informacion. Nëse përdorni metodën tradicionale .htaccess Apache, duhet të shtoni manualisht përdoruesit dhe fjalëkalimin në skedarin e fjalëkalimit. Dhe avantazhi i kësaj metode, mirë .... kërkoni vetë.

Softueri i kërkuar:

· *Platforma nix (Linux, Unix, *BSD) · PHP 3.0.x ose PHP 4.x · MySQL (çdo version)

Hapi numër një

Vazhdo, gjëja e parë që duhet të kuptojmë është se ne duam të lejojmë përdoruesit që janë në bazën tonë të të dhënave të hyjnë në faqen e specifikuar? Dhe si do ta bëjmë këtë? (shumë njerëzve nuk u pëlqen vërtet, por ne duhet të mësohemi të marrim një copë letre përpara se të programojmë dhe të shkruajmë të gjitha kërkesat që duam të marrim nga programi, në planin afatgjatë do të kurseni orë ose ndoshta ditë për të bërë ndryshime në kod (përafërsisht))

Kontrolloni nëse përdoruesi është vërtetuar tashmë.

Nëse jo, dërgoni një mesazh te shfletuesi, me një mesazh dhe një formular aksesi.

Nëse përdoruesi klikon në butonin e anulimit, mos e lejoni aksesin dhe ridrejtojeni te... 403: Qasja u refuzua, ose shfaq (cookie J) një mesazh të thjeshtë.

Nëse përdoruesi ka plotësuar një kombinim të emrit të përdoruesit dhe fjalëkalimit, kontrolloni ato në bazën e të dhënave MySQL dhe sigurohuni që janë të sakta, nëse po, lejoni aksesin.

Nëse nuk kupton gjithçka, mos u shqetëso, do të bëhet e qartë më vonë (ose ndoshta kurrë)!

Hapi i dytë - Krijoni bazën tonë të të dhënave

Ne duam që baza e të dhënave të ruajë hyrjen dhe fjalëkalimin e përdoruesve tanë. Fushat e kërkuara mund të shtohen lehtësisht në një bazë të dhënash ekzistuese, por ne do të supozojmë për momentin që ju nuk po shtoni në një bazë të dhënash ekzistuese, por po krijoni një të re. Kodi i mëposhtëm është një përshkrim se si ta bëni këtë. Supozimi: nëse keni Apache në kompjuterin tuaj, mund të filloni menjëherë :)

mysql> krijoni anëtarë të bazës së të dhënave;
mysql> krijoni përdorues të tabelës (
emri i përdoruesit varchar(25) NOT NULL,
fjalëkalimi varchar (15) JO NULL,
çelësi kryesor (emri i përdoruesit),
emër përdoruesi unik (emri i përdoruesit)
);

Tani kemi një bazë të dhënash për të ruajtur përdoruesit, ajo supozon se emri i përdoruesit është deri në 25 karaktere dhe fjalëkalimet janë deri në 15 karaktere. (nëse për ndonjë arsye nuk ju përshtatet, vendoseni sipas dëshirës) Emri i përdoruesit duhet të ketë vlerën "çelës kryesor" dhe të jetë "unik", pasi nuk duam që 2 ose më shumë njerëz të kenë të njëjtin emër përdoruesi.

Ju lutemi vini re se emrat e përdoruesve do të jenë të ndjeshëm ndaj rastit të mëposhtëm, përdoruesi "Vasya" do të identifikohet ndryshe nga përdoruesi "vasya", me fjalë të tjera të ndjeshme ndaj shkronjave të vogla. Tani do të shtojmë një përdorues testues në MySQL në mënyrë që të mund të përdorim të dhënat e tij për teste kur krijojmë faqen PHP.

mysql> jepni zgjedhjen në users.users
te httpuser@localhost
identifikuar nga "MyPassword";

Kjo është kështu që kur duam të kontrollojmë përdoruesin dhe fjalëkalimin e një personi të regjistruar në bazën tonë të të dhënave, do të përdorim përdoruesin "httpuser" me fjalëkalimin "MyPassword". Më në fund duhet të shtojmë emrin e përdoruesit dhe fjalëkalimin e personit që duam të lejojmë hyrjen.

mysql> insert në user value("john_doe", "eod_nhoj");

Unë me dashje nuk i kam koduar të dhënat në program, në mënyrë që në rast të humbjes së fjalëkalimit të mos më duhet ta deshifroj atë dhe ta thjeshtoj në minimum :)) Kjo është ajo, ne kemi mbaruar me MySQL, tani le të lëvizim në!

Hapi i tretë - shkruani kodin PHP

Para se të fillojmë, unë do të përshkruaj shkurtimisht se çfarë do të bëjë paga. Kur të arrini në një faqe të sigurt, serveri do të dërgojë një kërkesë dhe do të shfaqë një faqe për të futur emrin dhe fjalëkalimin tuaj. Nëse klikoni në butonin e anulimit ose futni të dhëna të pasakta, serveri do t'ju dërgojë (401 Titulli i paautorizuar dhe do të refuzojë aksesin.) - kjo është mënyra se si kërkesa zakonisht përkthen rreshtin (401 kokë e paautorizuar dhe refuzo hyrjen) Unë do' T shpjegosh, për mendimin tim nuk ka mënyrë më të mirë për ta thënë !!! Në rast se futni gjithçka në mënyrë korrekte, rezulton se thjesht do të keni akses (kjo duhet të vërtetohej). Tani pjesa argëtuese, ky është i njëjti kod. Shkruhet qëllimisht me numra rreshtash, pasi jepen shpjegimet e kodit (më poshtë) për rreshtat.

01 02
Funksioni 03 Access_Denied() (
04 echo "401 I paautorizuar: Kombinimi i emrit të përdoruesit/fjalëkalimit që fute ishte i pavlefshëm.n";
05 }
06
07 funksioni auth_headers ($title) (
08 Header("WWW-Authenticate: Basic realm="$title"");
09 Header ("HTTP/1.0 401 i paautorizuar");
10 }
11
12 if(!isset($PHP_AUTH_USER)) (
13 auth_headers ("Faqja ime e mbrojtur e internetit");
14 qasja_mohohet();
15 dalje;
16 }
17 te tjera (
18
19 $hostname = "localhost";
20 $username = "httpuser";
21 $password = "Fjalëkalimi im";
22 $baza e të dhënave = "anëtarët";
23
24 $query = "zgjidhni emrin e përdoruesit, fjalëkalimin nga përdoruesit ku emri i përdoruesit = "$PHP_AUTH_USER" dhe fjalëkalimi = "$PHP_AUTH_PW"";
25 $link = mysql_connect($localhost, $username, $password) ose die("Nuk mund të lidhet me serverin e bazës së të dhënave");
26
27 nëse (mysql_num_rows(mysql_db_query($baza e të dhënave, $query)) == 0) (
28 auth_headers ("Faqja ime e mbrojtur e internetit");
29 qasja_mohuar();
30 dalje;
31 }
32
33 mysql_close ($lidhja);
34 }
35 ?>

Ky është truku, funksionon, funksionon, mund ta përdorni ku të doni, kur të doni dhe si të doni, ndryshoni, përmirësoni, nëse arrini ta reduktoni kodin në dy rreshta duke ruajtur funksionalitetin e programit, atëherë sigurohuni që ta dërgoni tek unë!!!

Në këtë seksion, ne do të eksplorojmë shpejt çdo rresht në mënyrë që të parandalojmë shkëmbimet e nxehta të pyetjeve në komentet e këtij artikulli.

Rreshti 3:
Ky funksion do të shfaqë një mesazh nëse një "përdorues i keq" fut vazhdimisht të dhëna të pasakta. E bëra këtë funksion sepse e përdorim dy herë, dhe vetëm për të shkurtuar kodin burimor.

Rreshti 7:
Meqenëse ne po e përdorim këtë kokë gjithashtu dy herë, unë gjithashtu e bëra këtë një funksion.

Rreshti 8:
Kaloni një titull në shfletuesin që do ta detyrojë përdoruesin të fusë emrin e përdoruesit dhe fjalëkalimin e tij. Ndryshorja $title do të shfaqet në dialogun e hyrjes.

Rreshti 9:
Në kërkesën e parë, shfaqet një titull; kur anulohet përsëri, shfaqet një mesazh që tregon se qasja është refuzuar.

Rreshti 12:
$PHP_AUTH_USER është një lak që shfaq një mesazh që thotë se faqja është e mbrojtur dhe dil jashtë!

Rreshti 19-23:
Kjo është diçka që askush nuk e di përveç jush, domethënë mjetet për t'u lidhur me bazën e të dhënave, emri i hostit, emrat e bazës së të dhënave, emri i përdoruesit dhe fjalëkalimi. (për t'u lidhur me MySQL)

Rreshti 24:
Një pyetje MySQL që kthen emrat e përdoruesve dhe fjalëkalimet.

Rreshti 25:
Vendosni një lidhje me MySQL dhe shfaqni një mallkim nëse nuk ka lidhje!!! (kjo do të thotë që keni diçka të gabuar në rreshtat 19-23, ose nuk ka fare MySQL)

Rreshti 27:
Përpunoni $query. Nëse kthen - 0, do të thotë se është futur një kombinim i pavlefshëm.

Rreshti 33:
Shkëputni lidhjen me MySQL.

Unë do të rekomandoja ruajtjen e kodit PHP në një skedar të quajtur user_auth.php, user_auth.php3, ose... (këtu është imagjinata juaj për këtë temë) Le të supozojmë se e keni ruajtur këtë kod në skedarin user_auth.php. Sa herë që papritmas duam të mbrojmë faqen tonë top-sekret në rrjet, ne thjesht e përfshijmë këtë skedar. E vetmja gjë për të cilën do të doja të tërhiqja vëmendjen është se, logjikisht, ju duhet ta lidhni atë në krye të faqes tuaj të mbrojtur PHP, unë ju këshilloj të shkruani sa vijon në rreshtin numër 1 të faqeve tuaja:

ku "user_auth.php" është emri i skedarit nën të cilin keni ruajtur kodin.

Pyetja juaj - Unë nuk përdor MySQL, çfarë duhet të bëj?

Konsultohuni me administratorin e serverit tuaj, nese ai rezulton i sjellshem atehere do ju ndihmoje, per te eshte 5 minuta pune, nese i keqi nuk ju ndihmon, atehere shkoni ne forumin qe ka lidhje me databazen qe jeni duke përdorur dhe bërtas për ndihmë! Ose nëse e konsideroni veten një programues normal, atëherë... nuk do t'ju duhet fare ky kod dhe do të krijoni "sesione", do të kriptoni duke përdorur PGP dhe në përgjithësi do të çoroditeni sikur po bëni mbrojtje për amazon.com

Është e mundur të përdoret funksioni kokë () për të dërguar një mesazh "Kërkohet vërtetimi" shfletuesi, duke e detyruar atë të shfaqë një dritare për të futur hyrjen dhe fjalëkalimin tuaj. Pasi përdoruesi të plotësojë hyrjen dhe fjalëkalimin, lidhja që përmban skriptin PHP do të thirret përsëri me variablat e paracaktuara PHP_AUTH_USER , PHP_AUTH_PW dhe AUTH_TYPE të vendosura përkatësisht në login, password dhe llojin e vërtetimit. Këto variabla të paracaktuar ruhen në vargjet $_SERVER dhe $HTTP_SERVER_VARS. Të dy llojet mbështeten: "Basic" dhe "Digest" (që nga PHP 5.1.0). Shikoni funksionin për detaje kokë ().

Një shembull i një fragmenti skripti që detyron klientin të identifikohet për të parë faqen:

Shembulli #1 Shembull themelor i vërtetimit HTTP

nëse (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
kokë ( "WWW-Authenticate: Basic Realm="My Realm"");

jehonë "Teksti u dërgua kur
nëse përdoruesi klikon butonin Anulo"
;
dalje;
) tjeter (
jehonë
"

Përshëndetje ($_SERVER [ "PHP_AUTH_USER" ]) .

" ;
jehonë "

Ju keni futur fjalëkalimin tuaj($_SERVER [ "PHP_AUTH_PW" ]) .

" ;
}
?>

Shembulli #2 Shembull i verifikimit të HTTP-së

Ky është një shembull zbatimi i një skripti të thjeshtë të vërtetimit të Digest HTTP. Për detaje, shihni » RFC 2617.

$realm = "Zonë e ndaluar" ;

//përdoruesi => fjalëkalimi
$users = array("admin" => "mypass" , "guest" => "musafir" );

nëse (bosh ($_SERVER [ "PHP_AUTH_DIGEST" ])) (
header ("HTTP/1.1 401 i paautorizuar");
kokë ( "WWW-Authenticate: Digest realm="". $sferë.
"",qop="auth",nonce="" . uniqid(). "", i errët = "" . md5 (sfera e $). """);

vdes( "Teksti dërgohet kur përdoruesi klikon butonin Anulo");
}

// analizoni variablin PHP_AUTH_DIGEST
nëse (!($data = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
!isset($users [ $data [ "username" ]]))
vdes ( "Të dhëna të gabuara!");

// gjenerojnë përgjigjen e saktë
$A1 = md5 ($data [ "emri i përdoruesit" ] . ":" . $realm. ":" . $users [ $data [ "emri i përdoruesit" ]]);
$A2 = md5($_SERVER["METHOD_REQUEST"]. ":" . $data["uri" ]);
$valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $data ["qop"].":". $A2);

if ($data [ "response" ] != $valid_response )
vdes ( "Të dhëna të gabuara!");

// ok, identifikimi dhe fjalëkalimi janë të sakta
echo "Jeni të identifikuar si: " . $data ["emri i përdoruesit"];

// http auth parsing header funksion
funksioni http_digest_parse ($txt)
{
// mbrojtje kundër të dhënave që mungojnë
$needed_parts = grup("nonce" => 1 , "nc" => 1 , "cnonce" => 1 , "qop" => 1 , "emri i përdoruesit" => 1 , "uri" => 1 , "përgjigje" => 1);
$data = grup();
$keys = implode ("|" , çelësat_array ($needed_parts ));

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

Foreach ($përputhet me $m) (
$data [ $m [ 1 ]] = $m [ 3 ] ? $m [3]: $m [4];
unset($pjesët_të nevojshme [ $m [ 1 ]]);
}

Të kthehen $needed_parts ? false : $data ;
}
?>

Koment: Shënim i përputhshmërisë

Jini veçanërisht të kujdesshëm kur specifikoni titujt HTTP. Për të siguruar përputhshmërinë maksimale me numrin më të madh të klientëve të ndryshëm, fjala "Basic" duhet të shkruhet me një "B" të madhe, rajoni (sfera) duhet të mbyllet në thonjëza të dyfishta (jo të vetme!) dhe saktësisht një hapësirë ​​duhet të paraprijë. Kodi 401 në titull HTTP/1.0 401. Parametrat e vërtetimit duhet të ndahen me presje, siç tregohet në shembullin e vërtetimit të Digest më sipër.

Në vend që thjesht të shfaqni variablat PHP_AUTH_USER dhe PHP_AUTH_PW në ekran, mund t'ju duhet të kontrolloni nëse ato janë të sakta. Për ta bërë këtë, përdorni një pyetje të bazës së të dhënave ose kërkoni një përdorues në një skedar dbm.

Mund të vëzhgoni veçoritë e funksionimit të shfletuesit Internet Explorer. Është shumë zgjedhës për parametrat e titujve të transmetuar. Truku i titullit WWW-Vërteto përpara se të dërgoni statusin HTTP/1.0 401 punon për të deri tani.

Për të parandaluar që dikush të shkruajë një skript që zbulon fjalëkalimin për një faqe që përdor vërtetim të jashtëm, variablat PHP_AUTH nuk vendosen nëse faqja përdor vërtetim të jashtëm dhe është vendosur në modalitetin e sigurt. Megjithatë, ndryshorja REMOTE_USER mund të përdoret për të vërtetuar një përdorues të autentifikuar nga jashtë. Kështu që mund të përdorni gjithmonë variablin $_SERVER["REMOTE_USER"].

Koment: Shënim i konfigurimit

PHP përdor tregues direktivë AuthType për të treguar nëse është përdorur vërtetimi i jashtëm apo jo.

Duhet të theksohet se të gjitha sa më sipër nuk parandalojnë vjedhjen e fjalëkalimeve të faqeve që kërkojnë autorizim nga dikush që kontrollon faqet pa autorizim të vendosura në të njëjtin server.

Si Netscape Navigator ashtu edhe Internet Explorer pastrojnë cache-in e vërtetimit të dritares aktuale për një fushë të caktuar kur marrin një status 401 nga serveri. Kjo mund të përdoret për të detyruar përdoruesin të dalë dhe të rishfaq kutinë e dialogut të emrit të përdoruesit dhe fjalëkalimit. Disa zhvillues e përdorin këtë për të kufizuar hyrjet në kohë ose për të siguruar një buton daljeje.

Shembulli #3 Shembull i vërtetimit të HTTP me futjen e detyruar të një çifti të ri hyrje/fjalëkalim

funksioni autentifikimi () (
kokë ( "WWW-Authenticate: Basic Realm="Testoni Sistemin e Autentifikimit"");
header ("HTTP/1.0 401 i paautorizuar");
jehonë "Duhet të futni emrin e saktë të përdoruesit dhe fjalëkalimin për të hyrë në burim \n";
dalje;
}

nëse (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenPara" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
vërtetoj ();
) tjeter (
jehonë "

Mirë se vini: ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "
" ;
jehonë "Hyrja e mëparshme:". htmlspecialchars($_REQUEST["OldAuth"]);
jehonë "

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

\n" ;
}
?>

Kjo sjellje nuk rregullohet me standarde HTTP Bazë-autentifikimi, prandaj nuk duhet të vareni prej tij. Testimi i shfletuesit Rrëqebulli tregoi se Rrëqebulli nuk pastron cache-in e autorizimit kur merr statusin 401 nga serveri dhe duke klikuar radhazi "Back" dhe më pas "Përpara" është e mundur të hapet një faqe e tillë, me kusht që atributet e kërkuara të autorizimit të mos kenë ndryshuar. Sidoqoftë, përdoruesi mund të shtypë tastin "_" për të pastruar cache-in e vërtetimit.

Në mënyrë që vërtetimi HTTP të funksionojë siç duhet në një server IIS me një version CGI të PHP, duhet të modifikoni cilësimin e konfigurimit të IIS të quajtur " Siguria e Drejtorisë". Klikoni mbi mbishkrimin " Redakto"dhe vendosni opsionin" Akses Anonim", të gjitha fushat e tjera duhet të mbeten të pakontrolluara.

Koment: Shënim në lidhje me IIS:
Në mënyrë që vërtetimi HTTP të funksionojë saktë në IIS, në konfigurimin PHP, opsioni cgi.rfc2616_headers duhet të vendoset në 0 (vlera e parazgjedhur).

Koment:

Në rast se përdoret modaliteti i sigurt, do t'i shtohet UID-i i skriptit aktual mbretëri-pjesa e kokës WWW-Vërteto.

Ky artikull është i vjetëruar.

Ky artikull u shkrua për shërbimin Shared Hosting, i cili është zhvlerësuar që nga 1 qershori 2019.

Shërbimi aktual i pritjes mund të porositet në faqen tonë të internetit

Autorizimi HTTP duke përdorur PHP

Ky artikull diskuton krijimin e autorizimit HTTP duke përdorur PHP, i cili do t'ju lejojë të mbyllni çdo seksion të faqes, për shembull pjesën administrative.

Për vërtetimin, HTTP ofron një mekanizëm të thjeshtë reagimi ndaj sfidës që mund të përdoret nga serveri për të sfiduar një kërkesë klienti dhe nga klienti për të ofruar informacione vërtetimi. Skema më e zakonshme e autorizimit është Skema Bazë e Autentifikimit.

Skema "bazë" e vërtetimit bazohet në faktin se agjenti i përdoruesit (shfletuesi) duhet të vërtetojë veten duke përdorur një ID të përdoruesit (emrin e përdoruesit) dhe fjalëkalimin për çdo fushë të mbrojtur. Serveri do ta respektojë kërkesën nëse mund të verifikojë që ID-ja dhe fjalëkalimi i përdoruesit janë të sakta për zonën e caktuar të mbrojtur. Në këtë skemë nuk ofrohen parametra shtesë identifikimi.

Pas marrjes së një kërkese vërtetimi, serveri përgjigjet me një sfidë të ngjashme me sa vijon:

WWW-Autentifiko: Realm bazë = "Zonë e kufizuar" HTTP/1.1 401 e paautorizuar

Këtu, "Zonë e kufizuar" është një varg i caktuar nga serveri që identifikon zonën e mbrojtur të URI-së së kërkuar (Kërkesë-URI). Me fjalë të thjeshta, emri i zonës së mbrojtur.

Më pas, për të marrë kredencialet e aksesit, agjenti i përdoruesit (shfletuesi) dërgon ID-në e përdoruesit (emrin e përdoruesit) dhe fjalëkalimin, të ndara me një karakter të vetëm dy pika (":"), te serveri brenda një vargu kredencialesh të koduar me bazë64:

Basic-credentials = "Basic" bazë-cookie

Këtu

  • bazë-cookie -- varg i koduar me bazë 64 që përmban kalimin e përdoruesit
  • user-pass -- një varg si "userid:password"
  • userid -- teksti që nuk përmban karaktere ":".
  • fjalëkalim -- tekst

Ju lutemi vini re se si emri i përdoruesit ashtu edhe fjalëkalimi janë të ndjeshëm ndaj shkronjave të vogla. Kjo do të thotë, për shembull, Përdoruesi dhe përdoruesi janë dy emra përdoruesish të ndryshëm.

Autorizimi HTTP dhe PHP

Ju mund të keni përdorur tashmë skemën e autorizimit bazë me PHP dhe e dini që thelbi i metodës është të merrni variablat PHP_AUTH_USER dhe PHP_AUTH_PW nga serveri në internet, të cilët përcaktojnë përkatësisht emrin e përdoruesit dhe fjalëkalimin dhe disi i përpunojnë ato brenda PHP -script. . Por vini re se kjo metodë është efektive vetëm kur PHP funksionon si një modul i serverit në internet Apache. Në hostin tonë, PHP funksionon në modalitetin CGI/FastCGI dhe metoda e përshkruar më sipër nuk do të funksionojë, pasi variablat PHP_AUTH_USER dhe PHP_AUTH_PW nuk do të kalojnë brenda skriptit.

Sidoqoftë, ekziston një mënyrë për të anashkaluar këtë kufizim dhe për të kaluar vlerat e emrit të përdoruesit dhe fjalëkalimit që përdoruesi fut brenda skriptit PHP. Për këto qëllime, përdoren mjetet mod_rewrite - moduli i serverit në internet Apache. Rregullat që do të përdorim janë si më poshtë:

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

Kur bëni një kërkesë përmes HTTP në skedarin sitename.ru/www/index.php, ky rregull do të transferojë përmbajtjen e një fushe jo të zbrazët të Autorizimit në parametrin e autorizimit si një kërkesë GET. Nëse përdorim PHP për të parë përmbajtjen e ndryshores $_GET["autorizim"], do të shohim vetëm kredencialet bazë të përshkruara më sipër - një rresht si:

Preg_match("/^Basic\s+(.*)$/i", $_GET["autorizim"], $user_pass); list($user,$pass)=shpërthejnë(":",base64_decode($user_pass));

Në këtë mënyrë do të marrim dy variabla - $user dhe $pass, që përmbajnë përkatësisht emrin e përdoruesit dhe fjalëkalimin. Tani, siç u përmend më lart, ato vetëm duhet të përpunohen në një farë mënyre - për shembull, krahasuar me variabla të ngjashëm nga baza e të dhënave ose nga një skedar me llogaritë e përdoruesve.

konkluzioni

Metoda e diskutuar në këtë artikull do të funksionojë me sukses jo vetëm në hostin tonë, por edhe kudo ku PHP funksionon në modalitetin CGI/FastCGI dhe Apache + mod_rewrite përdoret si një server në internet.

Tekstet burimore të shembujve të punës mund t'i gjeni në Shtojcën e këtij artikulli.

Aplikacion. Burimet e skriptit

Teksti burimor i skedarit .htaccess

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

Teksti burimor i skriptit PHP

$authenticated=0; if(isset($_GET["autorizim"])) (if(preg_match("/^Basic\s+(.*)$/i", $_GET["autorizim"], $user_pass)) (lista($user ,$pass)=explode(":",base64_decode($user_pass)); // Kontrollimi i saktësisë së detajeve të hyrjes të futura if($user=="user" && $pass=="fjalëkalimi") ( $authenticated= 1; ) ) ) if($authenticated) ( // Autorizimi përfundoi me sukses echo("user: ".$user."
kalim: ".$pass); ) else ( header ("WWW-Authenticate: Basic realm = "Zonë e kufizuar""); header ("HTTP/1.1 401 i paautorizuar"); echo ("Qasja u refuzua"); )

Është e mundur të përdoret funksioni kokë () për të dërguar një mesazh "Kërkohet vërtetimi" shfletuesi, duke e detyruar atë të shfaqë një dritare për të futur hyrjen dhe fjalëkalimin tuaj. Pasi përdoruesi të plotësojë hyrjen dhe fjalëkalimin, lidhja që përmban skriptin PHP do të thirret përsëri me variablat e paracaktuara PHP_AUTH_USER , PHP_AUTH_PW dhe AUTH_TYPE të vendosura përkatësisht në login, password dhe llojin e vërtetimit. Këto variabla të paracaktuar ruhen në vargjet $_SERVER dhe $HTTP_SERVER_VARS. Të dy llojet mbështeten: "Basic" dhe "Digest" (që nga PHP 5.1.0). Shikoni funksionin për detaje kokë ().

Një shembull i një fragmenti skripti që detyron klientin të identifikohet për të parë faqen:

Shembulli #6 Shembull themelor i vërtetimit HTTP

nëse (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
kokë ( "WWW-Authenticate: Basic Realm="My Realm"");

jehonë "Teksti u dërgua kur
nëse përdoruesi klikon butonin Anulo"
;
dalje;
) tjeter (
jehonë
"

Përshëndetje ($_SERVER [ "PHP_AUTH_USER" ]) .

" ;
jehonë "

Ju keni futur fjalëkalimin tuaj($_SERVER [ "PHP_AUTH_PW" ]) .

" ;
}
?>

Shembulli #7 Shembull i verifikimit të HTTP-së

Ky është një shembull zbatimi i një skripti të thjeshtë të vërtetimit të Digest HTTP. Për detaje, shihni » RFC 2617.

$realm = "Zonë e ndaluar" ;

//përdoruesi => fjalëkalimi
$users = array("admin" => "mypass" , "guest" => "musafir" );

nëse (bosh ($_SERVER [ "PHP_AUTH_DIGEST" ])) (
header ("HTTP/1.1 401 i paautorizuar");
kokë ( "WWW-Authenticate: Digest realm="". $sferë.
"",qop="auth",nonce="" . uniqid(). "", i errët = "" . md5 (sfera e $). """);

vdes( "Teksti dërgohet nëse përdoruesi klikon "Anulo");
}

// analizoni variablin PHP_AUTH_DIGEST
nëse (!($data = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
!isset($users [ $data [ "username" ]]))
vdes ( "Të dhëna të gabuara!");

// gjenerojnë përgjigjen e saktë
$A1 = md5 ($data [ "emri i përdoruesit" ] . ":" . $realm. ":" . $users [ $data [ "emri i përdoruesit" ]]);
$A2 = md5($_SERVER["METHOD_REQUEST"]. ":" . $data["uri" ]);
$valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $data ["qop"].":". $A2);

if ($data [ "response" ] != $valid_response )
vdes ( "Të dhëna të gabuara!");

// ok, identifikimi dhe fjalëkalimi janë të sakta
echo "Jeni të identifikuar si: " . $data ["emri i përdoruesit"];

// http auth parsing header funksion
funksioni http_digest_parse ($txt)
{
// mbrojtje kundër të dhënave që mungojnë
$needed_parts = grup("nonce" => 1 , "nc" => 1 , "cnonce" => 1 , "qop" => 1 , "emri i përdoruesit" => 1 , "uri" => 1 , "përgjigje" => 1);
$data = grup();
$keys = implode ("|" , çelësat_array ($needed_parts ));

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

Foreach ($përputhet me $m) (
$data [ $m [ 1 ]] = $m [ 3 ] ? $m [3]: $m [4];
unset($pjesët_të nevojshme [ $m [ 1 ]]);
}

Të kthehen $needed_parts ? false : $data ;
}
?>

Koment: Shënim i përputhshmërisë

Jini veçanërisht të kujdesshëm kur specifikoni titujt HTTP. Për të siguruar përputhshmërinë maksimale me numrin më të madh të klientëve të ndryshëm, fjala "Basic" duhet të shkruhet me një "B" të madhe, rajoni (sfera) duhet të mbyllet në thonjëza të dyfishta (jo të vetme!) dhe saktësisht një hapësirë ​​duhet të paraprijë. Kodi 401 në titull HTTP/1.0 401. Parametrat e vërtetimit duhet të ndahen me presje, siç tregohet në shembullin e vërtetimit të Digest më sipër.

Në vend që thjesht të shfaqni variablat PHP_AUTH_USER dhe PHP_AUTH_PW në ekran, mund t'ju duhet të kontrolloni nëse ato janë të sakta. Për ta bërë këtë, përdorni një pyetje të bazës së të dhënave ose kërkoni një përdorues në një skedar dbm.

Mund të vëzhgoni veçoritë e funksionimit të shfletuesit Internet Explorer. Është shumë zgjedhës për parametrat e titujve të transmetuar. Truku i titullit WWW-Vërteto përpara se të dërgoni statusin HTTP/1.0 401 punon për të deri tani.

Që nga PHP 4.3.0, për të parandaluar dikë që të shkruajë një skript që zbulon fjalëkalimin për një faqe që përdor vërtetim të jashtëm, variablat PHP_AUTH nuk vendosen nëse faqja përdor vërtetim të jashtëm dhe është vendosur në modalitetin e sigurt. Megjithatë, ndryshorja REMOTE_USER mund të përdoret për të vërtetuar një përdorues të autentifikuar nga jashtë. Kështu që mund të përdorni gjithmonë variablin $_SERVER["REMOTE_USER"].

Koment: Shënim i konfigurimit

PHP përdor tregues direktivë AuthType për të treguar nëse është përdorur vërtetimi i jashtëm apo jo.

Duhet të theksohet se të gjitha sa më sipër nuk parandalojnë vjedhjen e fjalëkalimeve të faqeve që kërkojnë autorizim nga dikush që kontrollon faqet pa autorizim të vendosura në të njëjtin server.

Si Netscape Navigator ashtu edhe Internet Explorer pastrojnë cache-in e vërtetimit të dritares aktuale për një fushë të caktuar kur merren nga serveri. Kjo mund të përdoret për të detyruar përdoruesin të dalë dhe të rishfaq kutinë e dialogut të emrit të përdoruesit dhe fjalëkalimit. Disa zhvillues e përdorin këtë për të kufizuar hyrjet në kohë ose për të siguruar një buton daljeje.

Shembulli #8 Shembull i vërtetimit të HTTP me futjen e detyruar të një çifti të ri hyrje/fjalëkalim

funksioni autentifikimi () (
kokë ( "WWW-Authenticate: Basic Realm="Testoni Sistemin e Autentifikimit"");
header ("HTTP/1.0 401 i paautorizuar");
jehonë "Duhet të futni emrin e saktë të përdoruesit dhe fjalëkalimin për të hyrë në burim \n";
dalje;
}

nëse (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenPara" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
vërtetoj ();
) tjeter (
jehonë "

Mirë se vini: ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "
" ;
jehonë "Hyrja e mëparshme:". htmlspecialchars($_REQUEST["OldAuth"]);
jehonë "

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

\n" ;
}
?>

Kjo sjellje nuk rregullohet me standarde HTTP Bazë-autentifikimi, prandaj nuk duhet të vareni prej tij. Testimi i shfletuesit Rrëqebulli tregoi se Rrëqebulli nuk pastron cache-in e autorizimit kur merr statusin 401 nga serveri dhe duke klikuar radhazi "Back" dhe më pas "Përpara" është e mundur të hapet një faqe e tillë, me kusht që atributet e kërkuara të autorizimit të mos kenë ndryshuar. Sidoqoftë, përdoruesi mund të shtypë tastin "_" për të pastruar cache-in e vërtetimit.

Duhet të theksohet gjithashtu se përpara PHP 4.3.3, vërtetimi i HTTP nuk funksiononte në serverët që përdornin Microsoft IIS nëse PHP ishte instaluar si një modul CGI, për shkak të disa kufizimeve të IIS. Për ta bërë atë të funksionojë siç duhet në PHP 4.3.3+, duhet të modifikoni cilësimin e konfigurimit të IIS të quajtur " Siguria e Drejtorisë". Klikoni mbi mbishkrimin " Redakto"dhe vendosni opsionin" Akses Anonim", të gjitha fushat e tjera duhet të mbeten të pakontrolluara.

Një kufizim tjetër nëse përdorni IIS nëpërmjet ISAPI dhe PHP 4: variablat PHP_AUTH_* nuk janë të përcaktuara, por në të njëjtën kohë ndryshorja është e disponueshme HTTP_AUTHORIZATION. Shembull i kodit që mund të përdorni: list($përdorues, $pw) = shpërthejë(":", base64_dekodi(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Koment: Shënim në lidhje me IIS:
Në mënyrë që vërtetimi HTTP të funksionojë saktë në IIS, në konfigurimin PHP, opsioni cgi.rfc2616_headers duhet të vendoset në 0 (vlera e parazgjedhur).

Koment:

Në rast se përdoret modaliteti i sigurt, do t'i shtohet UID-i i skriptit aktual mbretëri-pjesa e kokës WWW-Vërteto.

Për të dërguar një mesazh "Kërkohet vërtetimi" në shfletuesin e klientit, i cili nga ana tjetër do të bëjë që të shfaqet një kuti dialogu për futjen e emrit të përdoruesit dhe fjalëkalimit. Pasi klienti të ketë futur emrin dhe fjalëkalimin e tij, skripti do të thirret përsëri, por me variablat e paracaktuara PHP_AUTH_USER, PHP_AUTH_PW dhe AUTH_TYPE, të cilat përmbajnë përkatësisht emrin e përdoruesit, fjalëkalimin dhe llojin e vërtetimit. Këto variabla mund të gjenden në grupin $_SERVER dhe $HTTP_SERVER_VARS. Aktualisht mbështetet vetëm vërtetimi "Basic". Ju gjithashtu mund të lexoni një përshkrim më të detajuar të funksionit kokë () .

Një shembull i një fragmenti skripti që detyron klientin të identifikohet për të parë faqen:

Shembull i vërtetimit HTTP

nëse (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
kokë ( "WWW-Authenticate: Basic Realm="My Realm"");

jehonë "Teksti u dërgua kur
nëse përdoruesi klikon butonin Anulo"
;
dalje;
) tjeter (
jehonë
"

Përshëndetje ($_SERVER["PHP_AUTH_USER"]).

"
;
jehonë "

Ju keni futur fjalëkalimin tuaj ($_SERVER["PHP_AUTH_PW"]).

"
;
}
?>

Shënim i përputhshmërisë: Jini veçanërisht të kujdesshëm kur specifikoni titujt HTTP. Për të siguruar përputhshmëri maksimale me numrin më të madh të klientëve të ndryshëm, fjala "Basic" duhet të shkruhet me një "B" të madhe, rajoni (sfera) duhet të mbyllet në thonjëza të dyfishta (jo teke!) dhe saktësisht një hapësirë ​​duhet të paraprijë. Kodi 401 në titull HTTP/1.0 401 .

Në vend që thjesht të shfaqni variablat PHP_AUTH_USER dhe PHP_AUTH_PW në ekran, mund t'ju duhet të kontrolloni nëse ato janë të sakta. Për ta bërë këtë, përdorni një pyetje të bazës së të dhënave ose kërkoni një përdorues në një skedar dbm.

Mund të vëzhgoni veçoritë e funksionimit të shfletuesit Internet Explorer. Është shumë zgjedhës për parametrat e titujve të transmetuar. Përcaktimi i një titulli WWW-Vërteto para se të dërgoni statusin HTTP/1.0 401 është një mashtrim i vogël.

Duke filluar me PHP 4.3.0, për të parandaluar dikë që të shkruajë një skript që zbulon fjalëkalimin për një faqe që përdor vërtetim të jashtëm, variablat PHP_AUTH nuk vendosen nëse faqja përdor vërtetim të jashtëm dhe vendoset në modalitetin e sigurt. Megjithatë, ndryshorja REMOTE_USER mund të përdoret për të vërtetuar një përdorues të autentifikuar nga jashtë. Kështu që mund të përdorni gjithmonë variablin $_SERVER["REMOTE_USER"].

Shënim: PHP përdor direktivën AuthType për të treguar nëse është përdorur vërtetimi i jashtëm apo jo.

Duhet të theksohet se të gjitha sa më sipër nuk parandalojnë vjedhjen e fjalëkalimeve të faqeve që kërkojnë autorizim nga dikush që kontrollon faqet pa autorizim të vendosura në të njëjtin server.

Si Netscape Navigator ashtu edhe Internet Explorer pastrojnë cache-in e vërtetimit të dritares aktuale për një fushë të caktuar kur merren nga serveri. Kjo mund të përdoret për të detyruar përdoruesin të dalë dhe të rishfaq kutinë e dialogut të emrit të përdoruesit dhe fjalëkalimit. Disa zhvillues e përdorin këtë për të kufizuar hyrjet në kohë ose për të siguruar një buton daljeje.

Shembull i vërtetimit të HTTP me futjen e detyruar të një çifti të ri hyrje/fjalëkalim

funksioni autentifikimi () (
kokë ( "WWW-Authenticate: Basic Realm="Testoni Sistemin e Autentifikimit"");
header ("HTTP/1.0 401 i paautorizuar");
jehonë "Duhet të futni emrin e saktë të përdoruesit dhe fjalëkalimin për të hyrë në burim \n";
dalje;
}

Nëse (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenPara" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
vërtetoj ();
}
tjeter(
jehonë
"

Mirë se vini: ($_SERVER["PHP_AUTH_USER"])
" ;
jehonë "Identifikimi i mëparshëm: ($_REQUEST["OldAuth"])";
jehonë "

\n";
jehonë "\n";
jehonë "\n";
jehonë "\n";
jehonë"

\n" ;
}
?>

Kjo sjellje nuk rregullohet nga standardet e vërtetimit bazë HTTP, kështu që nuk duhet të vareni prej saj. Testet kanë treguar se shfletuesi Lynx nuk e pastron cache-në e autorizimit kur merr një status 401 nga serveri dhe duke klikuar "Back" dhe më pas "Përpara" me radhë, është e mundur të hapet një faqe e tillë, me kusht që autorizimi i kërkuar. atributet nuk kanë ndryshuar. Sidoqoftë, përdoruesi mund të shtyp tastin "_" për të pastruar cache-in e vërtetimit.

Duhet të theksohet gjithashtu se përpara PHP 4.3.3, vërtetimi i HTTP nuk funksiononte në serverët që përdornin Microsoft IIS nëse PHP ishte instaluar si një modul CGI, për shkak të disa kufizimeve të IIS. Për të arritur funksionimin e saktë në PHP 4.3.3+, duhet të modifikoni cilësimin e konfigurimit të IIS të quajtur "Directory Security". Klikoni në "Edit" dhe kontrolloni opsionin "Anonymous Access", të gjitha fushat e tjera duhet të mbeten të pakontrolluara.

Një kufizim tjetër nëse përdorni IIS nëpërmjet ISAPI: variablat PHP_AUTH_* nuk janë të përcaktuara, por në të njëjtën kohë ndryshorja HTTP_AUTHORIZATION është e disponueshme. Shembull i kodit që mund të përdorni: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Shënim në lidhje me IIS:: Në mënyrë që vërtetimi HTTP të funksionojë saktë në IIS, opsioni cgi.rfc2616_headers në konfigurimin PHP duhet të vendoset në 0 (vlera e paracaktuar).

Kujdes: Në rast se përdoret modaliteti i mbrojtur, UID-i i skriptit aktual do të shtohet në pjesën e fushës së titullit WWW-Authenticate.



<<< Назад përmbajtja Përpara >>>
Nëse keni ndonjë pyetje tjetër ose diçka nuk është e qartë - mirë se vini në faqen tonë

Artikujt më të mirë mbi këtë temë