• Borovský index uživatel php. Sezení v PHP. Schéma databáze

    Od samého začátku všichni přijali PHP s nádechem, ale jakmile začaly v tomto jazyce vznikat poměrně velké projekty, vývojáři stáli před novým problémem – PHP postrádalo koncept globálních proměnných! To znamená, že byl proveden určitý skript, vygenerovaná stránka byla odeslána klientovi a všechny prostředky používané tímto skriptem byly zničeny. Pokusím se ilustrovat: předpokládejme, že jeden web má dvě stránky, index.php a dothings.php. Zdroje těchto stránek vypadají takto:

    index.php dothings.php

    Pokud spustíme tyto dva skripty, tak na první stránce uvidíme nápis „Byl jsem přiřazen k index.php“ a druhá stránka bude prázdná.

    Vývojáři webových stránek bez přemýšlení začali používat soubory cookie k ukládání globálních proměnných na straně klienta. Proces vypadal asi takto: uživatel přijde na hlavní stránku webu, provede nějaké akce a všechny informace spojené s tímto uživatelem, které mohou být potřeba na jiných stránkách webu, budou uloženy v jeho prohlížeči ve formě souborů cookie. Tato metoda má docela vážné nevýhody, kvůli kterým se mnoho vývojářů najednou odklonilo od PHP. Potřebujeme například autorizovat uživatele, abychom mu umožnili přístup do soukromých (nebo soukromých) částí webu. Budete muset uživateli odeslat cookie, která bude sloužit jako jeho následný identifikátor na stránce. Tento přístup se stává velmi těžkopádným a nepohodlným, jakmile web začne shromažďovat stále více informací o chování uživatele, protože je vhodné všechny informace odesílané uživateli zakódovat, aby nemohly být zfalšovány. Zrovna nedávno bylo pomocí falšování cookies možné „rozlousknout“ více než jeden chat a někdy se dokonce vplížit do pošty někoho jiného. Navíc jsou na světě stále podivní lidé, jejichž prohlížeč nepodporuje cookies.

    Nebudu se zabývat technologickými otázkami mechanismu session, ale pouze popíšu, jak správně pracovat s sessions v PHP.

    Jak pracovat se sezeními?

    Pokud otestujete příklady z článku (nebo své skripty) na jakémkoli komerčním hostingu, neměly by být s prací s relacemi žádné problémy. Pokud si server nastavíte sami (ať už se jedná o skutečný server nebo emulátor), mohou se objevit chyby s něčím takovým:

    "Varování: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) se nezdařilo: Žádný takový soubor nebo adresář (2)."

    To jen znamená, že vaše PHP je nakonfigurováno nesprávně. Tento problém můžete vyřešit zadáním správné cesty (k existujícímu adresáři) pro ukládání relací do souboru php.ini a restartováním serveru.

    Každý skript, který bude používat proměnné (data) z relací, musí obsahovat následující řádek:

    Session_start();

    Tento příkaz říká serveru, že daná stránka potřebuje všechny proměnné, které jsou přidruženy k danému uživateli (prohlížeči). Server vezme tyto proměnné ze souboru a zpřístupní je. Je velmi důležité otevřít relaci před odesláním jakýchkoli dat uživateli; v praxi to znamená, že je vhodné volat funkci session_start() hned na začátku stránky, například takto:

    Session_start(); ?> ... Pro nastavení adresáře, do kterého se budou soubory relace ukládat, použijte funkci session_save_path(): session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

    Po zahájení relace můžete nastavit globální proměnné.

    Při přiřazení libovolné hodnoty libovolnému poli pole $_SESSION se proměnná se stejným názvem automaticky zaregistruje jako proměnná relace.

    Toto pole je dostupné na všech stránkách využívajících relaci. Podívejme se například na program:

    index.php Vše je v pořádku. Relace byla načtena!

    Pojďme to projít a podívat se, co tam je: dothings.php

    Při postupném spouštění těchto souborů vytvoří první skript „index.php“ následující výsledek:

    Vše je v pořádku. Relace byla načtena! Pojďme to projít a podívat se, co tam je:

    A druhý „dothings.php“ je toto:

    • Byl jsem požádán o index.php
    • Proměnná $a je nyní dostupná na všech stránkách daného webu, které zahájily relace.
    • Další užitečné funkce a techniky pro práci s relacemi:
    • unset($_SESSION["a"]) - relace „zapomene“ hodnotu zadané proměnné relace;
    session_destroy() - relace je zničena (například pokud uživatel opustil systém kliknutím na tlačítko "odhlásit");

    Nyní přejděme k praktické aplikaci mechanismu relace. Zde se podíváme na pár docela jednoduchých a zároveň užitečných příkladů.

    Autorizace uživatele

    Otázky týkající se autorizace uživatelů pomocí PHP relací jsou neustále kladeny na webových programovacích konferencích. Mechanismus pro autorizaci uživatelů v systému pomocí relací je z bezpečnostního hlediska docela dobrý (viz sekce).

    Náš příklad se bude skládat ze tří souborů: index.php, authorize.php a secretplace.php. Soubor index.php obsahuje formulář, kam uživatel zadá své uživatelské jméno a heslo. Tento formulář předá data souboru authorize.php, který, pokud je autorizace úspěšná, umožní uživateli přístup k souboru secretplace.php a v opačném případě zobrazí chybovou zprávu.

    Příklady: index.php Zadejte heslo Přihlášení:
    Heslo:
    autorizovat.php Zadali jste špatné heslo!

    secretplace.php Dobrý den, jste na tajné stránce!!! :)

    Bezpečnost

    • Jsme tedy schopni předat identifikátor z jedné stránky (PHP skript) na druhou (až do dalšího volání z našeho webu), což znamená, že dokážeme rozlišit všechny návštěvníky webu. Vzhledem k tomu, že identifikátor relace je velmi velké číslo (128 bitů), není prakticky žádná šance, že by jej bylo možné najít hrubou silou. Útočníkovi tedy zbývají následující možnosti:
    • v počítači uživatele je trojský kůň, který krade čísla relací;
    • útočník zachycuje provoz mezi počítačem uživatele a serverem. Samozřejmostí je bezpečný (šifrovaný) protokol SSL, ale ne každý jej používá;

    Soused přistoupil k počítači našeho uživatele a ukradl číslo relace.

    Takové situace, založené na tom, že někdo někomu něco ukradne, obecně nejsou v kompetenci programátora. O to by se měli postarat sami administrátoři a uživatelé.

    • PHP se však dá velmi často „ošálit“. Podívejme se na možné body hackingu v programu autorizace uživatelů:
    • Soubor authorize.php je pokus uhodnout heslo pomocí skriptu třetí strany;
      Soubor secretplace.php je pokus o oklamání programu zadáním hodnot proměnné $logged_user do adresního řádku prohlížeče, například takto:

    "http://www.yoursite.ru/secretplace.php?logged_user=hacker"

    V našem programu jsou tedy jasně viditelné dvě „díry“, jedna je malá a není nijak zvlášť nápadná, ale druhá je prostě obrovská, přes kterou se většina hackerů dostane tam, kam nepotřebuje.

    Nebudeme psát tuny kódu pro zablokování IP adresy atd., ale jednoduše zkontrolujte, odkud požadavek pochází, respektive z jaké stránky požadavek přišel, pokud je to jakákoli stránka z našeho webu, pak je vše v pořádku, ale v všechny ostatní případy vás dovnitř nepustíme. Upravme soubor authorize.php:

    authorize.php V2 Zadali jste špatné heslo!
    Jak se zbavit "díry" číslo 2?

    Řekněme, že máte webovou stránku, kde se může každý zaregistrovat a přispívat do fóra.

    Přirozeně, ve fóru mají někteří uživatelé (administrátoři, moderátoři) více příležitostí než jiní, například mohou mazat zprávy od jiných uživatelů; Úroveň přístupu uživatele ukládáte do relace, do proměnné $user_status, kde $user_status = 10 odpovídá plnému přístupu do systému. Útočník, který přijde na stránku, se stačí zaregistrovat normálním způsobem a poté přidat ?user_status=10 do adresního řádku prohlížeče.

    Takže máte nového admina na vašem fóru!

    V zásadě lze libovolnou proměnnou skriptu nastavit přes adresní řádek jednoduchým přidáním otazníku a názvu proměnné s její hodnotou za úplnou adresu do skriptu. Opravme náš kód, abychom tomu zabránili:

    secretplace.php V2 Dobrý den, jste na tajné stránce!
    Výsledky
    Mechanismus relace je docela dobrá vlastnost jazyka PHP. Relace jsou jednoduché a velmi flexibilní k použití. Mimochodem, existuje jedna, málo zdokumentovaná vlastnost PHP sessions (dostupná od verze 4.0.3) - v sessions můžete ukládat nejen proměnné, ale i objekty.

    Příklady ?>
    // Automaticky vložit SID do odkazů. ini_set("session.use_trans_sid", true); session_start(); ?> Klikněte zde!