Aktivujte zvažovanie php. Ako si vytvoriť vlastnú registračnú stránku na multisite WordPress

Zaregistruje funkciu, ktorá sa spustí, keď je doplnok aktivovaný.

Táto funkcia pripája uvedenú funkciu spätného volania k háku activ_ (plugin) a je obalom okolo tohto háčika.

(plugin) v háku activ_ (plugin) je nahradený názvom relatívneho pluginu k hlavnému súboru doplnku. Ak sa napríklad nachádza doplnok: wp-content / plugins / sampleplugin / sample.php, názov háčika bude: activate_sampleplugin / sample.php.

Od verzie 3.1. háčik sa odpaľuje iba počas aktivácie doplnku a nespúšťa sa počas automatická aktualizácia zapojiť.

Ako to funguje

Plugin je aktivovaný funkciou activ_plugin (), v ktorej sa aktivuje háčik activate_ (plugin).

Funkcia activate_plugin () v jadre sa volá po načítaní prostredia VI. Táto funkcia spája hlavný súbor doplnku (a všetko, čo je v ňom uvedené) a potom prostredníctvom háku aktivuje uvedenú funkciu spätného volania. Z tohto dôvodu sú všetky funkcie a triedy doplnku k dispozícii v našej funkcii spätného volania. Pretože však všetky hlavné háčiky WP už fungovali počas načítania prostredia VI, nebudú po pripojení hlavného súboru doplnku už spustené žiadne udalosti doplnkov zavesené na hákoch, napríklad plugins_loaded. To znamená, že náš doplnok bude pripojený, ale nie úplne: nie tak, ako by mal byť pripojený, keď je už aktivovaný.

Ak napríklad doplnok urobí niečo počas udalosti plugins_loaded, všetky tieto akcie sa jednoducho nestanú, keď je doplnok aktivovaný. Ak napríklad pripojí prekladový súbor, potom sa prekladový súbor nepripojí v okamihu, keď sa spustí funkcia spätného volania špecifikovaná pre register_activation_hook ().

Po spustení funkcie spätného volania spravidla dôjde k 2 udalostiam, na ktoré môžete zavesiť funkcie: activated_plugin a vypnutie.

Ak chcete pri aktivácii doplnku urobiť niečo výnimočné, pozrite si príklad 5.

Podmienky používania

Táto funkcia nebude fungovať, ak ju zavoláte v momente, keď sa spustí háčik, napríklad plugins_loaded, init. Funkciu je potrebné vyvolať priamo z hlavného súboru doplnku. Aktivačné pravidlá:

    register_activation_hook () by sa malo volať z hlavného súboru doplnku, kde sa nachádza smernica Plugin Name: ..., a nemalo by sa volať zo žiadneho háčika, ako napríklad plugins_loaded alebo init.

    Funkcia hook musí byť v rovnakom súbore ako hook alebo musí byť zahrnutá vopred z iného súboru.

    Vo funkcii hook nefunguje ozvena. Pretože existuje presmerovanie a neuvidíte ozvenu. Ale die () sa dá použiť.

  1. Globálne premenné (ak existujú) musia byť definované explicitne, aby boli prístupné z funkcie hook.

Poznámka k variabilnému rozsahu pôsobnosti

Keď je doplnok aktivovaný, hlavný súbor doplnku nie je zahrnutý v globálnom rozsahu, ale vo funkcii activate_plugin (). Preto sú premenné, ktoré sú v normálny režim práce s doplnkami sú považované za globálne, nebudú globálne.

Napríklad funkcia, ktorá sa používa v register_activation_hook (), nemusí vidieť globálne premenné, aj keď ste ich v tejto funkcii deklarovali ako globálne. Príklad:

$ myvar = "niečo"; register_activation_hook (__ FILE__, "myplugin_activate"); funkcia myplugin_activate () (global $ myvar; echo $ myvar; // Premenná sa nerovná „niečomu“)

Z dôvodu tejto funkcie musia byť globálne premenné vždy špecifikované explicitne. Všetky globálne premenné musia byť definované ako globálne, aj keď je premenná uvedená v tele doplnku. Iba v tomto prípade k nim bude prístup kdekoľvek. Príklad:

Globálny $ myvar; // výslovne uvádzame, že ide o globálnu premennú $ myvar = "niečo"; register_activation_hook (__ FILE__, "myplugin_activate"); funkcia myplugin_activate () (global $ myvar; echo $ myvar; //> niečo)

Neexistujú žiadne háčiky.

Vráti sa

nulový. Nič nevracia.

Použitie

register_activation_hook ($ súbor, $ funkcia); $ súbor (reťazec) (povinné) Cesta k hlavnému súboru php doplnku vrátane názvu samotného doplnku. Obvykle sa používa magická konštanta PHP __FILE__. $ funkcia (reťazec / pole / lambda) (povinné)

Názov funkcie spätného volania. Pre triedy použite pole: pole ($ this, "názov_funkcie"); ...

Funkcia dostane booleovskú premennú $ network_wide - či je doplnok pri viacerých lokalitách aktivovaný pre celú sieť stránok.

Príklady

#1. Spustenie funkcie pri aktivácii doplnku

Predpokladajme, že v hlavnom súbore doplnku máme funkciu my_plugin_activate (): wp-content / plugins / myplugin / myplugin.php, potom na spustenie tejto funkcie počas aktivácie doplnku použite nasledujúci kód:

Register_activation_hook (__ FILE__, "my_plugin_activate"); function my_plugin_activate () (// Aktivačný kód ...)

# 2. Spustenie triednej metódy

Ak doplnok používa Trieda PHP, aktivačný kód sa pridá takto:

Register_activation_hook (__ FILE__, pole („My_Plugin“, „install“)); class My_Plugin (static function install () (// Nevytvárajte tu žiadny výstup ...))

# 3. Spustenie metódy triedy zo samostatného súboru

Ak je trieda, ktorá obsahuje aktivačnú funkciu, v samostatný súbor, potom zaregistrujte aktivačnú funkciu takto:

Include_once __DIR__. "/class-My_Plugin.php"; register_activation_hook (__ FILE__, pole ("My_Plugin", "on_activate_function"));

#4. Spustenie metódy triedy zo samotnej triedy

Ak sa nachádzate vo vnútri __construct (). Dôležité je, že __FILE__ sa musí „pozrieť“ na hlavný súbor doplnku:

Register_activation_hook (__ FILE__, pole ($ this, „YOUR_METHOD_NAME“));

# 5 Urobte niečo hneď po aktivácii doplnku

Po aktivácii doplnku sa spustia iba dva háčiky: activated_plugin a vypnutie.

Keď potrebujete niečo urobiť ihneď po aktivácii doplnku, môžete k nim pripojiť funkciu.

Ak takéto riešenie nefunguje, môžete použiť možnosti WP: uložiť údaje do možnosti a potom ju vyhľadať a podľa možnosti niečo urobiť:

// Hlavný súbor doplnku. ... funkcia my_plugin_activate () (// pridajte voľbu, aby neskôr, ak existuje človek, ktorý by mal niečo urobiť. add_option ("Activated_Plugin", "Plugin-Slug"); // Tu je aktivačný kód ...) register_activation_hook ( __ FILE__, "my_plugin_activate"); funkcia load_plugin () (if (is_admin () && get_option ("Activated_Plugin") == "Plugin-Slug") (// odstráňte pridanú možnosť, aby už nefungovala // a robte, čo potrebujeme ... delete_option ( "Actived_Plugin"); // Urobte niečo raz, po aktivácii pluginu // Napríklad: add_action ("init", "my_init_function");)) add_action ("admin_init", "load_plugin");

Ďalšou možnosťou, ako urobiť niečo počas aktivácie doplnku, je vytvoriť udalosť takto:

Funkcia my_plugin_activate () (// Nainštalujte si vlastný háčik, aby ste sa k nemu mohli pripojiť zo súborov samotného pluginu do_action („my_plugin_activate“);) register_activation_hook (__ FILE__, „my_plugin_activate“);

# 6 Ďalšia ukážka používania funkcie

Malý doplnok, ktorý ukazuje, ako používať túto funkciu:

/ * Plugin Name: A Test Description: A Test * / require_once dirname (__ FILE__). "/my_other_file.php"; / * Tento kód nebude fungovať. Aktivačný hák musí byť vyvolaný z hlavného súboru. register_activation_hook (dirname (__ FILE__). "/my_other_file.php", "my_other_function"); * / // Toto je pracovný kód. register_activation_hook (__ FILE__, "test_activated"); / * Toto je správny spôsob deklarovania globálnych premenných a prístupu k nim. Globálne premenné musia byť jasne deklarované. Bez toho k nim nebudete mať prístup. * / global $ some_var; $ some_var = "ahoj"; // Funkcia aktivačnej funkcie test_activated () (// tu $ some_var sa nebude rovnať hej globálnej $ some_var; // A tu $ some_var sa bude rovnať hej // Táto funkcia je definovaná v súbore "my_other_file.php" my_other_function (); / * Toto nebude fungovať. Ak potrebujete zapisovať protokoly do dočasného súboru, použite príkaz fopen / fwrite. Ak chcete otestovať, či aktivačný háčik funguje, použite funkciu exit () vo vnútri funkcie hook. * / echo „test_actived called!“;)

Vytvárame vlastnú registračnú stránku pre multisite namiesto štandardného wp-signup.php.

V. normálna inštalácia Stránka WordPress registrácia (autorizácia, reset hesla) vydá súbor wp-login.php.

  • /wp-login.php - autorizácia
  • /wp-login.php?action=register - registrácia
  • /wp-login.php?action=lostpassword - obnovenie hesla

Na serveri wp-login.php existujú samostatné podmienky pre viacnásobné umiestnenie. Keď teda kliknete na odkaz /wp-login.php?action=register na viacstránke, WordPress vás presmeruje na stránku /wp-signup.php. V mnohých témach stránka nevyzerá veľmi atraktívne, takže si vytvoríme vlastnú.

Hlavná stránka siete

V predvolenom nastavení WordPress otvára registračnú stránku (wp-signup.php) v hlavnej doméne (webe) siete. Je však možné vytvoriť samostatnú registračnú stránku pre každú stránku v sieti, aj keď majú rôzne témy. Zoberieme do úvahy prípad, keď všetky weby v sieti majú vlastnú registračnú stránku, ale používa sa rovnaká téma a weby sa líšia iba jazykom. Ak sa používajú rôzne témy, bude potrebné napísať viac kódu.

functions.php?

Nie Zdá sa, že názov tohto súboru je uvedený v každom článku WordPress. V našom prípade, vzhľadom na to, že registračná funkcia je navrhnutá pre niekoľko stránok, má zmysel presunúť ju do doplnkov MU, ktoré sa načítajú pri otvorení akejkoľvek stránky.

Lyrická odbočka

Stojí za zmienku, že doplnky MU sa načítavajú skôr ako bežné doplnky a pred úplným načítaním jadra WordPress, takže volanie niektorých funkcií môže viesť k fatálnym chybám v PHP. Toto „rané“ načítanie má tiež svoje výhody. Napríklad v rámci akejkoľvek témy nemôžete lipnúť na niektorých akciách, ktoré sú spustené ešte pred načítaním súboru functions.php z témy. Príkladom toho sú akcie z pluginu Jetpack v tvare jetpack_module_loaded_related-posts (related-posts-názov modulu), pomocou ktorých je možné sledovať aktivitu modulov v Jetpack. K tejto akcii nie je možné „priľnúť“ zo súboru tém, pretože akcia už bola spustená pred načítaním témy - pred témami sa načítajú doplnky. Môžete sa pozrieť na všeobecný obraz o poradí načítania WordPress na stránke Action Reference v kódexe.

Poradie súborov

Doplnky MU môžu obsahovať ľubovoľný počet súborov a akúkoľvek štruktúru, ktorá sa vám zdá logická. Držím sa niečoho ako táto hierarchia:

| -mu -pluginy | - | -load.php | - | - | -selena -network | - | - | - | -prihlasovanie | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php

Všetky potrebné „doplnky“ pre našu sieť sú pripojené k súboru load.php:

// Načítanie traslatov pre všetky doplnky load_muplugin_textdomain ("selena_network", "/ selena-network/ languages/"); // Sieťová registrácia vyžaduje WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Ďalšie doplnky // vyžadujú WPMU_PLUGIN_DIR ...

Vo vnútri priečinka selena-network sú uložené priečinky doplnkov, z ktorých každý má svoj vlastný plugin.php, ktorý zahrnujeme do súboru load.php. To vám dáva flexibilitu a schopnosť rýchlo veci vypnúť a zapnúť.

Adresa registračnej stránky

Na zadanie adresy registračnej stránky sa používa filter wp_signup_location. Nachádza sa v súbore wp-login.php a je zodpovedný za presmerovanie na wp-signup.php.

Prípad "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php")))); exit;

Pridajte svoju funkciu do mu-plugins / selena-network / signup / plugin.php, čím sa vráti adresa registračnej stránky na aktuálnom webe:

Funkcia selena_network_signup_page ($ url) (návrat home_url (). " / Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network je predpona, ktorú používam v názvoch všetkých funkcií v doplnkoch MU na svojom webe, aby som predišiel kolíziám, mala by byť nahradená mojou vlastnou jedinečnou predponou. Filter má prioritu 99, pretože niektoré doplnky ako bbPress a BuddyPress môžu túto adresu URL prepísať vlastnou (doplnky MU sa načítajú skôr ako bežné doplnky, pozri vyššie). Všimnite si toho, že home_url () sa používa namiesto network_site_url () na udržanie návštevníka na tej istej doméne. Ako adresu je možné použiť ľubovoľnú adresu URL.

Vytvorte stránku

Teraz vytvoríme stránku s adresou site.com/signup/ prostredníctvom pravidelného rozhrania a v priečinku s podradenou témou je šablónou pre našu novú stránku page-signup.php. Namiesto slova „registrácia“ je možné použiť jedinečný identifikátor.

Vo vnútri novej šablóny musíte zavolať funkciu selena_network_signup_main (), ktorá zobrazí registračný formulár.

Stojí za zmienku, že celý proces so šablónami nie je potrebný a namiesto toho si môžete vytvoriť svoj vlastný krátky kód, ktorý bude volať aj funkciu selena_network_signup_main ().

wp-signup.php a wp-activate.php

Teraz začneme vytvárať funkciu, ktorá zobrazí registračný formulár. Za týmto účelom skopírujte súbory wp-signup.php a wp-activ.php z koreňa WordPress do mu-plugings / selena-network / signup / (a ​​nezabudnite ich pripojiť do mu-plugins / selena-network / signup / plugin.php) ... Ďalšie manipulácie so súbormi sú extrémne náročné a časovo náročné na opis, takže ich budete musieť urobiť sami. Popíšem iba, čo presne je potrebné urobiť a zverejním zdrojové súbory svojho projektu:

  1. Na začiatku súboru odstráňte všetky funkcie require, volania funkcií a ďalší kód mimo funkcií.
  2. Premenujte všetky funkcie pridaním jedinečných predpon k menám.
  3. Spodnú časť kódu wp-signup.php zabaľte do funkcie selena_network_signup_main a na začiatku napíšte globálne $ active_signup; ...
  4. Vymeňte rozloženie za svoje na správnych miestach.

Vo wp-activ.php musíte urobiť približne to isté:

  1. Odstráňte všetok kód mimo funkcií, zabaľte rozloženie do samostatnej funkcie.
  2. V prípade potreby zmeňte rozloženie.

Súbor wp-activate.php je zodpovedný za stránku aktivácie účtu. Rovnako ako pre registračnú stránku, musíte pre ňu vytvoriť samostatnú šablónu, v ktorej zavoláte funkciu zo súboru wp-activate.php.

Posielame aktivačné listy

Registračná stránka pošle návštevníkovi e -mail s odkazom na aktiváciu jeho účtu. Štandardne to robí funkcia wpmu_signup_user_notification () zo súboru ms-functions.php. Jeho funkčnosť si môžete pre svoju funkciu požičať. Dôvodom, prečo prestať používať túto funkciu, je to, že odosiela odkaz na aktiváciu účtu z wp-activate.php. Túto funkciu môžete "deaktivovať" pomocou filtra wpmu_signup_user_notification, pričom na ňom uvediete nepravdu (ak to neurobíte, aktivačný list bude odoslaný dvakrát, v skutočnosti však dve rôzne písmena).

Funkcia armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta = array ()) (// ... // Kód z funkcie wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ správa), $; return false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Výsledkom je, že registračná stránka v téme Selena vyzerá oveľa čistejšie a presnejšie.

Záver

Existuje mnoho ďalších, nie príliš správnych spôsobov, ako urobiť to isté na internete - presmerovania Apache, formuláre AJAX, ktoré nebudú fungovať bez Java Scriptu atď. Toto všetko sa mi nepáčilo, takže som sa pokúsil urobiť to na svojom počítači čo najpresnejšie vlastný web.

Súbory by ste mali upravovať opatrne a snažiť sa veľmi neodchyľovať od originálu, aby v budúcnosti, ak WordPress zmení súbory wp-signup.php a wp-activate.php, bolo jednoduchšie ich porovnať a nájsť. zmeny.

Nezabudnite sa pozrieť zdroj všetky funkcie popísané vyššie, aby ste úplne pochopili, čo a ako sa deje v kóde.

Bonus. Ochrana proti spammeru

Aj tie najmenšie stránky WordPress podliehajú častej registrácii nevyžiadanej pošty. Môžete písať nekonečné podmienky na filtrovanie robotov, často skôr ako pokúšať sa vytvoriť umela inteligencia🙂 V prípade multisite mi dosť pomohlo obvyklé presmerovanie v Apache, s ktorým som pri otváraní /wp-signup.php a /wp-acitvate.php požiadal o 404 (nie som odborník na konfigurácia Apache takže moje pravidlá nemusia byť veľmi správne).

RewriteEngine na serveri RewriteBase / RewriteRule ^ wp -signup \ .php - RewriteRule ^ wp -activate \ .php - # ZAČAŤ WordPress # Štandardne sa nedotýkajte pravidiel WordPress :) # ... # END WordPress

P. S. Snažím sa čo najpodrobnejšie popísať niektoré veci tretích strán, pretože keď som začínal, niekedy nebol nikto, kto by mnohé veci vyzýval a vysvetlil. Tiež verím, že také malé tipy na ďalšie materiály prinútia niekoho naučiť sa niečo nové a rozšíria svoju oblasť znalostí. V položkách RewriteRule sa používajú regulárne výrazy, ktoré nie sú vôbec zložité, napríklad znak ^ znamená začiatok riadka.

Umožňuje vám použiť jednu inštaláciu WordPress pre viacero webov súčasne. Každý web zároveň dostane do databázy svoje vlastné tabuľky s jedinečnou predponou.

Tabuľky s údajmi registrovaných používateľov sú spoločné pre všetky weby v sieti. Toto je jednoznačné plus a registráciou získate prístup na niekoľko stránok. Na každom webe môže mať ten istý účet odlišné práva. Na jednom webe môže byť napríklad používateľ editorom a na druhom správcom.

Pri typickej inštalácii WordPress vygeneruje stránka registrácie, prihlásenia a resetovania hesla súbor wp-login.php.

  • wp -login.php - autorizácia
  • wp -login.php? action = register - registrácia
  • wp -login.php? action = lostpassword - reset hesla

V režime viacerých stránok sa jadro WordPress začne správať trochu inak a keď kliknete na odkaz wp-login.php? Action = register, dôjde k presmerovaniu na wp-signup.php. Toto je stránka registrácie pre vašu sieť, ktorú má WordPress v predvolenom nastavení.

Okrem registrácie bežných používateľských účtov na nich môžete vytvoriť aj novú webovú stránku, ak super administrátor povolil túto funkciu v nastaveniach siete (Network Admin → Settings → Network Settings).

Registračná stránka vo väčšine tém nevyzerá veľmi dobre. Mnoho vzhľadov používa CSS rámce ako Bootstrap a ich vlastné špecifické triedy na štylizáciu rôznych prvkov na stránkach, takže je ťažké napísať jeden HTML, ktorý funguje pre každého.

Nezúfajte však, ak stránka vyzerá neupravene. Súbor wp -signup.php je spočiatku skvelá vec, keď nie je čas zaoberať sa každým detailom stránky - môžete sa viac zamerať na ostatných dôležité stránky a obsahu.

Keď ste pripravení vytvoriť si vlastnú registračnú stránku, wp-signup.php bude dobrou ukážkou a príkladom, ktorý vám pomôže porozumieť rozsahu funkcií, ktoré WordPress poskytuje na spracovanie a overovanie vstupu používateľov a vytváranie nových účtov.

Hlavná stránka siete

V predvolenom nastavení WordPress otvára registračnú stránku (wp-signup.php) v hlavnej doméne (webe) siete. Registračné stránky však môžete vytvoriť pre každý web v sieti, aj keď majú tému.

Zvážime prípad, keď všetky weby v sieti používajú rovnakú tému, ale každá z nich má registračnú stránku. Stránky sa líšia jazykom (angličtina a ruština), takže registračná stránka sa zobrazí v „rodnom“ jazyku stránok. Ak weby používajú rôzne témy, všetko bude závisieť od toho, o aké témy ide, či im vyhovuje rovnaké rozloženie (vynikajúca situácia, ktorá vás môže prinútiť zjednotiť všetky vaše témy) alebo či sa oplatí vypracovať stránky jednotlivo.

Alternatíva k functions.php

Poradie súborov

Doplnky MU môžu obsahovať ľubovoľný počet súborov a štruktúru, ktorá sa vám zdá logická. Držím sa niečoho ako táto hierarchia:

| mu-pluginy | | load.php | | selena-network | | | registrácia | | | | plugin.php | | | ... | | | jetpack | | | | plugin.php

Súbor load.php obsahuje preklady a všetky potrebné „doplnky“:

// Načítanie prekladov pre doplnky MU load_muplugin_textdomain ("selena_network", "/ selena-network/ languages/"); // Funkčné pre registračnú stránku vyžadujú WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Ďalší doplnok // vyžaduje WPMU_PLUGIN_DIR ...

Vnútri adresára selena-network sú priečinky doplnkov. Každý má svoj vlastný plugin.php, ktorý zahrnujeme do súboru load.php. To dáva flexibilitu a schopnosť v prípade núdze okamžite deaktivovať a povoliť jednotlivé komponenty vo fungujúcom projekte.

Registračná stránka

Keď sme zistili, kde a ako napíšeme kód, môžeme pristúpiť k vytvoreniu registračnej stránky.

Vytvorme stránku s adresou example.org/signup/ prostredníctvom pravidelného rozhrania. Ako adresu môžete použiť ľubovoľnú adresu URL, ktorá sa zdá byť vhodná pre váš projekt.

Presmerujte na požadovanú registračnú stránku

Ak chcete, aby WordPress vedel o našich nová stránka registrácia a urobili naň presmerovanie, keď kliknete na odkaz „Registrovať“, použije sa filter wp_signup_location. Nachádza sa na adrese wp-login.php a je predvolene zodpovedný za presmerovanie na wp-signup.php.

Prípad „register“: if (is_multisite ()) (wp_redirect (apply_filters („wp_signup_location“, network_site_url („wp-signup.php“)))); exit; // ...

Ako si pamätáte, v predvolenom nastavení sa registračná stránka otvára v hlavnej doméne siete. Preto sa tu používa network_site_url ().

Pridajte nášho obslužného programu do filtra v mu-plugins / selena-network / signup / plugin.php, ktorý vráti adresu registračnej stránky na aktuálnom webe:

Funkcia selena_network_signup_page ($ url) (return home_url ("signup");) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network je predpona, ktorú používam v názvoch všetkých funkcií v rámci doplnkov MU na svojom webe, aby sa zabránilo kolíziám, mala by byť nahradená mojou vlastnou jedinečnou predponou. Filter má prioritu 99, pretože niektoré doplnky ako bbPress a BuddyPress môžu túto adresu URL prepísať vlastnou (doplnky MU sa načítajú skôr ako bežné doplnky, pozri vyššie).

Všimnite si toho, že sa používa home_url (), ktorý na rozdiel od network_site_url () vracia adresu aktuálneho webu, nie hlavného webu v sieti.

Funkčnosť wp-signup.php

Súbor wp-signup.php obsahuje množstvo funkcií a kódu. Ak chcete vidieť celkový obraz, môžete použiť skladanie kódu. V angličtine sa to zvyčajne nazýva „skladanie kódu“.

Na úplnom začiatku súboru od 1 do 80 riadkov (vo verzii 4.1.1) sa pomocou get_header () vykonávajú rôzne kontroly a výstup „začiatku“ stránky.

Ďalej je deklarovaných mnoho metód a než s nimi začneme pracovať, stojí za to pochopiť, čo ktorá funkcia robí. Mnoho z nich často používa iné funkcie s predponou wpmu_, ktoré sú všetky deklarované v súbore wp-includes / ms-functions.php. Táto časť je ťažko zrozumiteľná bez toho, aby ste kód videli sami. Nasleduje krátky popis hlavných funkcií v prípade, že máte problémy.

  • wpmu_signup_stylesheet () - Vytvorí ďalšie CSS na registračnej stránke.
  • show_blog_form () - polia pre registráciu stránok (adresa, názov, viditeľnosť pre vyhľadávače).
  • validate_blog_form () - overte zadanú adresu stránky a názov pomocou wpmu_validate_blog_signup ().
  • show_user_form () - polia pre registráciu užívateľa (prihlasovacia a e -mailová adresa).
  • validate_user_form () - overenie zadaného používateľského mena a e -mailovej adresy. pošta pomocou wpmu_validate_user_signup ().
  • signup_another_blog () - polia pre registráciu nových stránok pomocou show_blog_form () pre užívateľov, ktorí sú už na webe zaregistrovaní.
  • validate_another_blog_signup () - overí URL a názov stránky pomocou validate_blog_form ().
  • signup_user () je hlavná funkcia na zobrazenie polí registračnej stránky.
  • validate_user_signup () - overuje používateľské meno a e -mailovú adresu. pošta pomocou validate_user_form ().
  • signup_blog () - polia na zadanie adresy, názvu a viditeľnosti stránok (druhý krok registrácie) pomocou show_blog_form ().
  • validate_blog_signup () - overuje prihlásenie, e -mail. e -mail, adresa a názov stránky.

V spodnej časti súboru wp-signup.php (z riadku 646 vo verzii 4.1.1) je hlavná logika registračnej stránky, ktorá používa všetky vyššie popísané metódy. Táto časť kódu nie je presunutá do funkcie. Na konci sa nazýva get_footer ().

Skopírujte funkčnosť súboru wp-signup.php

Ďalej opíšeme postup skopírovania wp-signup.php do doplnkov MU a vykonania zmien v „vidlici“. Možno sa to nezdá ako správna cesta. Namiesto toho môžete písať svoje vlastné overovanie formulárov a zobrazovať funkcie od začiatku pomocou tried, a nie bežných funkcií. Podľa mňa wp-signup.php už má pre našu stránku všetku potrebnú logiku, zostáva len vykonať malé zmeny.

Keď aktualizujete WordPress, wp-signup.php sa z času na čas zmení, neznamená to však, že s každým vydaním budete musieť svoju vidlicu synchronizovať. Funkcie vo vnútri wp-signup.php sa v zásade zaoberajú iba výstupom HTML, validáciou údajov, vytváraním účtov a stránok, metódami s predponou wpmu_ deklarovanou v ms-functions.php.

Začneme vytvárať funkciu, ktorá na stránke zobrazí registračný formulár. Za týmto účelom skopírujte súbor wp-signup.php z koreňa WordPress do súboru mu-plugings / selena-network / signup /. Pripojme ho vnútri mu-plugins / selena-network / signup / plugin.php).

Vyžadovať WPMU_PLUGIN_DIR. "/selena-network/signup/wp-signup.php";

Odstráňte všetky požadované a nepotrebné kontroly od úplného začiatku kopírovaného súboru. Vo verzii 4.1.1 je to všetok kód od 1 do 80 riadkov.

Teraz sme pripravení vytvoriť hlavnú funkciu na zobrazenie registračného formulára. Za týmto účelom presuňte všetku logiku z riadka 646 na úplný koniec súboru do funkcie s názvom selena_network_signup_main. Na samom konci odstránime dve dodatočné uzávery

(riadky 722 a 723), ako aj volanie na get_footer ().

V novovytvorenej selena_network_signup_main () na úplnom začiatku deklarujeme globálnu premennú active_signup, ktorú používajú všetky ostatné metódy z tohto súboru. A pridajte hovor k udalosti before_signup_form, ktorú sme odstránili od úplného začiatku súboru.

Funkcia selena_network_signup_main () (global $ active_signup; do_action ("before_signup_form"); // ...)

Teraz zostáva len zmeniť rozloženie na všetkých miestach, kde je to potrebné a registračná stránka je pripravená.

Výstup z registračného formulára

Tu sú minimálne dve možnosti. Pohodlnejší spôsob je vytvoriť krátky kód a umiestniť ho na stránku pomocou bežného editora.

// Vytvorenie krátkeho kódu network_signup add_shortcode ("network_signup", "selena_network_signup_main");

Druhou možnosťou je vytvoriť šablónu stránky Page-signup.php v podradenom priečinku s témou. Namiesto slova „registrácia“ môžete použiť jedinečný identifikátor priradený stránke. Do šablóny vložte požadované rozloženie a zavolajte selena_network_signup_main () na správne miesto.

Výsledkom je, že moja registračná stránka vyzerá oveľa lepšie a čistejšie.

Aktivačná stránka

Štandardne WordPress štandardne rozdeľuje proces registrácie na Multisite na dva kroky - vyplnenie formulára na webe a aktiváciu účtu po kliknutí na odkaz odoslaný v e -maile. Po vyplnení formulára vytvoreného v predchádzajúcej časti vám WordPress odošle e -mail s malou inštrukciou a odkazom na aktiváciu účtu.

Súbor wp-activate.php umiestnený v koreňovom adresári WordPress je zodpovedný za zobrazenie aktivačnej stránky. wp-activate.php je možné tiež úplne zmeniť. Tento proces je podobný tomu, čo sme už urobili pre wp-signup.php.

Vytvorme stránku example.org/activate/ prostredníctvom bežného rozhrania. Použite akúkoľvek adresu URL, ktorú uznáte za vhodnú pre danú adresu.

Skopírujte súbor wp-activ.php do našich doplnkov MU a pripojte ho k súborom mu-plugins / selena-network / signup / plugin.php.

Vyžadovať WPMU_PLUGIN_DIR. "/selena-network/signup/wp-activate.php";

Vnútri nie je veľa obsahu, na rozdiel od wp-signup.php. Súbor vykonáva jedinú operáciu - aktivuje účet, ak je prijatý správny kľúč, a zobrazí chybové hlásenie alebo úspešné dokončenie operácie.

Odstránime všetky nepotrebné kontroly a vyžadujeme - od 1 do 69 riadkov v programe WordPress 4.1.1. Na úplnom konci odstráňme volanie get_footer (). Presuňte zvyšok obsahu do funkcie selena_network_activate_main ().

Je zaujímavé poznamenať, že tu bola pred načítaním WordPress (wp-load.php) deklarovaná konštanta WP_INSTALLING. Jeho prítomnosť spôsobuje, že WordPress nenačítava doplnky.

Rovnako ako v prípade registračnej stránky zostáva iba v prípade potreby opraviť rozloženie. Môžete tiež zmeniť text zobrazovaných správ (v tomto prípade nezabudnite pridať textovú doménu vašich doplnkov MU do všetkých funkcií prekladača, v predvolenom nastavení nie je nikde nainštalovaný).

Hotovú funkciu je možné použiť na vopred vytvorenej stránke prostredníctvom krátkeho kódu alebo samostatnej šablóny v detskej téme.

Aktivačné e -maily so správnymi odkazmi

Aktivačná stránka je pripravená, ale WordPress o tom nevie a napriek tomu bude odosielať aktivačné e-maily s odkazom na wp-activate.php. Na rozdiel od wp-signup.php tu neexistuje žiadny filter, ktorý by vám umožnil zmeniť adresu. Namiesto toho musíte napísať svoju vlastnú funkciu, ktorá bude odosielať e -maily so správnymi odkazmi.

V čase vyplnenia a odoslania formulára na registračnej stránke WordPress zavolá wpmu_signup_ používateľ() alebo wpmu_signup_ blog() v závislosti od typu registrácie. Obe funkcie vytvárajú nový vstup v tabuľke wp_signups a naplňte ju potrebným obsahom, medzi ktorými je aj aktivačný kľúč účtu.

Potom sa v závislosti od funkcie zavolá wpmu_signup_ používateľ _notification () alebo wpmu_signup_ blog _notification (). Obe funkcie majú podobnú funkcionalitu - generujú a odosielajú e -maily s aktivačným odkazom, ale akceptujú rôzne argumenty. Oba majú filtre na „zachytenie“ udalosti.

Ak (! Apply_filters ("wpmu_signup_user_notification", $ user, $ user_email, $ key, $ meta)) return false;

Aktivácia účtov vytvorením blogu:

If (! Apply_filters ("wpmu_signup_blog_notification", $ doména, $ cesta, $ titul, $ používateľ, $ užívateľ_email, $ kľúč, $ meta)) (návrat nepravda;)

Zostáva iba napísať vlastné ovládače, v ktorých odosielať e -maily prostredníctvom wp_mail (), a na samom konci uviesť nepravdivé, aby WordPress neposlal aktivačný e -mail dvakrát - jeden je váš a druhý je predvolený. e-mail s odkazom na wp-activate.php.

Funkcia selena_network_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta = array ()) (// Generovanie hlavičky, textu a hlavičiek e -mailu // ... // Odoslanie e -mailu alebo pridanie úlohy Cron na odoslanie e -mail wp_mail ($ user_email, wp_specialchars_decode ($ subject), $ message, $ message_headers); // Odoslať false, aby WordPress dvakrát neodoslal aktivačný e -mail, vrátiť false;) add_filter („wpmu_signup_user_notification“, „selena_network_wpmu_signup_user_notification“, 10, 4);

Ak odosielate e -maily prostredníctvom servera SMTP alebo je počet registrácií veľmi vysoký, mali by ste zvážiť neodosielanie e -mailov okamžite. Namiesto toho môžete pridať úlohy Cron pomocou WordPress Cron.

Zatvára sa prístup k súborom wp-signup.php a wp-activate.php

Po vytvorení vlastných registračných a aktivačných stránok bude možno potrebné „originály“ zavrieť. Ak sú napríklad na registračnej stránke ďalšie polia, ktoré je potrebné vyplniť. Mnoho stránok WordPress tiež podlieha registrácii nevyžiadanej pošty.

Ak chcete vyriešiť dva problémy v jednom kroku, môžete požiadať Apache, aby vrátil 404, ak sa pokúsite otvoriť tieto stránky. Na to stačí zaregistrovať niekoľko ďalších RewriteRule do konfiguračného súboru alebo .htaccess.

RewriteEngine na RewriteBase / # znalosti regulárne výrazy nikdy nebude nadbytočné :) RewriteRule ^ wp -signup \ .php - RewriteRule ^ wp -activate \ .php - # ZAČAŤ WordPress # Nedotýkajte sa predvolených pravidiel WordPress :) # ... # END WordPress

Záver

Na internete existuje mnoho riešení tohto a mnohých ďalších „problémov“ súvisiacich s WordPress. Na vytvorenie registračných a aktivačných stránok napríklad niektorí navrhujú prepísať pôvodné súbory wp-signup.php a wp-activate.php. To sa neoplatí, pretože ak aktualizujete WordPress, prídete o všetky zmeny vykonané v súboroch a tiež nebudete môcť skontrolovať integritu jadra pomocou.

Pri vývoji akéhokoľvek doplnku, témy alebo riešenia by ste mali stráviť trochu času porozumením tomu, čo sa deje vo WordPresse. Na tento účel existuje mnoho užitočných nástrojov na ladenie.

P.S.

Na automatické priradenie rôznych rolí novým používateľom môžete použiť doplnok Multisite User Management.

Ak máte akékoľvek otázky alebo problémy pri vytváraní registračných a aktivačných stránok po prečítaní článku, zanechajte komentár a my určite odpovieme.

27.03.2015 27.03.2015

Vývojár WordPress. Miluje vo všetkom poriadok a rozumie novým nástrojom. Inšpirované architektúrou komponentov Symfony.

  • Dnes sa budeme zaoberať využitím kritickej 1 -dňovej zraniteľnosti v populárnom CMS Joomla, ktorý na internete zahrmel koncom októbra. Budeme hovoriť o zraniteľnostiach s číslami CVE-2016-8869, CVE-2016-8870 a CVE-2016-9081... Všetky tri pochádzajú z jedného kusu kódu, ktorý sa v útrobách rámca motal dlhých päť rokov a čakal, kým sa jeho hodina uvoľní a prinesie so sebou chaos, hacknuté stránky a slzy nevinných používateľov tejto Joomly. Len naj udatnejší a najodvážnejší vývojári, ktorých oči sú červené od svetla monitorov a klávesnice sú posiate strúhankou, dokázali napadnúť zúriacich zlých duchov a položiť hlavu na oltár opráv.

    POZOR

    Všetky informácie slúžia len na informačné účely. Redakčná rada ani autor nezodpovedajú za prípadné škody spôsobené materiálmi tohto článku.

    Ako to všetko začalo

    6. októbra 2016 Demis Palma vytvoril tému o Stack Exchange, v ktorej sa pýta: prečo vlastne v Joomla verzii 3.6 existujú dve metódy registrácie používateľov s rovnakým názvom register ()? Prvý je v UsersControllerRegistration a druhý je v UsersControllerUser. Damis chcel vedieť, či sa niekde používa metóda UsersControllerUser :: register (), alebo ide len o evolučný anachronizmus, ktorý zostal zo starej logiky. Mal obavy zo skutočnosti, že aj keď túto metódu nepoužil žiadny pohľad, je možné ju vyvolať pomocou vygenerovanej požiadavky. Na čo som dostal odpoveď od vývojára pod prezývkou itoctopus, ktorý potvrdil, že problém skutočne existuje. A poslal správu vývojárom Joomla.

    Ďalšie udalosti sa vyvíjali najrýchlejšie. 18. októbra vývojári Joomly prijímajú správu od Damisa, ktorý do tej doby načrtol dokument PoC, ktorý umožňuje registráciu používateľov. Na svojom webe zverejnil poznámku, kde načrtol problém, ktorý zistil a svoje myšlienky v tejto záležitosti. V ten istý deň to vyjde nová verzia Joomla 3.6.3, ktorý stále obsahuje zraniteľný kód.

    Potom Davide Tampellini odhaľuje chybu v stave registrácie nie jednoduchého používateľa, ale správcu. A už 21. októbra prichádza do bezpečnostného tímu Joomla nový prípad. Už to hovorí o eskalácii privilégií. V ten istý deň sa na stránke Joomla objavuje oznámenie, že v utorok 25. októbra bude vydaná ďalšia verzia s sériové číslo 3.6.3, ktorý opravuje kritickú zraniteľnosť jadra systému.

    25. októbra tím Joomla Security Strike nájde najnovší problém, ktorý je vytvorený kúskom kódu, ktorý Damis objavil. Potom sa záväzok z 21. októbra s nenápadným názvom Prepare 3.6.4 Stable Release presunie do hlavnej vetvy oficiálneho úložiska Joomla, ktorá nešťastnú chybu opraví.

    Po tomto výstupe sú mnohí zainteresovaní jednotlivci napojení na stretnutie vývojárov - začínajú odkrúcať zraniteľnosť a pripravovať vykorisťovania.

    27. októbra výskumník Harry Roberts nahráva hotový exploit do úložiska Xiphos Research, ktorý môže nahrať súbor PHP na server so zraniteľným CMS.

    Podrobnosti

    Skončili sme s pozadím, prejdime k najzaujímavejšej časti - k analýze zraniteľnosti. Ako testovaciu verziu som nainštaloval Joomla 3.6.3, takže všetky čísla riadkov budú pre túto konkrétnu verziu relevantné. A všetky cesty k súborom, ktoré vidíte nižšie, budú označené vzhľadom na koreň nainštalovaného CMS.

    Vďaka nálezu Damisa Palmu vieme, že existujú dve metódy, ktoré vykonávajú registráciu používateľa v systéme. Prvý používa CMS a nachádza sa v súbore /components/com_users/controllers/registration.php:108. Druhý (ten, ktorý musíme nazývať) žije v /components/com_users/controllers/user.php:293. Pozrime sa na to bližšie.

    286: / ** 287: * Spôsob registrácie používateľa. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: * / 293: register verejných funkcií () 294: (295: JSession :: checkToken („príspevok“) alebo jexit (JText :: _ ("JINVALID_TOKEN")); ... 300: // Získať údaje formulára. 301: $ data = $ this-> input-> post-> get ("užívateľ", pole (), "pole") ;. .. 315: $ return = $ model-> validate ($ form, $ data); 316: 317: // Check for errors. 318: if ($ return === false) 319: (... 345: / / Dokončite registráciu.346: $ return = $ model-> register ($ data);

    Tu som nechal len zaujímavé riadky. Plnú verziu zraniteľnej metódy je možné zobraziť v úložisku Joomla.

    Poďme zistiť, čo sa deje počas bežnej registrácie používateľa: aké údaje sa odosielajú a ako sa spracúvajú. Ak je v nastaveniach povolená registrácia používateľa, formulár nájdete na stránke http: //joomla.local/index.php/component/users/? View = registrácia.


    Oprávnená žiadosť o registráciu používateľa vyzerá ako na nasledujúcom obrázku.


    Komponent com_users je zodpovedný za prácu s používateľmi. Dávajte pozor na parameter úlohy v požiadavke. Je vo formáte $ controller. $ Method. Pozrime sa na štruktúru súborov.

    Názvy skriptov v priečinku ovládače zodpovedajú názvom volaných ovládačov. Pretože naša požiadavka teraz obsahuje $ controller = „registrácia“, súbor sa zavolá registrácia.php a jeho metóda register ().

    Pozor, otázka: ako preniesť spracovanie registrácie na zraniteľnosť v kóde? Pravdepodobne ste už uhádli. Mená zraniteľných a skutočné metódy sú rovnaké (register), takže stačí zmeniť názov volaného ovládača. Kde sa nachádza zraniteľný ovládač? Správne, v súbore user.php... Ukázalo sa, že $ controller = „používateľ“. Dať to všetko dohromady a získať task = user.register. Teraz je žiadosť o registráciu spracovaná metódou, ktorú potrebujeme.


    Druhá vec, ktorú musíme urobiť, je odoslať údaje v správnom formáte. Tu je všetko jednoduché. Legitímny register () od nás očakáva pole s názvom jform, v ktorom odovzdávame údaje na registráciu - meno, prihlasovacie meno, heslo, poštu (pozri snímku obrazovky so žiadosťou).

    • /components/com_users/controllers/registration.php: 124: // Získajte údaje o používateľovi. 125: $ requestData = $ this-> input-> post-> get ("jform", array (), "array");

    Naše oddelenie získava tieto údaje z poľa s názvom používateľ.

    • /components/com_users/controllers/user.php: 301: // Získať údaje formulára. 302: $ data = $ this-> input-> post-> get ("užívateľ", pole (), "pole");

    Meníme preto názvy všetkých parametrov v požiadavke z jfrom na užívateľa.

    Našim tretím krokom je nájsť platný token CSRF, pretože bez neho nebude žiadna registrácia.

    • /components/com_users/controllers/user.php: 296: JSession :: checkToken ("post") alebo jexit (JText :: _ ("JINVALID_TOKEN"));

    Vyzerá to ako hash MD5 a môžete si to vziať napríklad z autorizačného formulára na webe /index.php/component/users/?view=login.


    Teraz môžete vytvárať používateľov požadovanou metódou. Ak všetko fungovalo, potom vám blahoželáme - práve ste zneužili zraniteľnosť CVE-2016-8870"Chýba kontrola povolení na registráciu nových používateľov."

    Takto to vyzerá v „fungujúcej“ metóde register () z ovládača UsersControllerRegistration:

    • /components/com_users/controllers/registration.php: 113: // Ak je registrácia zakázaná - Presmerovať na prihlasovaciu stránku. 114: if (JComponentHelper :: getParams ("com_users") -> get ("allowUserRegistration") == 0) 115: (116: $ this-> setRedirect (JRoute :: _ ("index.php? Option = com_users & view = login ", false)); 117: 118: return false; 119 :)

    A tak medzi zraniteľnými:

    • /components/com_users/controllers/user.php:

    Áno, v žiadnom prípade.

    Aby ste pochopili to druhé, oveľa viac vážny problém, pošleme požiadavku, ktorú sme vytvorili, a sledujeme, ako sa vykonáva v rôznych častiach kódu. Tu je kus, ktorý je zodpovedný za validáciu údajov odoslaných používateľom pracovnou metódou:

    Pokračovanie je k dispozícii iba pre účastníkov

    Možnosť 1. Pripojte sa k komunite „stránok“ a prečítajte si všetky materiály na webe

    Členstvo v komunite počas určeného obdobia vám otvorí prístup ku všetkým materiálom hackerov, zvýši vašu osobnú kumulatívnu zľavu a umožní vám akumulovať profesionálne skóre Xakep!

    Jednorazové odkazy je možné použiť v rôznych situáciách: na poskytnutie dočasného prístupu k súboru alebo stránke alebo na potvrdenie registrácie. V tomto návode vám ukážeme, ako generovať a vkladať jednorazové adresy URL.

    Vytvorenie adresy URL

    Predpokladajme, že na našom webe máme systém autentifikácie používateľov. Po registrácii požiadame používateľa, aby prešiel postupom overenia e -mailu. Na vytvorenie takýchto odkazov môžeme použiť špeciálny parameter tokenu. Príklad takého odkazu:

    Http: //example.com/aktivovat? Token = ee97780 ...

    Bez databázy sa tu nezaobídeme, poďme sa teda pozrieť na tabuľku, s ktorou budeme pracovať.

    VYTVORIŤ TABUĽKU pending_users (token CHAR (40) NOT NULL, užívateľské meno VARCHAR (45) NOT NULL, tstamp INTEGER UNSIGNED NOT NULL, PRIMARY KEY (token));

    Do tabuľky uložíme 3 polia: token, používateľské meno a čas. Na vygenerovanie tokenu použijeme funkciu sha1 (), ktorá vygeneruje 40 znakový reťazec. Pole tstamp bude uchovávať čas, kedy bol token vygenerovaný, aby sme mohli sledovať odkazy, ktorým vypršala platnosť.

    Existuje mnoho spôsobov, ako vygenerovať token, ale v tomto návode použijeme funkcie uniqid () a sha1 (). Bez ohľadu na to, ako sa token generuje, uistite sa, že generované hodnoty sú odlišné a pravdepodobnosť duplikátov je minimálna.

    $ token = sha1 (uniqid ($ username, true));

    Funkcia uniqid () berie ako parameter reťazec a na základe odovzdaného argumentu a aktuálneho času vydáva jedinečný identifikátor. Rovnako ako druhý argument má táto funkcia booleovskú hodnotu, ktorá signalizuje uniqidu pridať niekoľko znakov navyše, aby sa zvýšila pravdepodobnosť, že hodnota bude jedinečná. Funkcia sha1 má jedinečný identifikátor a vytvára hash.

    Potom, čo tieto dve funkcie budú fungovať, budeme mať jedinečný token, ktorý môžeme použiť na generovanie adries URL. Teraz ho musíme pridať do databázy:

    $ query = $ db-> pripraviť ("VLOŽIŤ DO Pending_users (používateľské meno, token, tstamp) HODNOTY (?,?,?)"); $ query-> execute (pole ($ užívateľské meno, $ token, $ _SERVER [„REQUEST_TIME“])));

    Aby sme vedeli, ktorý užívateľ by mal byť aktivovaný, bude v tabuľke zaznamenané aj užívateľské meno. V príklade, ktorý je viac prispôsobený skutočnému webu, môžete použiť ID užívateľa.

    Teraz, keď máme všetky potrebné informácie, môžeme vytvoriť dočasnú adresu URL:

    $ url = "http://example.com/activate.php?token=$token";

    $ správa =<<

    Vyšetrenie

    Teraz potrebujeme skript, vďaka ktorému vykonáme kontrolu. Všetko, čo musíme urobiť, je porovnať token z adresy URL a token z databázy. Ak existuje jeden a jeho životnosť ešte neuplynula, potom je všetko v poriadku.

    // získajte token if (isset ($ _ GET ["token"]) && preg_match ("/ ^ (40) $/ i", $ _GET ["token"])) ($ token = $ _GET ["token "];) else (hodi novu vynimku (" token nie je platny. ");) // skontroluje token $ query = $ db-> pripravit (" VYBERTE uzivatelske meno, tstamp Z Pending_users WHERE token =? "); $ query-> execute (pole ($ token)); $ row = $ query-> fetch (PDO :: FETCH_ASSOC); $ query-> closeCursor (); if ($ row) (extract ($ row);) else (throw new Exception ("the token is not valid.");) // activate the user account // ... // remove the token from the database $ dotaz = $ db-> pripraviť ("ODSTRÁNIŤ Z nespracovaných používateľov KDE používateľské meno =? AND token =? AND tstamp =?",); $ query-> execute (pole ($ užívateľské meno, $ token, $ tstamp));

    Musíme tiež zabezpečiť overovanie tokenov, ktorých životnosť vypršala:

    // 1 deň v sekundách = 60 sekúnd * 60 minút * 24 hodín $ delta = 86400; // skontrolujte, či ($ _SERVER ["REQUEST_TIME"] - $ tstamp> $ delta) (vyvolať novú výnimku ("token vypršal.");) // aktivovať používateľský účet // ...

    Budeme teda mať dve kontroly: jednu na platnosť tokenu a druhú na dobu jeho existencie.

    Výsledok

    Túto metódu je možné použiť nielen na aktiváciu účty používateľom, ale aj v iných potrebách: napríklad poskytnúť jednorazový alebo dočasný prístup k nejakému zdroju alebo službe.

    Na vrchole toho všetkého môžete vytvoriť skript, ktorý odstráni tokeny, ktoré ste nikdy predtým nepoužívali. Tento skript môžete z času na čas spustiť sami alebo na to použiť cron.