Activate php değerlendirmesi. WordPress Multisite'da kendi kayıt sayfanızı nasıl oluşturabilirsiniz?

Eklenti etkinleştirildiğinde tetiklenecek bir işlevi kaydeder.

Bu işlev, belirtilen geri arama işlevini activate_ (eklenti) kancasına ekler ve bu kancanın etrafındaki bir sarmalayıcıdır.

activate_ (plugin) kancasındaki (eklenti), ana eklenti dosyasına göreli eklentinin adıyla değiştirilir. Örneğin, eklenti şu konumdaysa: wp-content / plugins / sampleplugin / sample.php, o zaman kanca adı: activate_sampleplugin / sample.php olacaktır.

3.1 sürümünden beri. kanca yalnızca eklenti etkinleştirme sırasında tetiklenir ve otomatik güncelleme Eklenti.

Nasıl çalışır

Eklenti, activate_ (eklenti) kancasının tetiklendiği activate_plugin () işlevi tarafından etkinleştirilir.

Çekirdekteki activate_plugin() işlevi, VI ortamı yüklendikten sonra çağrılır. Bu işlev, ana eklenti dosyasını (ve içinde belirtilen her şeyi) içerir ve ardından bir kanca aracılığıyla belirtilen geri arama işlevini etkinleştirir. Bu nedenle, eklentinin tüm işlevleri ve sınıfları geri çağırma işlevimizde mevcuttur. Ancak, VI ortamı yüklendiğinde tüm ana WP kancaları zaten tetiklendiğinden, ana eklenti dosyası bağlandığında, örneğin plugins_loaded gibi, kancalara asılan hiçbir eklenti olayı artık tetiklenmeyecektir. Bu, eklentimizin bağlanacağı, ancak tamamen bağlanmayacağı anlamına gelir: zaten etkinleştirildiğinde bağlanması gerektiği gibi değil.

Örneğin, bir eklenti plugins_loaded olayı sırasında bir şey yaparsa, eklenti etkinleştirildiğinde tüm bu eylemler gerçekleşmez. Örneğin, bir çeviri dosyasına bağlanırsa, register_activation_hook() için belirtilen geri çağırma işlevi tetiklendiği anda çeviri dosyası bağlanmayacaktır.

Kural olarak, geri arama işlevi tetiklendikten sonra, işlevleri kapatabileceğiniz 2 olay vardır: active_plugin ve kapatma.

Bir eklentiyi etkinleştirirken olağanüstü bir şey yapmak için örnek 5'e bakın.

Kullanım Şartları

Bir kanca tetiklendiği anda onu çağırırsanız, işlev çalışmaz, örneğin plugins_loaded, init. İşlev, doğrudan ana eklenti dosyasından çağrılmalıdır. Aktivasyon kuralları:

    register_activation_hook(), Plugin Name: ... yönergesinin bulunduğu ana eklenti dosyasından çağrılmalı ve plugins_loaded veya init gibi herhangi bir kancadan çağrılmamalıdır.

    Kanca işlevi, kanca ile aynı dosyada olmalı veya önceden başka bir dosyadan dahil edilmelidir.

    Kanca işlevinde yankı çalışmaz. Çünkü bir yönlendirme var ve yankı görmeyeceksiniz. Ancak die() kullanılabilir.

  1. Hook fonksiyonundan erişilebilmesi için global değişkenlerin (varsa) açık bir şekilde tanımlanması gerekir.

Değişken kapsam hakkında bir not

Bir eklenti etkinleştirildiğinde, ana eklenti dosyası global kapsamda değil, activate_plugin () işlevinin içindedir. Bu nedenle, içinde yer alan değişkenler normal mod eklenti çalışmaları global kabul edilir, global olmaz.

Örneğin, register_activation_hook() işlevinde kullanılan işlev, bunları bu işlev içinde global olarak bildirmiş olsanız bile global değişkenleri görmeyebilir. Örnek:

$ myvar = "bir şey"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; // Değişken, "bir şey"e eşit değildir)

Bu özellik nedeniyle, global değişkenler her zaman açıkça belirtilmelidir. Eklenti gövdesinde değişken belirtilmiş olsa bile tüm global değişkenler global olarak tanımlanmalıdır. Sadece bu durumda onlara her yerden erişim sağlanacaktır. Örnek:

küresel $ myvar; // bunun global bir değişken olduğunu açıkça belirtiyoruz $ myvar = "something"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; //> bir şey)

Kanca yok.

İadeler

boş. Hiçbir şey döndürmez.

kullanım

register_activation_hook ($ dosya, $ fonksiyon); $ dosyası (dize) (gerekli) Eklentinin adını da içeren, eklentinin ana php dosyasının yolu. Genellikle sihirli PHP sabiti __FILE__ kullanılır. $ işlevi (string / dizi / lambda) (gerekli)

Geri arama işlevinin adı. Sınıflar için bir dizi kullanın: dizi ($ this, "function_name"); ...

İşlev, çoklu site olduğunda eklentinin tüm site ağı için etkinleştirilip etkinleştirilmediğine dair bir boole değişkeni $ network_wide alacaktır.

Örnekleri

#1. Bir eklentiyi etkinleştirirken bir işlevi çalıştırma

Ana eklenti dosyasında bir my_plugin_activate () fonksiyonumuz olduğunu varsayalım: wp-content / plugins / myplugin / myplugin.php, ardından eklenti aktivasyonu sırasında bu fonksiyonu çalıştırmak için aşağıdaki kodu kullanın:

Register_activation_hook (__ FILE__, "my_plugin_activate"); function my_plugin_activate () (// Aktivasyon kodu ...)

# 2. Bir sınıf yöntemini çalıştırma

Eklenti kullanılıyorsa PHP sınıfı, aktivasyon kodu şu şekilde eklenir:

Register_activation_hook (__ FILE__, dizi ("My_Plugin", "install")); class My_Plugin (statik fonksiyon kurulumu () (// Burada herhangi bir çıktı oluşturmayın ...))

# 3. Ayrı bir dosyadan bir sınıf yöntemi çalıştırma

Aktivasyon fonksiyonunu içeren sınıf ise ayrı dosya, ardından etkinleştirme işlevini şu şekilde kaydedin:

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

#4. Sınıfın kendisinden bir sınıf yöntemi çalıştırma

__construct () içindeyseniz. Önemli olarak, __FILE__ ana eklenti dosyasına "bakmalıdır":

Register_activation_hook (__ FILE__, dizi ($ this, "YOUR_METHOD_NAME"));

# 5 Eklentiyi etkinleştirdikten hemen sonra bir şeyler yapın

Eklentiyi etkinleştirdikten sonra yalnızca iki kanca tetiklenir: active_plugin ve kapatma.

Bir eklentiyi etkinleştirdikten hemen sonra bir şeyler yapmanız gerektiğinde, onlara bir işlev ekleyebilirsiniz.

Böyle bir çözüm işe yaramadığında, WP seçeneklerini kullanabilirsiniz: verileri bir seçeneğe kaydedin ve ardından seçeneği kontrol edin ve bir seçenek varsa bir şeyler yapın:

// Ana eklenti dosyası. ... function my_plugin_activate () (// daha sonra yapılacak bir şey varsa bir seçenek ekleyin. add_option ("Activated_Plugin", "Plugin-Slug"); // İşte aktivasyon kodu ...) register_activation_hook ( __ DOSYA__, " my_plugin_activate "); function load_plugin () (if (is_admin () && get_option ("Activated_Plugin")") == "Plugin-Slug") (// artık çalışmaması için eklenen seçeneği kaldırın // ve ihtiyacımız olanı yapın ... delete_option ( "Activated_Plugin "); // Eklentiyi etkinleştirdikten sonra bir kez bir şeyler yapın // Örneğin: add_action (" init "," my_init_function ");)) add_action (" admin_init "," load_plugin ");

Eklenti aktivasyonu sırasında bir şeyler yapmak için başka bir seçenek de etkinliğinizi şu şekilde oluşturmaktır:

my_plugin_activate () işlevi (// Eklentinin kendi dosyalarından ekleyebilmeniz için kendi kancamızı kurun do_action ("my_plugin_activate");) register_activation_hook (__ FILE__, "my_plugin_activate");

# 6 İşlevi kullanmanın başka bir gösterimi

İşlevin nasıl kullanılacağını gösteren küçük bir eklenti:

/ * Eklenti Adı: Bir Test Açıklaması: Bir Test * / require_once dizini (__ FILE__). "/my_other_file.php"; / * Bu kod çalışmayacak. Aktivasyon kancası ana dosyadan çağrılmalıdır. register_activation_hook (dizi adı (__ FILE__). "/my_other_file.php", "my_other_function"); * / // Bu çalışan koddur. register_activation_hook (__ DOSYA__, "test_activated"); / * Global değişkenleri bildirmenin ve bunlara erişmenin doğru yolu budur. Global değişkenler açıkça bildirilmelidir. Bu olmadan, onlara erişiminiz olmayacak. * / global $ bazı_var; $ bazı_var = "hey"; // Aktivasyon fonksiyonu function test_activated () (// burada $ some_var hey global $ some_var'a eşit olmayacak; // Ve burada $ some_var hey'e eşit olacak // Bu fonksiyon "my_other_file.php" dosyasında tanımlanmıştır my_other_function () ; / * Bu işe yaramaz. Günlükleri geçici bir dosyaya yazmanız gerekiyorsa, fopen / fwrite kullanın. Aktivasyon kancasının çalışıp çalışmadığını test etmek istiyorsanız, kanca işlevi içinde çıkış () kullanın. * / echo " test_activated çağrıldı!";)

Standart wp-signup.php yerine multisite için kendi kayıt sayfamızı oluşturuyoruz.

V normal kurulum WordPress sayfası kayıt (yetkilendirme, parola sıfırlama) wp-login.php dosyasının çıktısını verir.

  • /wp-login.php - yetkilendirme
  • /wp-login.php?action=register - kayıt
  • /wp-login.php?action=lostpassword - parola sıfırlama

wp-login.php'de multisite için ayrı koşullar vardır. Bu nedenle, bir çoklu sitede /wp-login.php?action=register bağlantısını tıkladığınızda, WordPress /wp-signup.php sayfasına yönlendirilecektir. Birçok temada sayfa çok çekici görünmüyor, bu yüzden kendimizinkini yapacağız.

Ağın ana sitesi

WordPress varsayılan olarak ağın ana etki alanında (site) bir kayıt sayfası (wp-signup.php) açar. Ancak, farklı temalara sahip olsalar bile ağdaki her site için ayrı bir kayıt sayfası oluşturmak mümkündür. Ağdaki tüm sitelerin kendi kayıt sayfasına sahip olduğu, ancak aynı temanın kullanıldığı ve sitelerin yalnızca dilde farklılık gösterdiği durumu ele alacağız. Farklı temalar kullanılıyorsa, daha fazla kod yazılması gerekecektir.

fonksiyonlar.php?

Numara. Bu dosyanın adı her WordPress makalesinde geçiyor gibi görünüyor. Bizim durumumuzda, kayıt işlevselliği birkaç site için tasarlandığından, herhangi bir siteyi açtığınızda yüklenen MU eklentilerine taşımak mantıklıdır.

lirik arasöz

MU eklentilerinin normal eklentilerden daha erken ve WordPress çekirdeği tamamen yüklenmeden önce yüklendiğini belirtmekte fayda var, bu nedenle bazı işlevlerin çağrılması PHP'de ölümcül hatalara neden olabilir. Bu "erken" yüklemenin de avantajları vardır. Örneğin, herhangi bir temanın içinde, function.php dosyası temadan yüklenmeden önce tetiklenen bazı eylemlere tutunamazsınız. Buna bir örnek, Jetpack'teki modüllerin etkinliğini izlemenin mümkün olduğu jetpack_module_loaded_İLİŞİLİ-posts (ilgili gönderiler - modülün adı) biçimindeki Jetpack eklentisinin eylemleridir. Tema dosyasından bu eyleme "yapışmak" imkansızdır, çünkü eylem tema yüklenmeden önce zaten tetiklenmiştir - eklentiler temalardan önce yüklenir. Codex'teki Eylem Referans sayfasında WordPress yükleme sırasının genel bir resmine göz atabilirsiniz.

Dosya sırası

MU eklentileri, herhangi bir sayıda dosya ve size mantıklı görünen herhangi bir yapı içerebilir. Bu hiyerarşi gibi bir şeye bağlıyım:

| -mu-eklentiler | - | -load.php | - | - | -selena-network | - | - | - | -kayıt | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php

Ağımız için gerekli tüm "eklentiler" load.php dosyasına bağlanır:

// Tüm eklentiler için Çevirileri Yükle load_muplugin_textdomain ("selena_network", "/ selena-network / diller /"); // Ağ Kaydı WPMU_PLUGIN_DIR gerektirir. "/selena-network/signup/plugin.php"; // Başka eklentiler // WPMU_PLUGIN_DIR gerektirir ...

Selena-network klasörünün içinde, her birinin load.php'ye dahil ettiğimiz kendi plugin.php'si olan eklenti klasörleri saklanır. Bu size esneklik ve işleri hızlı bir şekilde kapatıp açma yeteneği verir.

Kayıt sayfası adresi

Kayıt sayfasının adresini belirtmek için wp_signup_location filtresi kullanılır. wp-login.php dosyasının içinde bulunabilir ve wp-signup.php'ye yönlendirmeden sorumludur.

Case "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); çıkış;

Mevcut sitedeki kayıt sayfasının adresini döndürecek olan mu-plugins / selena-network / signup / plugin.php dosyasına fonksiyonumuzu ekleyelim:

fonksiyon selena_network_signup_page ($ url) (home_url'ye dön (). "/ Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network, çarpışmaları önlemek için sitemdeki MU eklentilerinin içindeki tüm işlevlerin adlarında kullandığım önek, kendi benzersiz önekimle değiştirilmelidir. Filtrenin önceliği 99'dur çünkü bbPress ve BuddyPress gibi bazı eklentiler bu URL'nin üzerine kendi URL'lerini yazabilir (MU eklentileri normal eklentilerden daha erken yüklenir, yukarıya bakın). Ziyaretçiyi aynı etki alanında tutmak için network_site_url () yerine home_url () kullanıldığını unutmayın. Adres olarak herhangi bir URL kullanılabilir.

Bir sayfa yarat

Şimdi normal arayüz üzerinden site.com/signup/ adresiyle bir sayfa oluşturalım ve alt tema klasöründe yeni sayfamızın şablonu page-signup.php'dir. "Kayıt" kelimesi yerine benzersiz bir kimlik kullanılabilir.

Yeni şablonun içinde, kayıt formunu görüntüleyecek olan selena_network_signup_main() işlevini çağırmanız gerekir.

Şablonlarla tüm sürecin gerekli olmadığını ve bunun yerine selena_network_signup_main () işlevini de çağıracak kendi kısa kodunuzu oluşturabileceğinizi belirtmekte fayda var.

wp-signup.php ve wp-activate.php

Şimdi kayıt formunu gösterecek bir fonksiyon oluşturmaya başlayalım. Bunu yapmak için wp-signup.php ve wp-activate.php dosyalarını WordPress kökünden mu-plugings / selena-network / signup / dizinine kopyalayın (ve bunları mu-plugins / selena-network içine bağlamayı unutmayın) / kayıt / plugin.php) ... Dosyalarla daha fazla manipülasyon yapmak son derece zor ve tarif etmek zaman alıcıdır, bu yüzden bunları kendiniz yapmanız gerekecektir. Sadece tam olarak ne yapılması gerektiğini anlatacağım ve projemin kaynak dosyalarını yayınlayacağım:

  1. Dosyanın başında, tüm gereksinimleri, işlev çağrılarını ve işlevlerin dışındaki diğer kodları kaldırın.
  2. Adlara benzersiz önekler ekleyerek tüm işlevleri yeniden adlandırın.
  3. wp-signup.php kodunun alt kısmını selena_network_signup_main işlevine sarın ve en başa global $ active_signup yazın; ...
  4. Düzeni doğru yerlerde kendi düzeninizle değiştirin.

wp-activate.php içinde, yaklaşık olarak aynısını yapmanız gerekir:

  1. İşlevlerin dışındaki tüm kodları kaldırın, düzeni ayrı bir işleve sarın.
  2. Gerektiğinde düzeni değiştirin.

wp-activate.php dosyası hesap aktivasyon sayfasından sorumludur. Kayıt sayfasında olduğu gibi, bunun için de wp-activate.php dosyasından işlevi çağırdığınız ayrı bir şablon oluşturmanız gerekir.

Aktivasyon mektupları gönderiyoruz

Kayıt sayfası, ziyaretçiye hesabını etkinleştirmesi için bir bağlantı içeren bir e-posta gönderir. Varsayılan olarak bu, ms-functions.php dosyasındaki wpmu_signup_user_notification () işlevi tarafından yapılır. İşlevselliği, işleviniz için ödünç alınabilir. Bu özelliği kullanmayı bırakmanın nedeni, wp-activate.php adresinden hesap aktivasyon bağlantısını göndermesidir. Bu işlevi wpmu_signup_user_notification filtresini kullanarak false vererek "devre dışı bırakabilirsiniz" (bunu yapmazsanız, aktivasyon mektubu iki kez gönderilecektir, tamam, aslında iki farklı harf).

Armyofselenagomez_wpmu_signup_user_notification işlevi ($ user, $ user_email, $ key, $ meta = array()) (// ... // wpmu_signup_user_notification() işlevinden kod wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ mesaj), $ ; false döndür;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Sonuç olarak, Selena temasındaki kayıt sayfası çok daha temiz ve daha doğru görünüyor.

Çözüm

Aynısını İnternette yapmanın pek doğru olmayan başka yolları da var - Apache yönlendirmeleri, Java Script olmadan çalışmayacak AJAX formları, vb. kendi web sitesi.

Dosyaları dikkatli bir şekilde düzenlemeniz ve orijinalinden fazla sapmamaya çalışmanız gerektiğini unutmayın, böylece daha sonra WordPress wp-signup.php ve wp-activate.php dosyalarını değiştirirse, değişiklikleri bulmak için bunları karşılaştırmak daha kolay olacaktır.

bakmayı unutma kaynak Kodun içinde ne ve nasıl olduğunu tam olarak anlamak için yukarıda açıklanan tüm işlevler.

Bonus. Spam gönderici koruması

En küçük WordPress siteleri bile sık sık spam kayıtlarına maruz kalır. Botları filtrelemek için sonsuz koşullar yazabilirsiniz, genellikle daha çok yaratmaya çalışmak gibi. yapay zeka🙂 Çoklu site durumunda, Apache'deki olağan yönlendirme bana çok yardımcı oldu, bunun yardımıyla /wp-signup.php ve /wp-acitvate.php'yi açarken bir 404 istedim (ben istemiyorum konusunda uzman Apache'yi yapılandırma bu yüzden kurallarım çok doğru olmayabilir).

RewriteBase'de RewriteEngine / RewriteRule ^ wp-signup \ .php - RewriteRule ^ wp-activate \ .php - # BEGIN WordPress # Varsayılan olarak WordPress kurallarına dokunmayın :) # ... # WordPress'i Bitir

P. S. Bazı üçüncü şahıslara ait şeyleri olabildiğince ayrıntılı bir şekilde açıklamaya çalışıyorum, çünkü başladığımda bazen soracak ve birçok şeyi açıklayacak kimse yoktu. Ayrıca, diğer materyallerle ilgili bu tür küçük ipuçlarının, birini yeni bir şeyler öğrenmeye ve bilgi alanlarını genişletmeye iteceğine inanıyorum. RewriteRule girişlerinde normal ifadeler kullanılır, bunlar hiç de karmaşık değildir, örneğin, ^ karakteri bir satırın başlangıcı anlamına gelir.

Aynı anda birden fazla site için bir WordPress kurulumunu kullanmanıza izin verir. Aynı zamanda, her site benzersiz bir önekle veritabanında kendi tablolarını alır.

Kayıtlı kullanıcıların verilerini içeren tablolar, ağdaki tüm siteler için ortaktır. Bu kesin bir artıdır ve bir kez kaydolarak birçok siteye erişebilirsiniz. Ayrıca her sitede aynı hesap farklı haklara sahip olabilir. Örneğin, bir sitede bir kullanıcı editör, diğerinde ise yönetici olabilir.

Tipik bir WordPress kurulumunda, kayıt, oturum açma ve parola sıfırlama sayfası, wp-login.php dosyasının çıktısını verir.

  • wp-login.php - yetkilendirme
  • wp-login.php?eylem = kayıt - kayıt
  • wp-login.php?action = kayıp şifre - şifre sıfırlama

Multisite modunda, WordPress çekirdeği biraz farklı davranmaya başlar ve wp-login.php? Bu, varsayılan WordPress sitesi olan ağ kayıt sayfanızdır.

Normal kullanıcı hesaplarını kaydetmeye ek olarak, süper yönetici bu özelliği ağ ayarlarında etkinleştirmişse (Ağ Yöneticisi → Ayarlar → Ağ Ayarları) üzerinde yeni bir web sitesi oluşturabilirsiniz.

Çoğu temada kayıt sayfası pek iyi görünmüyor. Birçok dış görünüm, sayfalardaki farklı öğeleri stillendirmek için Bootstrap gibi CSS çerçevelerini ve kendi özel sınıflarını kullanır, bu nedenle herkes için çalışan tek bir HTML yazmak zordur.

Ancak sayfa düzensiz görünüyorsa umutsuzluğa kapılmayın. wp-signup.php dosyası, sitenin her ayrıntısı üzerinde çalışmak için zaman olmadığında, ilk başta harika bir şeydir - başkalarına daha fazla odaklanabilirsiniz. önemli sayfalar ve içerik.

Kendi kayıt sayfanızı oluşturmaya hazır olduğunuzda, wp-signup.php, WordPress'in kullanıcı girdisini işlemek ve doğrulamak ve yeni hesaplar oluşturmak için sağladığı çeşitli işlevleri anlamanıza yardımcı olacak iyi bir örnek ve örnek olacaktır.

Ağın ana sitesi

WordPress varsayılan olarak ağın ana etki alanında (site) bir kayıt sayfası (wp-signup.php) açar. Ancak, bir temaları olsa bile ağdaki her site için kayıt sayfaları oluşturabilirsiniz.

Ağdaki tüm sitelerin aynı temayı kullandığı, ancak her birinin bir kayıt sayfası olduğu durumu ele alacağız. Sitelerin dili (İngilizce ve Rusça) farklıdır, bu nedenle kayıt sayfası sitenin "yerel" dilinde görüntülenecektir. Siteler farklı temalar kullanıyorsa, her şey ne tür temalar olduklarına, aynı düzenin onlara uygun olup olmadığına (sizi tüm temalarınızı birleştirmeye zorlayabilecek harika bir durum) veya sayfaları tek tek çalışmaya değip değmeyeceğine bağlı olacaktır.

function.php'ye alternatif

Dosya sırası

MU eklentileri, size mantıklı görünen herhangi bir sayıda dosya ve yapı içerebilir. Bu hiyerarşi gibi bir şeye bağlıyım:

| mu-eklentileri | | yük.php | | selena ağı | | | kayıt | | | | eklenti.php | | | ... | | | jet çantası | | | | eklenti.php

load.php dosyası çevirileri ve gerekli tüm "eklentileri" içerir:

// MU eklentileri için çevirileri yükle load_muplugin_textdomain ("selena_network", "/ selena-network / diller /"); // Kayıt sayfası için işlevsellik için WPMU_PLUGIN_DIR gerekir. "/selena-network/signup/plugin.php"; // Başka bir eklenti // WPMU_PLUGIN_DIR gerektirir ...

Eklenti klasörleri, selena-network dizini içinde saklanır. Her birinin load.php içine dahil ettiğimiz kendi plugin.php dosyası vardır. Bu, acil durumda çalışan bir projedeki bireysel bileşenleri anında devre dışı bırakma ve etkinleştirme esnekliği ve yeteneği sağlar.

Kayıt sayfası

Kodu nereye ve nasıl yazacağımızı anladıktan sonra kayıt sayfasını oluşturmaya geçebiliriz.

Normal bir arayüz üzerinden example.org/signup/ adresinde bir sayfa oluşturalım. Adres olarak projenize uygun görünen herhangi bir URL'yi kullanabilirsiniz.

Gerekli kayıt sayfasına yönlendirin

WordPress'in bizim hakkında bilgi sahibi olmasını sağlamak için yeni sayfa kayıt olun ve ona bir yönlendirme yapın, "Kayıt Ol" bağlantısını tıkladığınızda wp_signup_location filtresi kullanılır. wp-login.php içinde bulunabilir ve wp-signup.php'ye varsayılan yönlendirmeden sorumludur.

Case "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); çıkış; // ...

Hatırladığınız gibi, varsayılan olarak, ağın ana etki alanında kayıt sayfası açılır. Bu nedenle burada network_site_url() kullanılmıştır.

Mevcut sitedeki kayıt sayfasının adresini döndürecek olan mu-plugins / selena-network / signup / plugin.php içindeki filtreye işleyicimizi ekleyelim:

fonksiyon selena_network_signup_page ($ url) (home_url'ye dön ("kaydolma"));) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network, çarpışmaları önlemek için sitemdeki MU eklentilerinin içindeki tüm işlevlerin adlarında kullandığım önek, kendi benzersiz önekimle değiştirilmelidir. Filtrenin önceliği 99'dur çünkü bbPress ve BuddyPress gibi bazı eklentiler bu URL'nin üzerine kendi URL'lerini yazabilir (MU eklentileri normal eklentilerden daha erken yüklenir, yukarıya bakın).

network_site_url ()'den farklı olarak, ağın ana sitesini değil, mevcut sitenin adresini döndüren home_url () öğesinin kullanıldığını unutmayın.

İşlevsellik wp-signup.php

wp-signup.php dosyası birçok işlev ve kod içerir. Büyük resmi görmek için kod katlamayı kullanabilirsiniz. Buna İngilizce'de genellikle "kod katlama" denir.

Dosyanın en başında 1'den 80 satıra kadar (sürüm 4.1.1'de), sayfanın "başlangıcı"nın çeşitli kontrolleri ve çıktıları get_header () kullanılarak gerçekleştirilir.

Daha sonra, birçok yöntem bildirilir ve onlarla çalışmaya başlamadan önce, her bir işlevin ne yaptığını anlamaya değer. Bunların çoğu genellikle, içinde wpmu_ öneki olan diğer işlevleri kullanır ve bunların tümü wp-includes / ms-functions.php dosyasında bildirilir. Kodu kendiniz görmeden bu bölümü anlamak zor. Aşağıda, zorluklarla karşılaşmanız durumunda ana işlevlerin kısa bir açıklaması bulunmaktadır.

  • wpmu_signup_stylesheet () - Kayıt sayfasında ek CSS çıktısı alır.
  • show_blog_form () - site kaydı için alanlar (adres, ad, arama motorları için görünürlük).
  • validate_blog_form () - wpmu_validate_blog_signup () kullanarak girilen site adresini ve adını doğrulayın.
  • show_user_form () - kullanıcı kaydı için alanlar (oturum açma ve e-posta adresi).
  • validate_user_form () - girilen oturum açma ve e-posta adresinin doğrulanması. wpmu_validate_user_signup () kullanarak posta.
  • signup_another_blog () - sitede zaten kayıtlı olan kullanıcılar için show_blog_form () kullanarak yeni siteler kaydetmek için alanlar.
  • validate_another_blog_signup () - validate_blog_form () kullanarak site url'sini ve başlığını doğrular.
  • signup_user (), kayıt sayfası alanlarını görüntülemek için ana işlevdir.
  • validate_user_signup () - kullanıcı adını ve e-posta adresini doğrular. validate_user_form () kullanarak posta.
  • signup_blog () - show_blog_form () kullanarak sitenin adresini, adını ve görünürlüğünü girmek için alanlar (kaydın ikinci adımı).
  • validate_blog_signup () - giriş, e-posta adresini kontrol eder. posta, adres ve site adı.

wp-signup.php dosyasının en altında (sürüm 4.1.1'deki 646 satırından), yukarıda açıklanan tüm yöntemleri kullanan kayıt sayfasının ana mantığı. Kodun bu kısmı bir fonksiyona taşınmaz. Sonunda get_footer() çağrılır.

wp-signup.php'nin işlevselliğini kopyalayın

Daha sonra, wp-signup.php dosyasını MU eklentilerine kopyalama ve "çatal" üzerinde değişiklik yapma prosedürünü anlatacağız. Belki de bu gitmek için doğru yol gibi görünmeyebilir. Bunun yerine, normal işlevler yerine sınıfları kullanarak kendi form doğrulamanızı yazabilir ve işlevleri sıfırdan görüntüleyebilirsiniz. Bence wp-signup.php sayfamız için gerekli tüm mantığa zaten sahip, geriye sadece küçük değişiklikler yapmak kalıyor.

WordPress'i güncellediğinizde, wp-signup.php zaman zaman değişir, ancak bu, her sürümde çatalınızı senkronize etmeniz gerektiği anlamına gelmez. wp-signup.php içindeki işlevler aslında yalnızca HTML çıktısı, veri doğrulama, hesap ve site oluşturma, ms-functions.php içinde bildirilen wpmu_ önekine sahip yöntemler ile ilgilidir.

Sayfada kayıt formunu gösterecek bir fonksiyon oluşturmaya başlayalım. Bunu yapmak için wp-signup.php dosyasını WordPress kökünden mu-plugings / selena-network / signup / dizinine kopyalayın. Onu mu-plugins/selena-network/signup/plugin.php içine bağlayalım).

WPMU_PLUGIN_DIR gerektirir. "/selena-network/signup/wp-signup.php";

Kopyalanan dosyanın en başından tüm gerekli ve gereksiz kontrolleri kaldırın. 4.1.1 sürümünde, 1'den 80 satıra kadar olan tüm kod budur.

Artık kayıt formunu görüntülemek için ana işlevi oluşturmaya hazırız. Bunu yapmak için, tüm mantığı 646 satırından dosyanın en sonuna kadar selena_network_signup_main adlı bir işleve taşıyın. En sonunda, iki ekstra kapanışı kaldıracağız

(satır 722 ve 723), ayrıca get_footer() çağrısı.

Yeni oluşturulan selena_network_signup_main() içinde, en başta, bu dosyadan diğer tüm yöntemler tarafından kullanılan global active_signup değişkenini bildiriyoruz. Ve dosyanın en başından kaldırdığımız Before_signup_form olayına bir çağrı ekleyin.

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

Şimdi geriye kalan tek şey, gerekli olan tüm yerlerde düzeni değiştirmek ve kayıt sayfası hazır.

Kayıt formunun çıktısı

Burada en az iki seçenek var. Daha uygun bir yol, bir kısa kod oluşturmak ve normal bir düzenleyici kullanarak sayfaya yerleştirmektir.

// Bir kısa kod oluşturun network_signup add_shortcode ("network_signup", "selena_network_signup_main");

İkinci seçenek, alt tema klasöründe bir page-signup.php sayfa şablonu oluşturmaktır. "Kaydol" kelimesi yerine, sayfaya atanmış benzersiz bir kimlik kullanabilirsiniz. Şablonun içine gerekli düzeni ekleyin ve doğru yerde selena_network_signup_main () öğesini çağırın.

Sonuç olarak, kayıt sayfam çok daha iyi ve temiz görünüyor.

Aktivasyon sayfası

Varsayılan olarak, WordPress, Multisite'daki kayıt sürecini geleneksel olarak iki adıma böler - sitede bir form doldurma ve bir e-postayla gönderilen bağlantıya tıkladığınızda bir hesabı etkinleştirme. Önceki bölümde oluşturulan formu doldurduktan sonra, WordPress, hesabınızı etkinleştirmek için küçük bir talimat ve bir bağlantı içeren bir e-posta gönderir.

WordPress kök dizininde bulunan wp-activate.php dosyası, aktivasyon sayfasının görüntülenmesinden sorumludur. wp-activate.php de tamamen değiştirilebilir. İşlem, wp-signup.php için zaten yaptığımıza benzer.

Normal bir arayüz üzerinden bir example.org/activate/ sayfası oluşturalım. Adres için uygun bulduğunuz URL'yi kullanın.

wp-activate.php dosyasını MU eklentilerimize kopyalayalım ve mu-plugins/selena-network/signup/plugin.php dizinine bağlayalım.

WPMU_PLUGIN_DIR gerektirir. "/selena-network/signup/wp-activate.php";

wp-signup.php'den farklı olarak içeride çok fazla içerik yok. Dosya tek işlemi gerçekleştirir - doğru anahtar alındığında hesabı etkinleştirir ve bir hata mesajı veya işlemin başarıyla tamamlandığını görüntüler.

Gereksiz tüm kontrolleri kaldıralım ve WordPress 4.1.1'de 1'den 69 satıra kadar gerekli olanları kaldıralım. En sonunda get_footer() çağrısını kaldıralım. İçeriğin geri kalanını selena_network_activate_main () işlevine taşıyın.

WP_INSTALLING sabitinin WordPress (wp-load.php) yüklenmeden önce burada bildirildiğini belirtmek ilginçtir. Varlığı, WordPress'in eklentileri yüklememesini sağlar.

Kayıt sayfasında olduğu gibi, geriye kalan tek şey, gerektiğinde düzeni düzeltmektir. Görüntülenen mesajların metnini de değiştirebilirsiniz (bu durumda, MU eklentilerinizin metin alanını tüm çevirmen işlevlerine eklemeyi unutmayın, varsayılan olarak hiçbir yere yüklenmez).

Hazır işlevi, bir alt temada bir kısa kod veya ayrı bir şablon aracılığıyla önceden oluşturulmuş bir sayfada kullanılabilir.

Doğru bağlantılara sahip aktivasyon e-postaları

Aktivasyon sayfası kullanıma hazır, ancak WordPress bunu bilmiyor ve yine de wp-activate.php bağlantısı içeren aktivasyon e-postaları gönderecek. wp-signup.php'den farklı olarak, burada adresi değiştirmenize izin verecek bir filtre yoktur. Bunun yerine, e-postaları doğru bağlantılarla gönderecek kendi işlevinizi yazmanız gerekir.

Kayıt sayfasındaki formu doldurup gönderirken, WordPress wpmu_signup_ öğesini çağırır. kullanıcı() veya wpmu_signup_ Blog() kayıt türüne bağlı olarak. Her iki işlev de oluşturur Yeni giriş wp_signups tablosunda, aralarında bir hesap etkinleştirme anahtarının bulunduğu gerekli içerikle doldurun.

Ardından, işleve bağlı olarak wpmu_signup_ çağrılır. kullanıcı _notification () veya wpmu_signup_ Blog _bildirim (). Her iki işlevin de benzer işlevleri vardır - etkinleştirme bağlantısı içeren bir e-posta oluşturur ve gönderirler, ancak farklı argümanları kabul ederler. Her ikisinin de olayı "kesmek" için filtreleri vardır.

Eğer (! Apply_filters ("wpmu_signup_user_notification", $ user, $ user_email, $ key, $ meta)) false döndürür;

Bir blog oluşturarak hesapları etkinleştirmek için:

If (! Apply_filters ("wpmu_signup_blog_notification", $ domain, $ path, $ title, $ user, $ user_email, $ key, $ meta)) (return false;)

Geriye kalan tek şey, içinde wp_mail () aracılığıyla e-posta gönderen kendi işleyicilerinizi yazmak ve en sonunda, WordPress'in iki kez bir etkinleştirme e-postası göndermemesi için yanlış verdiğinizden emin olun - biri sizin, diğeri varsayılan wp-activate.php bağlantısı içeren e-posta.

fonksiyon selena_network_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta = array()) (// E-postanın başlığını, metnini ve başlıklarını oluşturun // ... // E-postayı gönderin veya göndermek için bir Cron görevi ekleyin email wp_mail ($ user_email , wp_specialchars_decode ($ konu), $ mesaj, $ message_headers); // WordPress'in aktivasyon e-postasını iki kez göndermemesi için false gönder false döndür;) add_filter ("wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification", 10, 4);

Bir SMTP sunucusu üzerinden e-posta gönderiyorsanız veya kayıt sayısı çok fazlaysa, anında e-posta göndermemeyi düşünmelisiniz. Bunun yerine, WordPress Cron kullanarak Cron görevleri ekleyebilirsiniz.

wp-signup.php ve wp-activate.php'ye erişimi kapatma

Kendi kayıt ve aktivasyon sayfalarınızı oluşturduktan sonra "orijinalleri" kapatmanız gerekebilir. Örneğin, kayıt sayfasında doldurulması gereken ek alanlar varsa. Ayrıca, birçok WordPress sitesi spam kayıtlarına tabidir.

İki sorunu tek adımda çözmek için bu sayfaları açmaya çalışırsanız Apache'den 404 döndürmesini isteyebilirsiniz. Bunu yapmak için, yapılandırma dosyanıza veya .htaccess'inize birkaç ek RewriteRule kaydetmeniz yeterlidir.

RewriteBase'de RewriteEngine / # Bilgi düzenli ifadeler asla gereksiz olmayacak :) RewriteRule ^ wp-signup \ .php - RewriteRule ^ wp-activate \ .php - # BEGIN WordPress # Varsayılan WordPress kurallarına dokunmayın :) # ... # END WordPress

Çözüm

İnternette bunun ve WordPress ile ilgili diğer birçok "sorun" için birçok çözüm var. Örneğin, kayıt ve aktivasyon sayfaları oluşturmak için bazıları orijinal wp-signup.php ve wp-activate.php dosyalarının yeniden yazılmasını önerir. Bunu yapmaya değmez, çünkü WordPress'i güncellerseniz, dosyalarda yapılan tüm değişiklikleri kaybedersiniz ve ayrıca çekirdek bütünlüğünü kontrol edemezsiniz.

Herhangi bir eklenti, tema veya çözüm geliştirirken WordPress'in içinde neler olup bittiğini anlamak için biraz zaman harcamalısınız. Bunun için birçok yararlı hata ayıklama aracı vardır.

not

Yeni kullanıcılara otomatik olarak farklı roller atamak için Multisite User Management eklentisini kullanabilirsiniz.

Makaleyi okuduktan sonra kayıt ve aktivasyon sayfalarının oluşturulması sırasında herhangi bir sorunuz veya zorluğunuz varsa, yorum bırakın ve kesinlikle cevaplayacağız.

27.03.2015 27.03.2015

WordPress geliştiricisi. Her şeyde düzeni sever ve yeni araçları anlar. Symfony bileşen mimarisinden esinlenilmiştir.

  • Bugün, Ekim ayının sonunda internette hızla yayılan popüler CMS Joomla'daki kritik 1 günlük güvenlik açığının istismarını ele alacağız. Güvenlik açıklarını sayılarla konuşacağız CVE-2016-8869, CVE-2016-8870 ve CVE-2016-9081... Üçü de, beş uzun yıl boyunca çerçevenin bağırsaklarında çürüyen, serbest kalma saatini bekleyen ve beraberinde kaos, saldırıya uğramış siteler ve bu Joomla'nın masum kullanıcılarının gözyaşlarını getiren tek bir kod parçasından geliyor. Sadece gözleri monitörlerin ışığından kıpkırmızı olan ve klavyeleri ekmek kırıntılarıyla dolu olan en cesur ve cüretkar geliştiriciler, azgın kötü ruhlara meydan okuyabilir ve başlarını düzeltmeler sunağına koyabilirdi.

    UYARI

    Tüm bilgiler yalnızca bilgilendirme amaçlıdır. Bu makalenin materyallerinden kaynaklanabilecek olası zararlardan ne yayın kurulu ne de yazar sorumlu değildir.

    Her şey nasıl başladı

    6 Ekim 2016'da Demis Palma, Stack Exchange'de bir konu oluşturdu ve şunu sordu: Aslında, Joomla sürüm 3.6'da neden aynı ada sahip kullanıcıları kaydetmek için iki yöntem var register ()? Birincisi UsersControllerRegistration'da, ikincisi UsersControllerUser'da. Damis, UsersControllerUser :: register () yönteminin bir yerde kullanılıp kullanılmadığını veya bunun sadece eski mantıktan kalan evrimsel bir anakronizm olup olmadığını bilmek istedi. Bu yöntemin herhangi bir görünüm tarafından kullanılmasa bile, oluşturulan bir istekle yine de çağrılabileceği konusunda endişeliydi. Buna, sorunun gerçekten var olduğunu doğrulayan itoctopus takma adı altında bir geliştiriciden yanıt aldım. Ve Joomla geliştiricilerine bir rapor gönderdi.

    Diğer olaylar en hızlı şekilde gelişti. 18 Ekim'de Joomla Geliştiricileri, o zamana kadar kullanıcı kaydına izin vermek için bir PoC çizen Damis'in raporunu kabul ediyor. Web sitesinde, bulduğu sorunu ve bu konudaki düşüncelerini özetlediği bir not yayınladı. Aynı gün çıkıyor yeni bir versiyon Hala savunmasız kod içeren Joomla 3.6.3.

    Bundan sonra, Davide Tampellini, hatayı basit bir kullanıcının değil, bir yöneticinin kayıt durumuna çözer. Ve zaten 21 Ekim'de Joomla güvenlik ekibine yeni bir vaka geldi. Zaten ayrıcalık yükseltme hakkında konuşuyor. Aynı gün, Joomla sitesinde 25 Ekim Salı günü bir sonraki sürümün aşağıdakilerle birlikte yayınlanacağına dair bir duyuru görünür. seri numarası 3.6.3, sistem çekirdeğindeki kritik bir güvenlik açığını giderir.

    25 Ekim'de Joomla Güvenlik Saldırısı Ekibi, Damis'in keşfettiği bir kod parçası tarafından oluşturulan en son sorunu bulur. Ardından, 21 Ekim tarihli, göze çarpmayan Hazırla 3.6.4 Kararlı Sürüm adıyla bir taahhüt, talihsiz hatayı düzelten resmi Joomla deposunun ana şubesine gönderilir.

    Bu açıklamanın ardından, çok sayıda ilgili kişi geliştiricilerin toplantısına bağlanır - güvenlik açığını çözmeye ve açıklardan yararlanmaya hazırlanmaya başlarlar.

    27 Ekim'de, araştırmacı Harry Roberts, Xiphos Research deposuna, savunmasız bir CMS'ye sahip bir sunucuya bir PHP dosyası yükleyebilen hazır bir istismar yükledi.

    Detaylar

    Pekala, arka planla işimiz bitti, hadi en ilginç kısma geçelim - güvenlik açığının analizi. Test sürümü olarak Joomla 3.6.3'ü kurdum, bu nedenle tüm satır numaraları bu özel sürümle alakalı olacaktır. Ve aşağıda gördüğünüz dosyaların tüm yolları, kurulu CMS'nin köküne göre gösterilecektir.

    Damis Palma'nın bulması sayesinde sistemde kullanıcı kaydı gerçekleştiren iki yöntem olduğunu biliyoruz. İlki CMS tarafından kullanılır ve /components/com_users/controllers/registration.php:108 dosyasında bulunur. İkincisi (aramamız gereken) /components/com_users/controllers/user.php:293 içinde yaşıyor. Daha yakından bakalım.

    286: / ** 287: * Bir kullanıcıyı kaydetme yöntemi. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: * / 293: public function register () 294: (295: JSession :: checkToken ("post") veya jexit (JText :: _ ("JINVALID_TOKEN")); ... 300: // Form verilerini alın 301: $ data = $ this-> input-> post-> get ("user", array (), "array");. .. 315: $ dönüş = $ model-> doğrula ($ form, $ veri); 316: 317: // Hataları kontrol edin 318: if ($ dönüş === yanlış) 319: (... 345: / / Kaydı tamamlayın.346: $ return = $ model-> register ($ data);

    Burada sadece ilginç satırlar bıraktım. Güvenlik açığı bulunan yöntemin tam sürümü Joomla deposunda görüntülenebilir.

    Normal kullanıcı kaydı sırasında ne olduğunu anlayalım: hangi veriler gönderilir ve nasıl işlenir. Ayarlarda kullanıcı kaydı etkinleştirilmişse, form http://joomla.local/index.php/component/users/? Görünüm = kayıt adresinde bulunabilir.


    Meşru bir kullanıcı kayıt isteği aşağıdaki ekran görüntüsüne benzer.


    com_users bileşeni, kullanıcılarla çalışmaktan sorumludur. İstekteki görev parametresine dikkat edin. $ controller biçimindedir. $ Method. Dosya yapısına bir göz atalım.

    Klasördeki komut dosyalarının adları kontrolörlerçağrılan denetleyicilerin adlarına karşılık gelir. İsteğimiz artık $ controller = "registration" içerdiğinden, dosya çağrılacak kayıt.php ve onun register() metodu.

    Dikkat, soru: koddaki bir güvenlik açığına kayıt işlemi nasıl geçirilir? Muhtemelen zaten tahmin ettin. Savunmasızların ve gerçek yöntemlerin adları aynıdır (kayıt), bu yüzden çağrılan denetleyicinin adını değiştirmemiz yeterlidir. Savunmasız denetleyici nerede bulunur? Bu doğru, dosyada kullanıcı.php... $ controller = "user" çıkıyor. Hepsini bir araya getirmek ve görev almak = user.register. Artık kayıt talebi ihtiyacımız olan yöntemle işleniyor.


    Yapmamız gereken ikinci şey, verileri doğru biçimde göndermek. Burada her şey basit. Meşru kayıt () bizden, kayıt için veri ilettiğimiz jform adlı bir dizi - ad, giriş, şifre, posta (istekle birlikte ekran görüntüsüne bakın) bekliyor.

    • /components/com_users/controllers/registration.php: 124: // Kullanıcı verilerini alın. 125: $ requestData = $ this-> input-> post-> get ("jform", dizi (), "dizi");

    Koğuşumuz bu verileri user adlı bir diziden alır.

    • /components/com_users/controllers/user.php: 301: // Form verilerini alın. 302: $ data = $ this-> input-> post-> get ("kullanıcı", dizi (), "dizi");

    Bu nedenle, istekteki tüm parametrelerin adlarını jfrom user olarak değiştiriyoruz.

    Üçüncü adımımız, geçerli bir CSRF jetonu bulmaktır, çünkü onsuz kayıt olmayacaktır.

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

    Bir MD5 karmasına benziyor ve bunu örneğin /index.php/component/users/?view=login sitesindeki yetkilendirme formundan alabilirsiniz.


    Artık istediğiniz yöntemle kullanıcı oluşturabilirsiniz. Her şey yolunda gittiyse, tebrikler - bir güvenlik açığından yararlandınız CVE-2016-8870"Yeni kullanıcıları kaydetmek için izin kontrolü eksik."

    UsersControllerRegistration denetleyicisinden "working" register () yönteminde şu şekilde görünür:

    • /components/com_users/controllers/registration.php: 113: // Kayıt devre dışıysa - Oturum açma sayfasına yönlendirin. 114: if (JComponentHelper :: getParams ("com_users") -> get ("allowUserRegistration") == 0) 115: (116: $ this-> setRedirect (JRoute :: _ ("index.php? Option = com_users & görünüm = oturum açma ", false)); 117: 118: false döndür; 119 :)

    Ve böylece savunmasız durumda:

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

    Evet, mümkün değil.

    İkinciyi anlamak için, çok daha fazlası Ciddi bir problem, oluşturduğumuz isteği göndereceğiz ve kodun çeşitli bölümlerinde nasıl yürütüldüğünü izleyeceğiz. İşte, çalışan bir yöntemde kullanıcı tarafından gönderilen verileri doğrulamaktan sorumlu olan bir yığın:

    Devam sadece katılımcılara açıktır

    Seçenek 1. Sitedeki tüm materyalleri okumak için "site" topluluğuna katılın

    Belirtilen süre boyunca topluluğa üyelik, TÜM Hacker malzemelerine erişmenizi sağlayacak, kişisel kümülatif indiriminizi artıracak ve profesyonel bir Xakep Puanı kazanmanıza izin verecektir!

    Tek seferlik bağlantılar çeşitli durumlarda kullanılabilir: bir dosyaya veya sayfaya geçici erişim sağlamak veya kaydı onaylamak için. Bu eğiticide, tek kullanımlık URL'lerin nasıl oluşturulacağını ve yerleştirileceğini göstereceğiz.

    URL oluşturma

    Diyelim ki sitemizde bir kullanıcı doğrulama sistemimiz var. Kayıttan sonra, kullanıcıdan e-posta doğrulama prosedüründen geçmesini istiyoruz. Bu tür bağlantılar oluşturmak için özel belirteç parametresini kullanabiliriz. Böyle bir bağlantının bir örneği:

    Http: //example.com/activate? Jeton = ee97780 ...

    Burada bir veritabanı olmadan yapamayız, o yüzden birlikte çalışacağımız tabloya bir göz atalım.

    CREATE TABLE bekleyen_kullanıcılar (belirteç CHAR (40) NULL DEĞİL, kullanıcı adı VARCHAR (45) NULL DEĞİL, tstamp INTEGER UNSIGNED NULL DEĞİL, BİRİNCİL ANAHTAR (belirteç));

    Tabloda 3 alan saklayacağız: jeton, kullanıcı adı ve zaman. Belirteci oluşturmak için, 40 karakterlik bir dizi çıktısı veren sha1 () işlevini kullanacağız. tstamp alanı, süresi dolmuş bağlantıları izleyebilmemiz için belirtecin oluşturulduğu zamanı saklayacaktır.

    Belirteç oluşturmanın birçok yolu vardır, ancak bu eğitimde uniqid() ve sha1() işlevlerini kullanacağız. Belirtecin nasıl oluşturulduğuna bakılmaksızın, oluşturulan değerlerin farklı olduğundan ve yineleme olasılığının minimum olduğundan emin olun.

    $ jeton = sha1 (uniqid ($ kullanıcı adı, doğru));

    uniqid () işlevi, parametre olarak bir dize alır ve iletilen argümana ve geçerli zamana göre benzersiz bir tanımlayıcı verir. Ayrıca, ikinci argüman olarak, bu işlev, değerin benzersiz olma olasılığını artırmak için bazı ekstra karakterler eklemek için uniqid sinyalini verecek olan bir boole değeri alır. sha1 işlevi benzersiz bir tanımlayıcı alır ve bir karma oluşturur.

    Bu iki fonksiyon çalıştıktan sonra, url adresleri oluşturmak için kullanabileceğimiz benzersiz bir jetonumuz olacak. Şimdi veritabanına eklememiz gerekiyor:

    $ sorgu = $ db-> hazırla ("INSERT INTO bekleyen_users (kullanıcı adı, belirteç, tstamp) DEĞERLER (?,?,?)"); $ sorgu-> yürüt (dizi ($ kullanıcı adı, $ jeton, $ _SERVER ["REQUEST_TIME"]));

    Hangi kullanıcının etkinleştirilmesi gerektiğini bilmemiz için kullanıcı adı da tabloya kaydedilecektir. Gerçek bir site için daha uygun bir örnekte, bir kullanıcı kimliği kullanabilirsiniz.

    Artık ihtiyacımız olan tüm bilgilere sahip olduğumuza göre, geçici bir url oluşturabiliriz:

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

    $ mesaj =<<

    muayene

    Şimdi, kontrolü gerçekleştireceğimiz bir komut dosyasına ihtiyacımız var. Tek yapmamız gereken, url adresindeki belirteci ve veritabanındaki belirteci karşılaştırmak. Varsa ve ömrü dolmadıysa, her şey yolunda demektir.

    // belirteci al if (isset ($ _ GET ["token"]) && preg_match ("/ ^ (40) $ / i", $ _GET ["belirteç"])) ($ belirteci = $ _GET ["belirteç "] ;) else (yeni İstisnayı atın ("belirteç geçerli değil.");) // belirteci kontrol edin $ sorgu = $ db-> hazırla ("Kullanıcı adını SEÇ, tstamp FROM wait_users WHERE belirteci =?"); $ sorgu-> yürüt (dizi ($ belirteci)); $ satır = $ sorgu-> getir (PDO :: FETCH_ASSOC); $ sorgu-> closeCursor(); if ($ satır) (özüt ($ satır);) else (yeni İstisna at ("belirteç geçerli değil.");) // kullanıcı hesabını etkinleştir // ... // belirteci veritabanından kaldır $ sorgu = $ db- > hazırla ("pending_users WHERE kullanıcı adı =? AND belirteci =? AND tstamp =?", $ sorgu-> yürüt (dizi ($ kullanıcı adı, $ jeton, $ tstamp));

    Ayrıca, kullanım ömrü sona eren jetonların doğrulanmasını sağlamamız gerekiyor:

    // Saniye cinsinden 1 gün = 60 saniye * 60 dakika * 24 saat $ delta = 86400; // kontrol edin ($ _SERVER ["REQUEST_TIME"] - $ tstamp> $ delta) (yeni İstisna atın ("belirtecin süresi doldu.");) // kullanıcı hesabını etkinleştirin // ...

    Böylece iki kontrolümüz olacak: biri belirtecin geçerliliği için, diğeri ise varlığı süresince.

    Sonuç

    Bu yöntem sadece aktivasyon için kullanılamaz hesaplar kullanıcılar için değil, aynı zamanda diğer ihtiyaçlar için de geçerlidir: örneğin, bazı kaynaklara veya hizmetlere bir kerelik veya geçici erişim sağlamak.

    Tüm bunların üzerine, daha önce hiç kullanmadığınız belirteçleri kaldıracak bir komut dosyası oluşturabilirsiniz. Bu betiği zaman zaman kendiniz çalıştırabilir veya bunun için cron kullanabilirsiniz.