Bezmocný auth php. Jak mohu použít HTTP Basic Authentication v PHP
Odeslání zprávy „Vyžadováno ověření“ do klientského prohlížeče, což zase způsobí zobrazení dialogového okna pro zadání uživatelského jména a hesla. Poté, co klient zadá své jméno a heslo, bude skript volán znovu, ale s předdefinovanými proměnnými PHP_AUTH_USER, PHP_AUTH_PW a AUTH_TYPE, které obsahují uživatelské jméno, heslo a typ autentizace. Tyto proměnné lze nalézt v poli $_SERVER a $HTTP_SERVER_VARS. V současné době je podporována pouze autentizace „Basic“. Můžete se také podívat na více podrobný popis funkcí záhlaví() .
Příklad fragmentu skriptu, který nutí klienta, aby se přihlásil k zobrazení stránky:
Příklad ověření HTTP
if (!isset($_SERVER [ "PHP_AUTH_USER" ])) ( Dobrý den ($_SERVER["PHP_AUTH_USER"]). Zadali jste své heslo ($_SERVER["PHP_AUTH_PW"]).
záhlaví( "WWW-Authenticate: Basic realm="My Realm"");
echo "Text odeslán, když
pokud uživatel klikl na tlačítko Zrušit";
výstup;
) jinak (
echo"
echo "
}
?>
Poznámka ke kompatibilitě: Buďte obzvláště opatrní při zadávání HTTP hlaviček. Pro zajištění maximální kompatibility s největší počet různé klienty, slovo "Základní" musí být napsáno s velká písmena"B", oblast (říše) musí být uzavřena ve dvojitých (nikoli jednoduchých!) uvozovkách a před kódem musí být právě jedna mezera 401 v názvu HTTP/1.0 401 .
Místo prostého zobrazení proměnných PHP_AUTH_USER a PHP_AUTH_PW na obrazovce možná budete muset zkontrolovat, zda jsou správné. Chcete-li to provést, použijte žádost o databáze nebo hledání uživatele v souboru dbm.
Můžete pozorovat rysy díla Internetový prohlížeč Badatel. Na parametry přenášených hlaviček je velmi vybíravý. Zadání názvu WWW-ověření před odesláním stavu HTTP/1.0 401 je malý trik.
Od PHP 4.3.0 se proměnné PHP_AUTH nenastavují, aby někdo nemohl napsat skript, který odhalí heslo pro stránku, která používá externí ověřování. tuto stránku používá externí ověřování a je nastaven na zabezpečený režim. Proměnnou REMOTE_USER však lze použít k ověření externě ověřeného uživatele. Vždy tedy můžete použít proměnnou $_SERVER["REMOTE_USER"].
Poznámka: PHP používá direktivu AuthType k označení, zda se používá externí autentizace nebo ne.
Je třeba poznamenat, že vše výše uvedené nezabrání krádeži hesel ke stránkám, které vyžadují autorizaci od někoho, kdo neoprávněně ovládá stránky umístěné na stejném serveru.
Jak Netscape Navigator, tak Internet Explorer po přijetí ze serveru vymažte mezipaměť ověřování aktuálního okna pro danou oblast (sféru). To lze použít k implementaci nucený odchod uživatele a znovu zobrazí dialogové okno pro zadání uživatelského jména a hesla. Někteří vývojáři to používají k časovému omezení přihlášení nebo k poskytnutí tlačítka pro odhlášení.
Příklad HTTP autentizace s vynuceným vstupem nový pár přihlašovací jméno/heslo
function authenticate() (
záhlaví( "WWW-Authenticate: Basic realm="Test Authentication System"");
header("HTTP/1.0 401 Unauthorized");
echo "Abyste získali přístup ke zdroji, musíte zadat správné uživatelské jméno a heslo \n";
výstup;
}
If (!isset($_SERVER [ "PHP_AUTH_USER" ]) || Vítejte: ($_SERVER["PHP_AUTH_USER"])
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
ověřit ();
}
jiný(
echo"
"
echo "Předchozí přihlášení: ($_REQUEST["OldAuth"])";
echo ";
echo "\n";
echo "\n";
echo "\n";
echo"
}
?>
Toto chování není řízeno základními autentizačními standardy HTTP, takže byste na něm neměli záviset. Testy ukázaly, že prohlížeč Lynx nevymaže autorizační mezipaměť při příjmu stavu 401 ze serveru a postupným kliknutím na „Zpět“ a poté na „Vpřed“ je možné takovou stránku otevřít za předpokladu, že požadovaná autorizace atributy se nezměnily. Uživatel však může stisknutím klávesy "_" vymazat mezipaměť ověřování.
Je třeba také poznamenat, že dříve verze PHP 4.3.3, HTTP autentizace nefungovala na běžících serverech spravované společností Microsoft IIS, pokud byl PHP nainstalován jako modul CGI kvůli některým omezením IIS. Aby bylo dosaženo správné fungování v PHP 4.3.3+ byste měli upravit nastavení konfigurace Služba IIS se nazývá „Zabezpečení adresáře“. Klikněte na nápis „Upravit“ a nastavte možnost „Anonymní přístup“, všechna ostatní pole by měla zůstat nezaškrtnutá.
Další omezení, pokud používáte IIS přes ISAPI: proměnné PHP_AUTH_* nejsou definovány, ale zároveň je k dispozici proměnná HTTP_AUTHORIZATION. Příklad kódu, který můžete použít: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));
Poznámka k IIS:: Aby ověřování HTTP fungovalo správně ve službě IIS, v Konfigurace PHP Volba cgi.rfc2616_headers musí být nastavena na 0 (výchozí hodnota).
Pozor: V případě použití chráněného režimu bude UID aktuálního skriptu přidáno do sféry části hlavičky WWW-Authenticate.
<<< Назад | Obsah | Vpřed >>> |
Pokud máte nějaké další otázky nebo vám něco není jasné - vítejte u nás | |
|
Někdy je potřeba zavřít neoprávněný přístup PHP stránku, pokud vytváříte uzavřenou oblast webu. Může to být nějaký druh skryté informace pro vaše klienty nebo návštěvníky webu nějaké administrační rozhraní pro vás atd. Můžete přijít na stovky různé úkoly vyžadující omezení přístupu.
Takovou stránku můžete zavřít několika doplňkovými způsoby:
- Ochrana heslem (login/heslo) pomocí proměnných $_SERVER["PHP_AUTH_USER"] A $_SERVER["PHP_AUTH_PW"].
- Ochrana od IP adresa klienta pomocí proměnné $_SERVER["REMOTE_ADDR"].
- Ochrana od MAC adresy v lokálních sítích (kromě ochrany pomocí IP).
Podívejme se nejprve na první metodu, která je hlavní. Umožňuje zablokovat přístup na stránku pomocí přihlašovacího jména a hesla, takže přístup mohou získat pouze lidé kteří znají přihlášení a heslo. Kromě toho mohou být rozděleny podle tohoto kritéria a podle toho vydávány různé informace pro všechny. Implementováno vydáním speciálních polí v záhlaví protokolu HTTP. Vytvořme funkci auth_send():
" ,"
Chyba ověření
" ,"Chcete-li získat přihlašovací jméno a heslo, kontaktujte správce.
" ","; ukončení; ); ?>Tato funkce informuje prohlížeč, že přístup vyžaduje autorizaci pomocí přihlašovacího jména a hesla. A také zobrazí stránku v HTML pro uživatele.
" ,"
Vítejte!
" ,"Jste přihlášeni pomocí přihlašovacího jména ",$auth_user," a hesla ",$auth_pass,".
" ,""; ?>
Kód pro ověření přihlašovacího jména a hesla není příliš složitý v tomto případě, protože je realizován pro jednu osobu. Provozní logika je jednoduchá, pokud neexistuje žádná proměnná $_SERVER["PHP_AUTH_USER"] A $_SERVER["PHP_AUTH_PW"] nebo jejich hodnoty neodpovídají požadovaným, pak zavolejte funkci auth_send(). Nezapomeňte, že na konci zavolá výstup, takže provádění programu se zastaví.
Další úroveň ochrany je realizována filtrováním IP adresy připojujícího se klienta. Samozřejmě, na internetu, mnoho poskytovatelů problém IP dočasné adresy a tato ochrana je k ničemu, ale kdyby mluvíme o tom o podnikových lokálních sítích tuto kontrolu poskytne dodatečnou ochranu.
Vaše IP nebyla nalezena!!!"; exit; ); ?>
Tady v řadě $allowed_ips označeny oddělenými mezerami IP adresy, na které je povolen přístup. Dále získáme pole pomocí explodovat() a vyhledejte adresu klienta z $_SERVER["REMOTE_ADDR"]. Použil jsem funkci k vyhledávání array_search(), protože je nepravděpodobné, že jeho kód implementovaný v C bude fungovat poněkud rychleji, než do kterého můžeme zapisovat PHP pomocí smyček pro nebo foreach. Ale rychlost není to hlavní :)
A posledním krokem ochrany je ověření MAC adresy. Je klasifikován jako paranoidní a měl by být použit, pokud přistupujete z místní síť a data, která chráníte, jsou opravdu velmi důležitá. Tuto kontrolu jsem zatím implementoval pouze na systému Linux, kvůli relativní jednoduchosti implementace. Ale můžete to zkusit implementovat pro jakoukoli jinou platformu. Napíšeme funkci:
Jak již uživatelé Linuxu pochopili, je založen na ARP systémovou tabulku, ke které lze přistupovat pomocí souboru /proc/net/arp. Funkce hledá požadované řetězce IP adresu a vrátí ji MAC adresa:
Vaše IP=192.168.10.15 a MAC=00:04:31:E4:F8:37
V systému Windows Možná existuje také několik způsobů, jak se dostat MAC jednodušší, ale z těch, které skutečně fungují, je tento závěr ARP systémové tabulky s příkazem:
C:\WINDOWS\>arp -a Rozhraní: 192.168.10.15 na rozhraní 0x1000003 IP adresa Fyzická adresa Typ 192.168.10.1 00-50-22-b0-6a-aa dynamický 192.168.10.2 00-0f-38-68-e9-e8 dynamický 192.168.10.3 00-04-61-9e-150609 dynamický -0f-38-6a-b1-18 dynamický
Ochranu založenou na této adrese si můžete implementovat sami, pokud ji opravdu potřebujete :) Ale pamatujte si, že pokud máte v síti nespravované zařízení bez možnosti vazby MAC adresy na port, tato ochrana nemusí fungovat, protože všechny vaše identifikační údaje používané k ochraně (login, heslo, IP a MAC adresa) mohou být zfalšovány.