Dauntless auth php. HTTP Inštalácia zabezpečenia na stránke pomocou MySQL a PHP. Aplikácia. Zdrojové texty skriptov

Na odoslanie správy „Vyžaduje sa overenie“ do prehliadača klienta, čo bude mať za následok dialógové okno na zadanie používateľského mena a hesla. Keď klient zadá svoje meno a heslo, skript sa zavolá znova, ale s preddefinovanými premennými PHP_AUTH_USER , PHP_AUTH_PW a AUTH_TYPE , ktoré obsahujú užívateľské meno, heslo a typ autentifikácie. Tieto premenné možno nájsť v poliach $_SERVER a $HTTP_SERVER_VARS. V súčasnosti je podporovaná iba „základná“ autentifikácia. Môžete si prečítať aj podrobnejší popis funkcie hlavička() .

Príklad fragmentu skriptu, ktorý núti klienta prihlásiť sa na zobrazenie stránky:

Príklad overenia HTTP

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

ozvena "Text, ktorý sa má odoslať, ak
ak používateľ klikol na tlačidlo Zrušiť"
;
VÝCHOD;
) inak (
ozvena
"

Dobrý deň ($_SERVER["PHP_AUTH_USER"]).

" ;
ozvena "

Zadali ste heslo ($_SERVER["PHP_AUTH_PW"]).

"
;
}
?>

Poznámka o kompatibilite: Buďte obzvlášť opatrní pri zadávaní hlavičiek HTTP. Aby bola zaručená maximálna kompatibilita s najväčším počtom rôznych klientov, slovo „Basic“ musí byť napísané veľkým písmenom „B“, oblasť (realm) musí byť uzavretá v dvojitých (nie jednoduchých!) úvodzovkách a presne jedna medzera musí predchádzať kód 401 v názve HTTP/1.0 401 .

Namiesto zobrazovania premenných PHP_AUTH_USER a PHP_AUTH_PW na obrazovke možno budete musieť skontrolovať, či sú správne. Na tento účel použite dotaz databázy alebo vyhľadajte používateľa v súbore dbm.

Môžete sledovať funkcie prehliadača internet Explorer. Je veľmi náročný na parameter prenášaných hlavičiek. Špecifikácia hlavičky WWW-Autentifikácia pred odoslaním HTTP/1.0 stav 401 je malý trik.

Od PHP 4.3.0 sa premenné PHP_AUTH nenastavujú, ak chcete zabrániť tomu, aby niekto napísal skript, ktorý odhalí heslo pre stránku, ktorá používa externú autentifikáciu táto strana používa externú autentifikáciu a je nastavený na zabezpečený režim. Bez ohľadu na to možno premennú REMOTE_USER použiť na autentifikáciu externe overeného používateľa. Takže vždy môžete použiť premennú $_SERVER["REMOTE_USER"].

Poznámka: PHP používa direktívu AuthType na určenie, či sa používa externá autentifikácia alebo nie.

Treba poznamenať, že všetky vyššie uvedené nebránia odcudzeniu hesiel pre stránky vyžadujúce autorizáciu kýmkoľvek, kto kontroluje stránky bez autorizácie umiestnené na rovnakom serveri.

Netscape Navigator aj Internet Explorer po prijatí zo servera vymažú vyrovnávaciu pamäť autentifikácie aktuálneho okna pre danú sféru. Toto možno použiť na prinútenie používateľa odhlásiť sa a znova zobraziť dialógové okno používateľského mena a hesla. Niektorí vývojári to používajú na časové obmedzenie prihlásenia alebo na poskytnutie tlačidla na odhlásenie.

Príklad HTTP autentifikácie s vynúteným zadaním nového páru login/heslo

function authenticate()(
hlavička( "WWW-Authenticate: Basic realm="Test Authentication System"");
hlavička("HTTP/1.0 401 neautorizované");
ozvena "Pre prístup k zdroju musíte zadať platné používateľské meno a heslo \n";
VÝCHOD;
}

If (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
overiť ();
}
inak(
ozvena
"

Vitajte: ($_SERVER["PHP_AUTH_USER"])
" ;
ozvena "Predchádzajúce prihlásenie: ($_REQUEST["OldAuth"])";
ozvena "

\n";
ozvena "\n";
ozvena "\n";
ozvena "\n";
ozvena"

\n" ;
}
?>

Toto správanie nie je definované štandardmi HTTP Basic Authentication, takže by ste sa naň nemali spoliehať. Ako ukázali testy, prehliadač Lynx nevymaže autorizačnú vyrovnávaciu pamäť pri prijatí stavu 401 zo servera a postupným kliknutím na „Späť“ a potom „Vpred“ je možné takúto stránku otvoriť za predpokladu, že autorizačné atribúty sa nezmenili. Používateľ však môže stlačením klávesu „_“ vymazať vyrovnávaciu pamäť autentifikácie.

Všimnite si tiež, že pred PHP 4.3.3 nefungovala autentifikácia HTTP na serveroch so systémom Microsoft IIS, ak bol PHP nainštalovaný ako modul CGI, kvôli niektorým obmedzeniam IIS. Aby sa dosiahlo správna prevádzka v PHP 4.3.3+ musíte upraviť nastavenie konfigurácie IIS s názvom „Bezpečnosť adresára“. Kliknite na štítok „Upraviť“ a začiarknite možnosť „Anonymný prístup“, všetky ostatné polia by mali zostať nezačiarknuté.

Ďalšie obmedzenie, ak používate IIS cez ISAPI: Premenné PHP_AUTH_* nie sú definované, ale premenná HTTP_AUTHORIZATION je dostupná. Príklad kódu, ktorý by ste mohli použiť: zoznam($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Poznámka týkajúca sa IIS: Aby autentifikácia HTTP v IIS fungovala správne, musí byť možnosť cgi.rfc2616_headers v konfigurácii PHP nastavená na 0 (predvolená hodnota).

Pozor: V prípade použitia chráneného režimu sa UID aktuálneho skriptu pridá do sféry hlavičky WWW-Authenticate.



<<< Назад Obsah Vpred >>>
Ak máte ďalšie otázky alebo vám niečo nie je jasné, vitajte u nás

Obmedzenie prístupu do určitej oblasti webu zvyčajne vyzerá takto
monotónne: každý používateľ dostane prihlasovacie meno a heslo alebo on sám
ich vyberie a musíte ich zadať, aby ste vstúpili do zabezpečenej časti lokality. Z technického hľadiska overenie hesla využíva
rôzne metódy. Na zadanie používateľského mena a hesla je možné použiť formulár HTML.
V tomto prípade sa heslo odošle na server ako čistý text v požiadavke POST.
Toto je neprijateľné, ak je používateľ tam, kde je to možné, v sieti LAN
pomocou čuchača. Na vyriešenie tohto problému bola vyvinutá metóda
hash autentifikácie, pri ktorej sa heslo neprenáša, ale
hash string je odovzdaný, v závislosti od hesla, nejaký jednorazový
parametrom a prípadne z akýchkoľvek iných parametrov. Táto metóda je stále
sa nazýva výzva/odpoveď, pretože keď ju použijete, klient
prijme požiadavku s jednorazovým parametrom a odošle odpoveď obsahujúcu hash. Na úrovni protokolu HTTP 1.1 je pomocou metódy možná autentifikácia
Základné, čo je nič lepšie využitie HTML formuláre a Digest, ktorý
podrobne zvážime.

Pri použití metódy Digest, ako už bolo spomenuté, heslo
sa neprenáša a nedá sa čuchať, ale je tu aj druhá strana
Problémy. Na overenie hesla musí server vypočítať
odpoveď a porovnať ju s odpoveďou klienta, preto musí server
uložiť heslo alebo údaje na ňom závislé, potrebné pre
absolvovanie overenia. Z toho vyplýva, že osoba, ktorá získala práva
čítať účty (napríklad pomocou SQL-injection), budú môcť získať
prístup na stránky chránené metódou Digest. Pri použití metódy
Základné je možné ukladať hashe namiesto hesiel, čo neumožňuje zvyšovanie práv,
po prečítaní týchto hashov (nižšie uvidíme, že Digest môže tiež ukladať hash,
ale také, že ich znalosti sú dostatočné na výpočet odpovede). Stojíme teda pred dilemou: buď bude naše heslo vyňuchané,
alebo to získajú cez webovú zraniteľnosť, ktorú niekto určite nájde,
pretože kto hľadá, vždy nájde. Existuje metóda autentifikácie bez
oba tieto nedostatky - metóda autentifikácie verejným kľúčom:
na overenie potrebujete verejný kľúč a na overenie tajný kľúč,
HTTP 1.1 však takúto metódu neposkytuje. RFC 2069
odporúča používať SSL, ak je bezpečnosť taká dôležitá. Chránený je iba prenos hesla a obsah nie je šifrovaný
že týmto spôsobom nemá zmysel chrániť zdroje, odkiaľ používateľ
prijíma utajovaných skutočností. Vyžadujú SSL. A dáva to zmysel
na ochranu napríklad fóra alebo nahrávania obsahu na stránku. Takže, ak hosting nepodporuje SSL, autentifikácia musí
pre istotu použijeme Digest. Apache má modul mod_digest. Ak ju chcete použiť
v konfigurácii (alebo v .htaccess) napíšeme:

AuthType Digest
AuthUserFile<файл>
AuthName<название защищаемой области>
Vyžadovať valid_user

Používateľské súbory vytvára obslužný program
htdigest. Mod_digest bol chvíľu hlásený ako zraniteľný, takže
možno sa ešte nájdu nejaké problémy. Navyše, kedy
Skúšal som to použiť doma, vyskytla sa chyba
500 Interná chyba servera. Okrem toho, ak by malo dôjsť k pridaniu účtov
automaticky, a malo by ich byť veľa, mali by
byť uložené nie v konfigurácii Apache, ale v MySQL. Riešenie -
použite php. PHP na to nemá vstavanú podporu.
metódu, takže ju bude treba zaviesť. Na to je potrebné študovať
túto metódu podrobne. Hneď si všimnem, že článok uvedený v tomto článku
implementácia funguje iba na Apache od úplného prístupu k hlavičkám
request (funkcia apache_request_headers) funguje iba v Apache, ale na
iné servery nemusia byť dostupné. Potrebujeme len čítať
Hlavička autorizácie.

Popis metódy

Úplný popis metódy možno nájsť v RFC 2069, a ak
skrátka metóda funguje takto. Keď server prijme požiadavku týkajúcu sa chránenej oblasti,
vyhodí chybu 401 Vyžaduje sa autorizácia a hlavičku požiadavky
autentifikácia takto:

WWW-Authenticate: Digest realm="secure area", nonce="123456123456"

realm je názov chránenej oblasti a nonce je jednorazový
význam. Existuje viac voliteľných parametrov, o ktorých diskutujeme
nebudeme. Klient zopakuje požiadavku s hlavičkou takto:

Autorizácia: Digest realm="secure area", username="123", uri="/index.php", nonce="123456123456", response="1234567890abcdef1234567890abcdef"

Parameter uri sa musí zhodovať s URI v požiadavke a odpoveď je
odpoveď, ktorá sa vypočíta takto:

odpoveď = H(H(A1) + ":" + nonce + ":" + H(A2))
H - hašovacia funkcia, predvolená MD5
A1 = login + ":" + realm + ":" + heslo
A2 = metóda požiadavky + ":" + URI
metóda žiadosti je GET, POST atď.

Ako vidíte, A1 nezávisí ani od dopytu, ani od jednorazového
hodnoty, takže server nemusí uložiť heslo, ale
H(Al). Takto je implementovaný v mod_digest v Apache.
Klientovi však stačia rovnaké údaje. Útočník dostal
tento hash, dokáže vypočítať odpoveď pomocou vyššie uvedených vzorcov a
vygenerovať požiadavku HTTP, napríklad pomocou programu
AccessDriver a jeho HTTP nástroj
debugger. Tento proces bude podrobnejšie znázornený nižšie. Server musí skontrolovať, či je hodnota nonce
ten, ktorý bol klientovi predtým vydaný a či je neaktuálny.
Ak sa odpoveď zhoduje s parametrom nonce, ale s hodnotou tohto parametra
nie je relevantná, odpoveď opísaná vyššie s kódom 401 je vydaná s jediným
rozdiel je v tom, že hlavička WWW-Authenticate sa pridáva s parametrom
stale=true označuje, že prístup je odmietnutý len z tohto dôvodu,
a mali by ste to skúsiť znova bez výzvy používateľa na zadanie nového hesla. To je IMHO nepohodlné, pretože ak takáto situácia nastane
pri požiadaní o POST alebo PUT s veľkým blokom údajov bude musieť klient
preniesť všetky údaje dvakrát. Aby sa tomu zabránilo, štandard poskytuje
hlavička Authentication-Info, na ktorú môže server odpovedať
úspešná žiadosť informuje klienta o ďalšom nonce.
Syntax je rovnaká ako WWW-Authenticate, s výnimkou nonce
sa nahrádza nextnonce. Súdiac však podľa výsledkov môjho
experimenty, Opera túto hlavičku ignoruje. Iné riešenie: podľa
RFC 2068 (HTTP/1.1), server MÔŽE odpovedať pred dokončením požiadavky,
aby klient prerušil zbytočný prenos dát, ale na Apache+PHP toto
nie je implementovaný, pretože skript sa začne vykonávať až po
ako Apache plne prijme a analyzuje požiadavku.

Ukladanie údajov medzi požiadavkami

Implementácia metódy výzva/odpoveď v PHP má jeden jemný bod.
Jednorazový parameter sa vytvorí a vydá klientovi v jednej odpovedi a
skontrolované už v inej relácii skriptu.
To znamená, že musí byť uložený z jedného volania skriptu do druhého, a na to musíte
použiť súbory alebo databázu. Môj príklad používa súbory s názvom,
zodpovedajúce jednorazové hodnoty a samotné súbory obsahujú
IP adresy klientov, ktorým sú vydané. Zbierka nie je v príklade implementovaná
odpadky: musíte pravidelne odstraňovať staré súbory.

Analýza kódu

Tento skript kontroluje iba heslo a funguje bez ohľadu na to
Prihlásiť sa. V závislosti od úspešnosti kontroly sa vydávajú jednoduché odpovede.

$realm = "zabezpečená oblasť"; // Názov chráneného územia
$pass = "pass"; // Heslo
$fileprefix = "./"; // Cesta k súborom štítkov označujúca platnosť nonce

/* Skonštruujme jednorazový parameter podľa odporúčania v RFC2069, aj keď je to možné aj iným spôsobom. Parameter by mal podľa odporúčania závisieť od adresy klienta, aktuálneho času a tajného reťazca. */
$nonce = md5($_SERVER["REMOTE_ADDR"] . ":" . time() . ":MyCooolPrivateKey");

// Získavanie hlavičiek
$headers = apache_request_headers();

// Príznak, ktorý po úspešnom overení nastavíme na hodnotu TRUE
$auth_success = FALSE;
$stale = "";

// Ak neexistuje hlavička Autorizácia, nie je čo kontrolovať
if (isset($headers["Autorizácia"]))
{
$autorizácia = $headers["Autorizácia"];

/* Analyzujte názov pomocou regulárneho výrazu. Názov obsahuje slovo „Digest“ a zoznam
parametre v tvare param="hodnota" alebo param=hodnota oddelené čiarkami. Tento regulárny výraz sa zhoduje s jedným takýmto parametrom.
*/
preg_match_all("/(,|\s|^)(\w+)=("([^"]*)"|([\w\d]*))(,|$)/",
$autorizácia, $zhody, PREG_SET_ORDER);

/* Teraz, pre pohodlie ďalšieho spracovania, vytvoríme pole, kde kľúče sú názvy parametrov a hodnoty prvkov poľa sú
hodnoty parametrov.
*/
$auth_params = pole();
pre ($i = 0; $i< count($matches); $i++)
{
$zhoda = $zhoda[$i];

/* Názov je vždy v druhej skupine zátvoriek, podľa toho, či je v úvodzovkách alebo nie, môže
byť v 4. alebo 5. skupine. Pre skupiny skob chytených
na nerealizovanú vetvu, prázdny reťazec v poli,
takže môžete len pridať hodnoty.
*/
$auth_params[$match] = $match . $match;
}

/* Vypočítajte zodpovedajúcu odpoveď
prihlasovacie meno zadané používateľom, naše heslo a jednorazový parameter odovzdaný používateľom.
*/
$a1 = $auth_params["používateľské meno"] . ":". $auth_params["realms"] . ":". $pass;
$a2 = $_SERVER["POŽIADAVKA_METHOD"] . ":". $_SERVER["REQUEST_URI"];
$resp = md5(md5($a1) . ":" . $auth_params["nonce"] . ":" . md5($a2));

// Kontrolujeme odpoveď.
if ($resp == $auth_params["response"])
{
//
Kontrola relevantnosti jednorazového parametra
$fn = $prefix súboru . $auth_params["nonce"];
if (@file_get_contents($fn) == $_SERVER["REMOTE_ADDR"])
{
unlink($fn); //
Táto možnosť už nie je relevantná.
$auth_success = TRUE; //
Overenie bolo úspešné
) inak
{
// Jednorazový parameter je irelevantný
$stale = ", stale=true";
}
}
}

if ($auth_success)
{
vytlačiť (" Digest auth test

print("Úspešne overené\n");
var_dump($auth_params);

vytlačiť ("");

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

$proto = $_SERVER["SERVER_PROTOCOL"];
Hlavička("$proto 401 neautorizované");
Header("WWW-Authenticate: Digest realm=\"$realm\", nonce=\"$nonce\"$stale");

vytlačiť (" Digest auth test

");
print("Musíte sa overiť pomocou metódy Digest");
vytlačiť ("
");
}

Odovzdanie autorizácie Digest so známym H(A1)

Ukážem na príklade, ako prejsť overením, ak je heslo neznáme,
ale H(A1) je známe. K tomu, ako už bolo spomenuté, potrebujete
AccessDriver. Urobím hašovacie výpočty volaním z príkazového riadku
PHP CLI. Nech sa chránená stránka nachádza na adrese
http://mrblack.local/auth1.php a H(A1) hash je "a8fb5b2d780a7bf0782207a51a013f04".

Otvorte AccessDriver->Tools->HTTP Debugger a zadajte adresu
"http://mrblack.local/auth1.php". Kliknite na „Pripojiť“. Dostaneme:

Hlavička HTTP = HTTP/1.1 401 Vyžaduje sa autorizácia
Hlavička HTTP = Dátum: Pon, 04. júl 2005 08:09:17 GMT
Hlavička HTTP = Server: Apache/1.3.31 (Win32) PHP/5.0.2
Hlavička HTTP=X-Powered-By: PHP/5.0.2
Hlavička HTTP = WWW-Authenticate: Digest realm="secure area", nonce="5925bea78552224abda11bfe318a8a03"
Hlavička HTTP = Pripojenie: zatvorte
Hlavička HTTP = Typ obsahu: text/html

Otvorte konzolu, prejdite do priečinka s PHP a spustite nasledujúci príkaz:

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

Získame požadovanú odpoveď Digest: c6d0af0db239d75c
3f59640a4896d096
Teraz v AccessDriver začiarknite políčko "Údaje hlavičky" a skopírujte ho do zobrazeného súboru
hlavičky polí, ktoré boli odoslané v predchádzajúcej požiadavke, a pripojiť k nim
Autorizácia. Čo sa stane:

ZÍSKAJTE http://mrblack.local/auth1.php HTTP/1.1
Prijať: obrázok/gif, obrázok/x-xbitmap, obrázok/jpeg, obrázok/pjpeg, aplikácia/x-shockwave-flash, */*
Accept-Language: en-us,en;q=0,5
User Agent: Kompatibilný s Mozillou
Hostiteľ: mrblack.local
Pragma: no-cache
Autorizácia: Digest username="mrblack", realm="secure area", nonce="5925bea78552224ab
da11bfe318a8a03", uri="http://mrblack.local/auth1.php", response="c6d0af0db239d75c3f59
640a4896d096"

Kliknite na „Pripojiť“. Dostaneme výsledok:

Niekedy je potrebné zatvoriť zvonku PHP stránku, ak vytvoríte uzavretú oblasť lokality. Môže to byť nejaký druh skrytých informácií pre vašich klientov alebo návštevníkov stránok, nejaký druh administrátorského rozhrania pre vás atď. Môžete prísť so stovkami rôznych úloh, ktoré vyžadujú obmedzenia prístupu.

Takúto stránku môžete zatvoriť niekoľkými doplnkovými spôsobmi:

  1. Ochrana heslom (login/heslo) pomocou premenných $_SERVER["PHP_AUTH_USER"] a $_SERVER["PHP_AUTH_PW"].
  2. Ochrana podľa IP adresu klienta pomocou premennej $_SERVER["REMOTE_ADDR"].
  3. Ochrana podľa MAC adresy v lokálnych sieťach (okrem ochrany pomocou IP).

Najprv analyzujme prvú metódu, ktorá je hlavná. Umožňuje vám zatvoriť prístup na stránku pomocou prihlasovacieho mena a hesla, takže prístup môžu získať iba ľudia, ktorí poznajú prihlasovacie meno a heslo. Okrem toho je možné ich rozdeliť podľa tejto funkcie a poskytnúť pre každú z nich rôzne informácie. Implementované vydaním špeciálnych polí v hlavičke protokolu http. Vytvorme funkciu auth_send():

" ,"

Chyba overenia

" ,"

Požiadajte svojho správcu o používateľské meno a heslo.

" ","; výstup; ); ?>

Táto funkcia informuje prehliadač, že na prístup je potrebná autorizácia prihlasovacím menom a heslom. A tiež dáva stránku v HTML pre používateľa.

" ,"

Vitajte!

" ,"

Ste prihlásený pomocou používateľského mena ",$auth_user," a hesla ",$auth_pass,".

" ,""; ?>

Kód na overenie prihlásenia a hesla nie je v tomto prípade príliš zložitý, keďže je implementovaný pre jednu osobu. Prevádzková logika je jednoduchá, ak neexistuje žiadna premenná $_SERVER["PHP_AUTH_USER"] a $_SERVER["PHP_AUTH_PW"] alebo sa ich hodnoty nezhodujú s požadovanými, potom zavolajte funkciu auth_send(). Nezabudnite, že to volá na konci VÝCHOD, takže program sa ukončí.

Ďalšia úroveň ochrany je implementovaná filtrovaním IP pripájacia adresa klienta. Samozrejme, na internete, veľa poskytovateľov problém IP adresy na chvíľu a je zbytočné túto ochranu používať, ale ak sa bavíme o firemných lokálnych sieťach, tak táto kontrola zabezpečí dodatočnú ochranu.

Vaša IP sa nenašla!!!"; exit; ); ?>

Tu v rade $allowed_ips oddelené medzerou IP adresy, ktoré majú povolený prístup. Ďalej dostaneme pole pomocou explodovať () a vyhľadajte adresu klienta z $_SERVER["REMOTE_ADDR"]. Použil som funkciu vyhľadávania array_search(), pretože je nepravdepodobné, že jej kód implementovaný v C pobeží o niečo rýchlejšie, než do čoho môžeme napísať PHP pomocou cyklov pre alebo pre každý. Ale rýchlosť tu nie je hlavná vec :)

A posledným krokom obrany je kontrola MAC adresy. Patrí do kategórie paranoidných a mal by sa používať, ak pristupujete z lokálnej siete a dáta, ktoré chránite, sú naozaj veľmi dôležité. Zatiaľ som túto kontrolu implementoval iba na systéme linux z dôvodu relatívnej jednoduchosti implementácie. Môžete to však skúsiť implementovať pre akúkoľvek inú platformu. Napíšeme funkciu:

Ako už Linuxoidi pochopili, vychádza z ARP systémová tabuľka, ku ktorej je možné pristupovať pomocou súboru /proc/net/arp. Funkcia hľadá požadované reťazce IP adresu a vrátiť ju MAC adresa:

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

V systéme Windows možno existujú aj iné spôsoby, ako sa dostať MAC jednoduchšie, ale z tých, ktoré naozaj fungujú, je tento záver ARP systémové tabuľky s príkazom:

C:\WINDOWS\>arp -a Rozhranie: 192.168.10.15 na rozhraní 0x1000003 Adresa IP Typ fyzickej adresy 192.168.10.1 00-50-22-b0-6a-aa dynamická 192.168.10.2 8e90- e8 dynamická 192.168.10.3 00-04-61-9e-26-09 dynamická 192.168.10.5 00-0f-38-6a-b1-18 dynamická

Ochranu založenú na tejto adrese si môžete implementovať sami, ak ju naozaj potrebujete :) Pamätajte však, že ak máte v sieti nespravované zariadenie bez možnosti viazania MAC adresy na port, táto ochrana nemusí fungovať, keďže je možné sfalšovať všetky vaše identifikačné údaje používané na ochranu (login, heslo, IP a MAC adresa).

Úvod

Toto je návod, ktorý by vám mal ukázať základy zabezpečenia vašich webových stránok pomocou HTTP autentifikácie. Namiesto tradičnej metódy .htaccess (server Apache) použijeme na ukladanie používateľských údajov a ich hesiel MySQL. Pokúsim sa požuť všetko čo najviac na tom, čo je podľa mňa potrebné, aby sa začiatočník naučil MySQL a PHP. V zásade môžete použiť akýkoľvek DBMS (systém správy databáz) založený na tomto programe. Prečo je táto metóda zaujímavá? No napríklad už len preto, že ak používate databázu, môžete kľudne povoliť len určitej skupine (osobe) určité práva na prístup k tým či oným informáciám. Ak používate tradičnú metódu .htaccess Apache, musíte manuálne pridať používateľov a heslo do súboru s heslami. Výhoda túto metódu, no .... veď sa pozrite sami.

softvérčo je potrebné:

*platforma nix (Linux, Unix, *BSD) PHP 3.0.x alebo PHP 4.x MySQL (akákoľvek verzia)

Krok číslo jedna

Pokračujte, prvá vec, ktorú treba zistiť, je, že chceme povoliť používateľom, ktorí sú v našej databáze, prístup na zadanú stránku? A ako to urobíme? (mnohým sa to veľmi nepáči, ale treba si zvyknúť na to, že si pred programovaním zoberiete papier a zapíšete si všetky požiadavky, ktoré chceme z programu dostať, v budúcnosti ušetríte hodiny alebo možno dni vykonajte zmeny v kóde (približne))

Skontrolujte, či je používateľ už overený.

Ak nie, odošlite správu do prehliadača so správou a prístupovým formulárom.

Ak používateľ klikne na tlačidlo zrušiť, neumožnite mu prístup a presmerujte ho na... 403: Prístup odmietnutý alebo ukážte (cookie J) jednoduchú správu.

Ak používateľ vyplnil kombináciu používateľského mena a hesla, skontrolujte ich Databáza MySQLúdaje a uistite sa, že sú správne, ak sú kladné, povoľte prístup.

Ak všetkému nerozumiete, nebojte sa, neskôr (alebo možno nikdy) sa to vyjasní!

Druhý krok – Vytvorenie našej databázy

Chceme, aby databáza uchovávala používateľské mená (login) a heslá našich používateľov. Požadované polia je možné jednoducho pridať do existujúcej databázy, ale zatiaľ budeme predpokladať, že nepridávate do existujúcej databázy, ale vytvárate novú. Nasledujúci kód je popis, ako to urobiť. Predpoklad, ak máte na počítači Apache, môžete začať ihneď :)

mysql> vytvoriť členov databázy;
mysql> vytvoriť používateľov tabuľky (
používateľské meno varchar(25) NOT NULL,
heslo varchar(15) NOT NULL,
primárny kľúč (používateľské meno),
jedinečné používateľské meno (používateľské meno)
);

Teraz máme databázu na ukladanie používateľov, predpokladá používateľské meno do 25 znakov a heslá do 15 znakov. (ak vám z nejakého dôvodu nevyhovuje, nastavte si ho ako uznáte za vhodné) Používateľské meno by malo byť „primárny kľúč“ a malo by byť „jedinečné“, keďže nechceme, aby 2 alebo viacerí ľudia mali rovnaké používateľské meno.

Upozorňujeme, že používateľské mená budú v nasledujúcom prípade rozlišovať malé a veľké písmená, používateľ „Vasya“ bude identifikovaný odlišne od používateľa „vasya“, inými slovami, budú sa rozlišovať malé a veľké písmená. Teraz do MySQL pridáme testovacieho používateľa, aby sme ho mohli použiť na testy pri vytváraní stránky PHP.

mysql> grant select na members.users
do [e-mail chránený]
identifikovaný pomocou „Moje heslo“;

Je to preto, že keď chceme skontrolovať používateľské meno a heslo osoby prihlásenej do našej databázy, použijeme používateľa „httpuser“ s heslom „MyPassword“. Nakoniec musíme pridať používateľské meno a heslo osoby, ktorej chceme povoliť prístup.

mysql> vložiť do používateľov value("john_doe", "eod_nhoj");

Zámerne som dáta v programe nešifroval, aby som v prípade straty hesla nedešifroval a zjednodušil na minimum :)) To je všetko, MySQL skončil, teraz poďme ďalej!

Tretí krok - Napísanie PHP kódu

Skôr ako začneme, stručne popíšem, čo bude paga robiť. Keď sa dostanete na zabezpečenú stránku, server odošle požiadavku a zobrazí stránku na zadanie používateľského mena a hesla. Ak kliknete na tlačidlo Zrušiť alebo zadáte nesprávne údaje, server vám pošle (401 Neoprávnená hlavička a zamietne prístup.) - takto sa zvyčajne prekladá reťazec (401 Neoprávnená hlavička a odmietnutie prístupu) Nebudem vysvetli podla mna lepsie to povedat nemozes !!! V prípade, že zadáte všetko tak, ako má, ukáže sa, že jednoducho získate prístup (čo bolo potrebné na preukázanie) Teraz je najzábavnejšie, toto je samotný kód. Je napísaný zámerne s číslami riadkov, za kódom (nižšie) sú uvedené vysvetlivky riadkov.

01 02
03 function access_denied() (
04 echo "401 Neoprávnené: Kombinácia používateľského mena / hesla, ktorú ste zadali, bola neplatná.n";
05 }
06
07 funkcia auth_headers($title) (
08 Hlavička("WWW-Authenticate: Basic realm="$title"");
09 Hlavička("HTTP/1.0 401 Neoprávnené");
10 }
11
12 if(!isset($PHP_AUTH_USER)) (
13 auth_headers("Moja chránená webová stránka");
14 access_denied();
15 výstup;
16 }
17 iných (
18
19 $hostname = "localhost";
20 $username = "httpuser";
21 $password = "Moje heslo";
22 $databaza = "členovia";
23
24 $query = "vyberte užívateľské meno, heslo z užívateľov, kde užívateľské meno="$PHP_AUTH_USER" a heslo="$PHP_AUTH_PW"";
25 $link = mysql_connect($localhost, $username, $password) or die("Nedá sa pripojiť k databázovému serveru");
26
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) (
28 auth_headers("Moja chránená webová stránka");
29 access_denied();
30 výstup;
31 }
32
33 mysql_close($odkaz);
34 }
35 ?>

To je celý trik - pokus, funguje to dobre, môžeš to použiť kde chceš, kedy chceš a ako chceš, meniť, vylepšovať, ak sa ti pri šetrení podarí zredukovať kód na dva riadky funkčnosť program, potom mi ho určite pošlite!

V tejto časti rýchlo preskúmame každý riadok, aby sme predišli búrlivej výmene otázok v komentároch k tomuto článku vopred.

Riadok 3:
Táto funkcia zobrazí správu, ak „zlý používateľ“ neustále zadáva nesprávne údaje. Urobil som z toho funkciu, pretože ju používame dvakrát a len na skrátenie zdrojového kódu.

Riadok 7:
Keďže túto hlavičku používame aj dvakrát, urobil som z nej aj funkciu.

Riadok 8:
Odovzdajte prehliadaču hlavičku, ktorá prinúti používateľa zadať používateľské meno a heslo. Premenná $title sa zobrazí v prihlasovacom dialógu.

Riadok 9:
Pri prvej požiadavke sa zobrazí hlavička, pri opätovnom zrušení sa zobrazí hlásenie o odmietnutí prístupu.

Riadok 12:
$PHP_AUTH_USER je slučka, ktorá zobrazuje správu, že stránka je chránená a vypadnite!

Riadok 19-23:
Toto je niečo, čo nikto okrem vás nepozná, teda prostriedky na pripojenie k databáze, názov hostiteľa, názvy databáz, používateľské meno a heslo. (pre pripojenie MySQL)

Riadok 24:
Dopyt MySQL, ktorý vracia používateľské mená a heslá.

Riadok 25:
Vytvorte spojenie s MySQL a zobrazte prekliatie, ak nie je spojenie !!! (to znamená, že máte niečo nesprávne v riadkoch 19-23, alebo tam nie je vôbec žiadne MySQL)

Riadok 27:
Spracovať $query. Ak vráti hodnotu -0, znamená to, že bola zadaná neplatná kombinácia.

Riadok 33:
Odpojte pripojenie MySQL.

Odporučil by som uložiť PHP kód do súboru s názvom user_auth.php, user_auth.php3, alebo... (tu je vaša fantázia) Predpokladajme, že sme tento kód uložili do súboru user_auth.php. Kedykoľvek chceme náhle ochrániť našu prísne tajnú webovú stránku, jednoducho zahrnieme tento súbor. Jediná vec, ktorej chcem venovať pozornosť, je, že ju logicky musíte pripojiť úplne hore na chránenej stránke PHP, odporúčam vám napísať do riadku číslo 1 vašej stránky:

kde "user_auth.php" je názov súboru, pod ktorým ste uložili kód.

Vaša otázka je - nepoužívam MySQL, čo mám robiť?

Poraďte sa so správcom vášho servera, ak sa ukáže, že je láskavý, pomôže vám, pre neho je to 5 minút práce, ak ten zlý nepomôže, prejdite na fórum súvisiace s databázou, ktorú ste používať a kričať o pomoc! Alebo ak sa považujete za normálneho programátora, potom ... tento kód vôbec nepotrebujete a budete vytvárať „relácie“, šifrovať pomocou PGP a vo všeobecnosti zvrhnúť, ako keby ste robili ochranu pre amazon.com