نحوه ایجاد صفحه ثبت نام خود را در Multisite وردپرس. نحوه ایجاد صفحه ثبت نام خود را در پاداش Multisite WordPress. حفاظت در برابر اسپم ها

لینک های یکبار مصرف می توانند در شرایط مختلف مورد استفاده قرار گیرند: به منظور دسترسی موقت به فایل یا صفحه یا تأیید ثبت نام. در این درس، ما نشان خواهیم داد که چگونه یک آدرس URL یکبار مصرف را تولید و پیاده سازی کنیم.

ایجاد URL

فرض کنید سایت ما دارای سیستم تأیید هویت کاربر است. پس از ثبت نام، از کاربر می خواهیم که روش تأیید ایمیل را منتقل کند. برای ایجاد چنین پیوندهایی می توانیم از پارامتر خاص TOKEN استفاده کنیم. یک مثال از چنین لینک:

http: //example.com/activate؟ token \u003d ee97780 ...

بدون یک پایگاه داده، ما نمی توانیم در اینجا انجام دهیم، بنابراین اجازه دهید به میز نگاه کنیم که ما کار خواهیم کرد.

ایجاد جدول pending_users (token char (40) null، نام کاربری varchar (45) null، tstamp integer unsigned null، کلید اولیه (نشانه)؛

در جدول ما 3 فیلد را ذخیره خواهیم کرد: نشانه، نام کاربری و زمان. برای تولید یک نشانه، ما از تابع sha1 () استفاده خواهیم کرد، که یک رشته از 40 کاراکتر را می دهد. فیلد TSTAMP زمان تولید نشانه را ذخیره می کند تا بتوانیم لینک ها را با یک خروجی پیگیری کنیم.

راه های زیادی برای تولید نشانه وجود دارد، اما در این درس ما از توابع UNIQID () و SHA1 () استفاده خواهیم کرد. صرف نظر از روش تولید یک نشانه، اطمینان حاصل کنید که ارزش های تولید شده متفاوت خواهد بود و احتمال تکراری حداقل است.

$ token \u003d sha1 (UNIQID ($ username، true))؛

به عنوان یک پارامتر، تابع Uniqid () رشته را می گیرد، و خروجی یک شناسه منحصر به فرد بر اساس استدلال منتقل شده و زمان کنونی ارائه می دهد. همچنین، به عنوان یک استدلال دوم، این تابع یک مقدار بولین دریافت می کند که سیگنال Uniqid را برای اضافه کردن چندین کاراکتر اضافی برای افزایش احتمال ارزش منحصر به فرد می دهد. ویژگی SHA1 یک شناسه منحصر به فرد را می گیرد و یک هش را ایجاد می کند.

پس از کار بر روی دو توابع، ما یک نشانه منحصر به فرد داریم که می تواند برای تولید آدرس های URL استفاده کند. حالا ما باید آن را در پایگاه داده قرار دهیم:

$ query \u003d $ db-\u003e آماده سازی ("وارد کردن به pending_users (نام کاربری، علامت گذاری، tstamp) (؟،؟)")؛ $ query-\u003e اجرای (Array ($ username، $ token، $ _server ["request_time"]))؛

به منظور اینکه ما بدانیم که کدام کاربر باید فعال شود، ما به جدول ضبط و وارد سیستم خواهیم شد. در یک مثال، بیشتر برای یک وب سایت واقعی سازگار است، می توانید از شناسه کاربری استفاده کنید.

حالا که ما تمام اطلاعات لازم را داریم، می توانیم یک آدرس ایمیل موقت ایجاد کنیم:

$ url \u003d "http://example.com/activate.php؟token\u003d$Token؛

$ message \u003d.<<

بررسی

در حال حاضر ما به یک اسکریپت نیاز داریم، به لطف که ما بررسی خواهیم کرد. همه ما باید انجام دهیم این است که علامت را از آدرس URL و نشانه از پایه مقایسه کنید. اگر چنین چیزی وجود داشته باشد، زمان زندگی او منقضی نشده است، پس همه چیز خوب است.

// دریافت اگر token (isset ($ _ get ["token"]) && preg_match ("/ ^ (40) $ / i"، $ _GET [token])) ($ token \u003d $ _GET ["token" ]؛) دیگر (پرتاب استثناء جدید ("Tocken معتبر نیست")؛) // بررسی $ query \u003d $ db-\u003e آماده سازی نشانه ("انتخاب نام کاربری، tstamp از penden_users که در آن token \u003d؟")؛ $ query-\u003e اجرای (آرایه ($ token))؛ $ row \u003d $ query-\u003e fetch (PDO :: fetch_assoc)؛ $ query-\u003e closecursor ()؛ اگر ($ ردیف) (Extract ($ ردیف)؛) else (پرتاب استثناء جدید ("Tocken معتبر نیست.")؛) // فعال کردن حساب کاربری // ... // حذف نشانه از پایه $ query \u003d $ db\u003e آماده سازی ("حذف از pending_users که در آن نام کاربری \u003d؟ و token \u003d؟ و tstamp \u003d؟"،)؛ $ query-\u003e اجرای (Array ($ username، $ token، $ tstamp))؛

ما همچنین نیاز به ارائه تست نشانه ها، طول عمر آن منقضی شده است:

// 1 روز در ثانیه \u003d 60 ثانیه * 60 دقیقه * 24 ساعت $ delta \u003d 86400؛ // بررسی اگر ($ _server ["request_time"] - $ tstamp\u003e $ delta) (پرتاب استثنا جدید ("Tocken Lifetime منقضی شده است.)؛) // فعال کردن حساب سفارشی // ...

بنابراین، ما دو چک داریم: یکی در اعتبار نشانه، دیگری در زمان وجود آن.

نتیجه

این روش را می توان نه تنها برای فعال کردن حساب های کاربر، بلکه همچنین در نیازهای دیگر نیز اعمال کرد: به عنوان مثال، برای دسترسی به یک یا موقت به یک منبع یا خدمات.

علاوه بر این، شما می توانید یک اسکریپت ایجاد کنید که نشانه هایی را که هرگز استفاده نکرده اند حذف کنید. این اسکریپت را می توان از زمان به زمان راه اندازی کرد یا برای این CRON درخواست کرد.

Segal ما بهره برداری از آسیب پذیری بحرانی 1day را در CMS محبوب جوملا، که در پایان ماه اکتبر در اینترنت قرار گرفت، در نظر خواهیم گرفت. این در مورد آسیب پذیری با اعداد خواهد بود CVE-2016-8869, CVE-2016-8870. و CVE-2016-9081. هر سه از یک قطعه کد رخ می دهد، که یک بار در عمق چارچوب، منتظر ساعت های خود بود، پس از آن به صورت رایگان آزاد و هرج و مرج را با هرج و مرج، سایت های هک شده و اشک در هر کاربر بی گناه این جوملا به ارمغان بیاورد. تنها توسعه دهندگان شجاع ترین و جسورانه که چشم آنها از نور مانیتورها قرمز هستند و صفحه کلید با خرده نان پوشیده می شود، آنها توانستند عواقب تورم را به چالش بکشد و سر خود را بر روی محراب رفع قرار دهند.

هشدار

تمام اطلاعات صرفا برای اهداف اطلاعاتی ارائه می شود. نه سردبیران و نه نویسنده مسئول هر گونه آسیب احتمالی ناشی از مواد این مقاله نیستند.

چرا همه چیز شروع شد

در 6 اکتبر سال 2016، Damis Palma (Demis Palma) یک موضوع را در مبادله پشته ایجاد کرد، که در واقع، در واقع، در جوملا نسخه 3.6، دو روش برای ثبت نام کاربران با همان نام ثبت نام وجود دارد ()؟ اولین بار در کنترل کننده UserControlerregistration قرار دارد و دوم در UserControlleruser است. Damis می خواست بداند که آیا کاربران Constrolleruser :: Register () از جایی استفاده می شود، یا تنها یک انشعاب تکاملی است که از منطق قدیمی باقی می ماند. او این واقعیت را مختل کرد که حتی اگر این روش در هر ارائه استفاده نشود، می توان آن را با استفاده از یک درخواست تشکیل داد. پاسخ از توسعه دهنده تحت نام مستعار Itoctopus بود، تایید: مشکل واقعا وجود دارد. و یک گزارش را به توسعه دهندگان جوملا ارسال کرد.

بعد، رویدادها سریع ترین راه را توسعه دادند. در 18 اکتبر، توسعه دهندگان جوملا گزارش DAMIS را دریافت می کنند که تا آن زمان POC را به دست آورد، به شما این امکان را می دهد که کاربر را ثبت کنید. او یک یادداشت را در سایت خود منتشر کرد، جایی که به طور کلی در مورد این مسئله و افکار در مورد این موضوع صحبت کرد. در همان روز، نسخه جدید جوملا 3.6.3 بیرون می آید، که هنوز شامل یک کد آسیب پذیر است.

پس از آن، دیوید تامپلینی (Davide Tampellini) اشکال را به وضعیت ثبت نام می رساند یک کاربر ساده نیست، بلکه مدیر است. و در 21 اکتبر، تیم امنیتی جوملا یک پرونده جدید را وارد می کند. این در حال حاضر در مورد افزایش امتیازات صحبت می کند. در همان روز، اعلامیه در وب سایت جوملا ظاهر می شود که در روز سه شنبه، 25 اکتبر، نسخه دیگری با شماره توالی 3.6.3 منتشر خواهد شد، که آسیب پذیری بحرانی را در هسته سیستم اصلاح می کند.

در 25 اکتبر، تیم اعتصاب جوملا، آخرین مشکل را پیدا می کند که یک قطعه کد توسط Damis کشف شده است. سپس در شعبه اصلی جوملا رسمی جوملا، تعهد 21 اکتبر، با نام نامعلوم آماده سازی 3.6.4 نسخه پایدار، که رفع اشکال بدبخت است.

پس از آن، افراد علاقه مند زیادی به انتقال توسعه دهندگان به انتقال توسعه دهندگان متصل می شوند - آنها شروع به افزایش آسیب پذیری و جامد جامد می کنند.

در 27 اکتبر، پژوهشگر هری رابرتز، یک سوء استفاده آماده شده را در مخزن تحقیقاتی Xiphos ارائه می دهد که می تواند یک فایل پی اچ پی را به یک سرور با CMS آسیب پذیر آپلود کند.

جزئیات

خوب، با پیش از تاریخ، به پایان رسید، به جالب ترین چیز بروید - تشخیص آسیب پذیری. به عنوان یک نسخه آزمایشی، جوملا 3.6.3 را نصب کردم، بنابراین تمام اعداد ردیف برای این نسخه مناسب خواهد بود. و تمام مسیرها به فایل هایی که بعدا خواهید دید، نسبت به ریشه CMS نصب شده نشان داده می شود.

با تشکر از پالم Damis Palm، ما می دانیم که دو روش وجود دارد که ثبت نام کاربر را در سیستم انجام می دهند. اولین بار توسط CMS استفاده می شود و در /components/com_users/controllers/comers/controllers/RCistration.php:108 است. دوم (یکی که ما باید تماس بگیرید)، زندگی می کند / components / com_users / controllers / user.php: 293. بیایید به آن نزدیکتر نگاه کنیم.

286: / ** 287: * روش ثبت نام کاربر. 288: 289: * return boolean 290: * 291: * Szaince 1.6 292: * / 293: عملکرد عمومی ثبت نام () 294: (295: JSession :: CheckToken ("پست") یا jexit (jtext :: _ ("jinvalid_token"))؛ ... 300: // دریافت اطلاعات فرم 301: $ data \u003d $ this-\u003e input-\u003e post-\u003e دریافت ("کاربر"، آرایه ()، "آرایه")؛ .. 315: $ return \u003d $ model-\u003e validate ($ فرم، داده های $)؛ 316: 317: // بررسی خطاها. 318: اگر ($ بازگشت \u003d\u003d\u003d FALSE) 319: (... 345: / پایان ثبت نام 346: $ return \u003d $ model-\u003e ثبت نام ($ داده ها)؛

در اینجا من فقط خطوط جالب را ترک کردم نسخه کامل روش آسیب پذیر را می توان در مخزن جوملا مشاهده کرد.

ما آن را فهمیدیم که چه اتفاقی می افتد زمانی که ثبت نام کاربر منظم: چه اطلاعاتی ارسال می شود و چگونه آنها پردازش می شوند. اگر ثبت نام کاربر در تنظیمات فعال شود، فرم را می توان در http: //joomla.local/index.php/component/users/ یافت؟ مشاهده \u003d ثبت نام.


درخواست قانونی برای ثبت نام کاربر به نظر می رسد تصویر زیر است.


اجزای com_users مسئول کار با کاربران است. توجه به پارامتر وظیفه در پرس و جو. این کنترل $ است. روش $ بیایید به ساختار فایل نگاه کنیم.

نام اسکریپت در پوشه کنترل کننده ها. مطابق با نام های کنترل کننده های نامیده می شود. از آنجا که در درخواست ما در حال حاضر $ controller \u003d "ثبت نام"، فایل تماس خواهد گرفت. ثبت نام .php و روش ثبت نام آن.

توجه، سوال: نحوه انتقال پردازش ثبت نام در یک منطقه آسیب پذیر در کد؟ شما احتمالا قبلا حدس زده اید نام روش های آسیب پذیر و فعلی همزمان (ثبت نام)، بنابراین ما فقط می توانیم نام کنترل کننده نامیده می شود. و کجا کنترل کننده آسیب پذیر است؟ درست در فایل user.php.. به نظر می رسد $ controller \u003d "کاربر". ما همه را جمع آوری می کنیم و task \u003d user.register را دریافت می کنیم. در حال حاضر درخواست ثبت نام توسط روش مورد نیاز ما پردازش می شود.


دومین چیزی که ما باید انجام دهیم این است که اطلاعات را در فرمت مناسب ارسال کنیم. همه چیز اینجا ساده است ثبت نام قانونی () منتظر یک آرایه از ما به نام JForm، که در آن ما انتقال داده ها را به ثبت نام - نام، ورود به سیستم، رمز عبور، ایمیل (نگاه کنید به تصویر با یک پرس و جو).

  • /components/com_users/controllers/registration.php: 124: // دریافت اطلاعات کاربر. 125: $ requestdata \u003d $ this-\u003e input-\u003e post-\u003e دریافت ("جگر"، آرایه ()، "آرایه")؛

بخش ما این داده ها را از آرایه به نام کاربر دریافت می کند.

  • /components/com_users/controllers/user.php: 301: // دریافت اطلاعات فرم. 302: $ data \u003d $ this-\u003e input-\u003e post-\u003e دریافت ("کاربر"، آرایه ()، "آرایه")؛

بنابراین، نام تمام پارامترها را با jfrom بر روی کاربر تغییر می دهیم.

سومین مرحله ما این است که یک نشانه معتبر CSRF پیدا کنیم، زیرا هیچ ثبت نام بدون آن وجود نخواهد داشت.

  • /components/com_users/controllers/user.php: 296: JSession :: CheckToken ("پست") یا jexit (jinvalid_token))؛

به نظر می رسد یک هش MD5، و شما می توانید آن را، به عنوان مثال، از فرم مجوز در سایت /index.php/component/users/؟view\u003dlogin.


حالا شما می توانید کاربران را از طریق روش دلخواه ایجاد کنید. اگر همه چیز اتفاق افتاد، من تبریک می گوییم - شما فقط آسیب پذیری را درک کردید CVE-2016-8870. "تایید گمشده مجوز برای ثبت نام کاربران جدید".

در اینجا این است که چگونه در روش "کار" ثبت نام () از کنترل کننده کاربران Constrollerregistration به نظر می رسد:

  • /components/com_users/controllers/registration.php: 113: // اگر ثبت نام غیرفعال باشد - تغییر مسیر به صفحه ورود به سیستم. 114: اگر (jcomponenthelper :: getParams ("com_users") -\u003e دریافت ("allowuserregistration") \u003d\u003d 0) 115: (116: $ این-\u003e setredirect (jroute :: _ ("index.php؟ option \u003d com_users & مشاهده \u003d ورود به سیستم "، false))؛ 117: 118: بازگشت نادرست؛ 119 :)

و به همین ترتیب آسیب پذیر است:

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

بله، به هیچ وجه.

برای درک دوم، مشکل جدی تر، ما یک درخواست را که توسط ما تشکیل شده است، ارسال خواهیم کرد و از نحوه انجام آن در بخش های مختلف کد پیروی می کنیم. در اینجا یک قطعه است که مسئول بررسی داده های ارسال شده توسط کاربر در روش کار است:

ادامه در دسترس تنها به شرکت کنندگان

گزینه 1. پیوستن به جامعه سایت برای خواندن تمام مواد در سایت

عضویت در جامعه در طول دوره مشخص شده، شما را به تمام مواد هکر دسترسی پیدا می کند، تخفیف تجمع شخصی خود را افزایش می دهد و امتیاز نمره XAKEP حرفه ای را جمع آوری می کند!

صفحه ثبت نام خود را برای Multisite به جای استاندارد WP-Signup.php ایجاد کنید.

در تنظیمات معمول WordPress، صفحه ثبت نام (مجوز، بازنشانی رمز عبور) فایل WP-login.php را نمایش می دهد.

  • /wp-login.php - مجوز
  • /wp-login.php؟action\u003dregister - ثبت نام
  • /wp-login.php؟action\u003dlostpassword - تنظیم مجدد رمز عبور

برای Multisite در WP-login.php شرایط جداگانه ای وجود دارد. بنابراین، هنگامی که بر روی لینک /wp-login.php؟action\u003dregister در Multisaite کلیک میکنید، وردپرس به صفحه /wp-signup.php هدایت می شود. در بسیاری از موضوعات، صفحه به نظر بسیار جذاب نیست، بنابراین ما خودمان را خواهیم ساخت.

شبکه اصلی وب سایت

به طور پیش فرض، وردپرس صفحه ثبت نام (WP-Signup.php) را در شبکه اصلی (وب سایت) باز می کند. با این حال، شما می توانید یک صفحه ثبت نام جداگانه برای هر سایت شبکه ایجاد کنید، حتی اگر موضوعات مختلفی داشته باشند. ما این مورد را در نظر می گیریم که در تمام سایت های شبکه دارای صفحه ثبت نام خود هستند، اما همان موضوع مورد استفاده قرار می گیرد و سایت ها فقط در زبان متفاوت هستند. اگر موضوعات مختلف استفاده شوند، باید کد بیشتری بنویسید.

functions.php؟

نه نام این فایل به نظر می رسد در هر مقاله در مورد وردپرس ذکر شده است. در مورد ما، با توجه به این واقعیت که قابلیت ثبت نام برای چندین سایت طراحی شده است، منطقی است که آن را به پلاگین های MU برساند که هنگام باز کردن هر سایت بارگذاری می شوند.

چرت زدن

شایان ذکر است که MU-plugins زودتر از پلاگین های معمولی بارگیری می شود و تا زمانی که هسته وردپرس به طور کامل دانلود شود، بنابراین تماس برای برخی از توابع می تواند منجر به خطاهای فتنه در PHP شود. دانلود مشابه "Early" دارای مزایای آن است. بیایید بگویم در داخل هر موضوع نمی تواند به برخی از اقدامات متصل شود که قبل از دانلود فایل functions.php از موضوع به وجود می آید. یک مثال از این می تواند به عنوان پلاگین jetpack_module_loaded_related-پست ها (پست های مرتبط - نام ماژول) خدمت کند که ممکن است فعالیت ماژول ها را در jetpack ردیابی کند. این به "کلاچ" غیر ممکن است از فایل موضوع به این عمل، زیرا اقدام قبلا قبل از بارگذاری موضوع کار کرده است - پلاگین ها قبلا بارگذاری شده اند. شما می توانید نگاهی به تصویر معمولی سفارشات بوت وردپرس در صفحه مرجع عمل در کد انجام دهید.

سفارش در فایل ها

MU-Plugins ممکن است شامل هر تعداد فایل ها و هر نمودار باشد، که به نظر شما منطقی است. من در مورد چنین سلسله مراتب پایبند هستم:

| -Mu-plugins | - | load.php | - | - | سلنا-شبکه | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -... | - | - | - |-جتپاک | - | - | - | - | - -Plugin.php

در فایل load.php، تمام پلاگین های لازم به شبکه ما متصل می شوند:

بارگیری های بارگذاری شده برای تمام افزونه ها load_muplugin_textdomain ("selena_network"، "/ selena-network / زبان /")؛ // ثبت نام شبکه نیاز به wpmu_plugin_dir. "/selena-network/signup/plugin.php"؛ // پلاگین های دیگر // نیاز به wpmu_plugin_dir ...

در داخل پوشه Selena-network، پوشه های پلاگین ذخیره می شوند، هر کدام دارای plugin.php خود است، که ما در load.php متصل می شویم. این انعطاف پذیری و توانایی به سرعت غیر فعال کردن و شامل برخی از چیزها است.

آدرس صفحه ثبت نام

برای مشخص کردن آدرس صفحه ثبت نام، از فیلتر WP_signup_Location استفاده کنید. این را می توان در داخل فایل WP-login.php یافت و او مسئول تغییر مسیر در WP-Signup.php است.

مورد "ثبت نام": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location"، network_site_url ("wp-signup.php"))؛ خروج؛

ویژگی خود را در MU-Plugins / Selena-Network / Signup / Plugin.php اضافه کنید، که آدرس صفحه ثبت نام را در سایت فعلی ارائه می دهد:

تابع selena_network_signup_page ($ url) (بازگشت home_url (). "/ ثبت نام /"؛) add_filter ("wp_signup_location"، "selena_network_signup_page"، 99)؛

selena_network - پیشوند، که من در نام تمام توابع درون mu-plugins در سایت من برای جلوگیری از درگیری ها استفاده می شود، باید با پیشوند منحصر به فرد خود جایگزین شود. اولویت اضافه کردن فیلتر 99، به دلیل برخی از پلاگین ها، مانند BBPress و BuddyPress، می توانید این آدرس را به خودتان بازنویسی کنید (MU-plugins زودتر از پلاگین های معمولی بارگیری می شود). لطفا توجه داشته باشید که صفحه اصلی_url () به جای network_site_url () استفاده می شود، برای ترک بازدید کننده در همان دامنه. شما می توانید هر URL را به عنوان یک آدرس استفاده کنید.

ایجاد یک صفحه

حالا اجازه دهید یک صفحه با site.com/signup/ را از طریق یک رابط کاربری منظم ایجاد کنیم، و در قالب پوشه های دختر موضوع برای صفحه جدید ما - صفحه-Signup.php. به جای کلمه "ثبت نام" شما می توانید از یک شناسه منحصر به فرد استفاده کنید.

در داخل قالب جدید، شما باید از تابع selena_network_signup_main () تماس بگیرید، که فرم ثبت نام را نمایش می دهد.

شایان ذکر است که کل فرآیند با قالب ها مورد نیاز نیست و در عوض شما می توانید کوتاه خود را ایجاد کنید، که همچنین از تابع selena_network_signup_main () تماس می گیرد.

wP-Signup.php و WP-algent.php

در حال حاضر ما یک تابع ایجاد می کنیم که فرم ثبت نام را نمایش می دهد. برای انجام این کار، فایل های WP-Signup.php را کپی کنید و WP-Activity.php را از وردپرس ریشه در MU-Bubs / Selena-Network / ثبت نام / (و فراموش نکنید که آنها را در داخل MU-Plugins / Selena-Network / ثبت نام / plugin.php). دستکاری های بیشتری با فایل ها بسیار دشوار و طولانی برای توصیف هستند، بنابراین آنها را به خودتان بسازید. من فقط توضیح خواهم داد که دقیقا باید انجام شود و فایل های منبع پروژه شما را منتشر کند:

  1. در ابتدای فایل، همه نیاز، توابع فراخوانی و سایر کارهای خارج را حذف کنید.
  2. با اضافه کردن پیشوند های منحصر به فرد به نام، تمام توابع را تغییر دهید.
  3. قسمت پایین کد WP-Signup.php به تابع selena_network_signup_main پیچیده شده است و در ابتدا شروع به نوشتن Global $ Active_Signup؛ .
  4. جایگزین کردن طرح خود را در مکان های مناسب.

در داخل WP-Activate.php شما باید در مورد همین کار انجام دهید:

  1. حذف تمام کد های خارج از توابع، طرح را به یک تابع جداگانه بسته بندی کنید.
  2. طرح را در مکان هایی که لازم است تغییر دهید.

فایل WP-Activate.php مسئول صفحه فعال سازی حساب است. همانطور که با صفحه ثبت نام، شما باید یک قالب جداگانه ای را ایجاد کنید که در آن یک تابع از فایل WP-Activate.php تماس بگیرید.

ما نامه های فعال سازی را ارسال می کنیم

صفحه ثبت نام نامه ای را به بازدید کننده ارسال می کند با اشاره به فعال شدن حساب. به طور پیش فرض، این تابع wpmu_signup_user_notification () از فایل MS-Functions.php است. قابلیت آن را می توان برای عملکرد آن قرض گرفت. دلیل اینکه شما می خواهید از استفاده از این تابع اجتناب کنید - یک مرجع فعال سازی حساب را با WP-algember.php ارسال می کند. شما می توانید این ویژگی را با استفاده از فیلتر WPMU_SIGNUP_USER_NOTFICATIFICATIFICATION غیر فعال کنید (اگر این کار را انجام دهید (اگر این کار را انجام ندهد، نامه فعال سازی دو بار ارسال می شود، در واقع دو حرف متفاوت).

تابع Armyofselenagomez_wpmu_signup_user_notification ($ کاربر، $ user_mail، $ key، $ meta \u003d array ()) (/ / // کد از WPMU_SIGNUP_USER_NOTIFICATION () تابع WP_MAIL ($ user_email، wp_specialchars_decode ($ subject)، $ پیام، $ message_headers ) بازگشت نادرست؛) add_filter ("wpmu_signup_user_notification"، "armyofselegenagomez_wpmu_signup_user_notification"، 10، 4)؛

به عنوان یک نتیجه، صفحه ثبت نام در موضوع سلنا شروع به نگاه بسیار تمیز و مراقب باشید.

نتیجه

اینترنت دارای بسیاری از راه های بسیار صحیح نیست که یک چیز را انجام دهد - Apache Redirects، AJAX فرم هایی که بدون اسکریپت جاوا کار نمی کنند و غیره من واقعا آن را خیلی دوست نداشتم، بنابراین سعی کردم آن را به درستی انجام دهم وب سایت من

من متوجه می شوم که فایل های ویرایش باید بتوانند با دقت و سعی نکنند از منبع به RANSNESH حرکت نکنند، اگر وردپرس فایل های WP-Signup.php و WP-Activate.php را تغییر دهد، آنها را آسان تر برای پیدا کردن تغییرات پیدا کرد .

فراموش نکنید که به کد منبع تمام توابع شرح داده شده در بالا نگاه کنید تا به طور کامل با آنچه که در داخل کد اتفاق می افتد برخورد کنید.

جایزه. حفاظت در برابر اسپم ها

حتی جوانترین سایت های وردپرس اغلب به ثبت نام اسپم می پردازند. شما می توانید شرایط بی پایان را برای فیلتر کردن ربات ها بنویسید، اغلب بیشتر شبیه به تلاش برای ایجاد هوش مصنوعی 🙂 در مورد چند دلیل، یک تغییر مسیر منظم در آپاچی به من کمک کرد، که در هنگام باز کردن /wp-signup.php و / wp- acitvate.php، من از 404 سوال کردم (من متخصص در تنظیم آپاچی نیستم، بنابراین قوانین من ممکن است بسیار درست نباشد).

RewRiteEngine در Rewritebase / Rewiterule ^ WP-Signup \\ .php - Rewiterule ^ WP-Activate \\ .php - # شروع وردپرس # قوانین از وردپرس به طور پیش فرض لمس نمی کنند :) # ... # پایان وردپرس

P. S. من سعی می کنم برخی از چیزهای شخص ثالث را به همان اندازه که ممکن است توضیح دهم، زیرا زمانی که من شروع کردم، گاهی اوقات به نحوی به نحوی گفتم و توضیح بسیاری از چیزها. من همچنین معتقدم که نکات کوچک کوچک در مورد مواد دیگر کسی به مطالعه چیزی جدید و گسترش میدان دانش خود را تحت فشار قرار خواهد گرفت. عبارات منظم در سوابق Reriterule استفاده می شود، به عنوان مثال، نماد به طور کامل پیچیده نیست، به معنای آغاز خط است.

یک تابع را ثبت می کند که در طول فعال شدن پلاگین باعث می شود.

این ویژگی تابع Callback مشخص شده را به قلاب متصل می کند. فعال کردن (پلاگین) و یک بسته بندی برای این قلاب است.

(پلاگین) در Hook Activate_ (Plugin) به نام نام نسبی به فایل اصلی پلاگین جایگزین می شود. به عنوان مثال، اگر پلاگین واقع شده باشد: WP-Content / Plugins / SamplePLugin / Sample.php، سپس نام قلاب خواهد بود: Activate_SamplePlugin / Sample.php.

از نسخه 3.1. قلاب تنها در هنگام فعال شدن پلاگین باعث می شود و در طول به روز رسانی خودکار پلاگین کار نمی کند.

چگونه کار می کند

پلاگین توسط تابع فعال می شود activate_plugin () که در آن قلاب فعال می شود (پلاگین) باعث می شود.

تابع active_plugin () در هسته پس از آن ایجاد می شود بارگیری VP متوسط . این تابع فایل پلاگین اصلی را متصل می کند (و همه آنچه که در آن مشخص شده است) متصل می شود، و سپس از طریق قلاب، تابع فراخوانی مشخص شده را فعال می کند. با توجه به این، تمام توابع و کلاس های پلاگین در عملکرد فراخوانی ما موجود است. اما، از آنجا که تمام قلاب های اصلی WP در حال حاضر در طول بوت متوسط \u200b\u200bکار کرده اند، پس از آن هیچ رویدادی پلاگین در قلاب ها آویزان نیست، به عنوان مثال plugins_loaded، دیگر در هنگام اتصال فایل اصلی پلاگین کار نمی کند. بنابراین، پلاگین ما متصل خواهد شد، اما نه به طور کامل: نه به عنوان آن را که باید اتصال زمانی که در حال حاضر فعال شده است.

به عنوان مثال، اگر پلاگین هر چیزی را در طول رویداد Plugins_loaded انجام دهد، تمام این اقدامات به سادگی زمانی اتفاق نمی افتد که فعال شدن پلاگین. به عنوان مثال، اگر این فایل ترجمه را متصل کند، فایل ترجمه در لحظه ای از راه اندازی تابع callback مشخص شده برای replication_hook () متصل نخواهد شد.

به عنوان یک قاعده، پس از عملکردهای فراخوانی، 2 رویداد برای قطع توابع وجود دارد: Activated_Plugin و خاموش شدن.

برای انجام کاری فوق العاده زمانی که پلاگین فعال می شود، به عنوان مثال 5 را ببینید.

شرایط استفاده

تابع کار نمی کند اگر شما آن را در زمان قلاب، به عنوان مثال، plugins_loaded، init. تابع باید به طور مستقیم از فایل اصلی پلاگین نامیده شود. قوانین فعال سازی:

    register_Activation_Hook () باید از فایل Master Plugin نامیده شود، از جایی که دستورالعمل نام پلاگین واقع شده است: ... و نباید از هر قلاب، مانند plugins_loaded یا init نامگذاری شود.

    تابع قلاب باید در همان فایل به عنوان قلاب یا اتصال قبل از یک فایل دیگر باشد.

    عملکرد قلاب بر روی صفحه نمایش (echo) کار نمی کند. از آنجا که تغییر مسیر و اکو اتفاق می افتد. اما شما می توانید از Die () استفاده کنید.

  1. متغیرهای جهانی (در صورت وجود) باید به طور صریح برای دسترسی به آنها از عملکرد قلاب تعیین شود.

یادداشت های مربوط به منطقه متغیرها

هنگام فعال کردن افزونه، فایل پلاگین اصلی در منطقه جهانی متصل نیست، اما در داخل تابع itcent_plugin (). بنابراین متغیرهایی که به طور معمول در حالت معمول عملیات پلاگین در نظر گرفته می شوند.

بنابراین، کارکردی که در region_hook_hook () استفاده می شود، ممکن است متغیرهای جهانی را ببینند، حتی اگر آنها را به عنوان جهانی درون این تابع اعلام کردید. مثال:

$ myvar \u003d "چیزی"؛ register_Activation_Hook (__ file__، "myplugin_Activate")؛ تابع myplugin_active () (Global $ myvar؛ echo $ myvar؛ // متغیر برابر با "چیزی" نیست)

به دلیل این ویژگی، متغیرهای جهانی باید همیشه مشخص شوند. تمام متغیرهای جهانی باید به عنوان جهانی تعریف شوند، حتی اگر متغیر در بدن پلاگین نشان داده شود. فقط در این مورد به هر کجا دسترسی خواهد داشت. مثال:

جهانی $ myvar؛ // به وضوح نشان می دهد که این یک متغیر جهانی $ myvar \u003d "چیزی" است؛ register_Activation_Hook (__ file__، "myplugin_Activate")؛ تابع myplugin_active () (جهانی $ myvar؛ echo $ myvar؛ //\u003e چیزی)

بدون قلاب

بازگشت

خالی. هیچ چیز باز نمی گردد

استفاده كردن

Register_Activation_Hook ($ فایل، $ تابع)؛ $ فایل (رشته) (مورد نیاز) مسیر به فایل اصلی پی اچ پی از جمله نام پلاگین خود را. به طور معمول از PHP ثابت جادویی __File__ استفاده می شود. $ تابع (خط / آرایه / لامبدا) (مورد نیاز)

نام تابع فراخوانی. برای کلاس ها، از آرایه استفاده کنید: آرایه ($ این، نام تابع ")؛ .

این تابع یک متغیر منطقی $ network_wide را دریافت می کند - آیا پلاگین برای کل شبکه سایت ها، با Multisaite فعال می شود.

مثال ها

#one اجرای یک تابع هنگام فعال کردن پلاگین

ما فرض می کنیم که ما یک تابع my_plugin_Activate () در فایل پلاگین اصلی داریم: WP-content / plugins / myplugin / myplugin.php، سپس برای شروع این عملکرد در طول فعال سازی پلاگین، از چنین کد استفاده کنید:

ثبت نام_ actation_hook (__ file__، "my_plugin_active")؛ تابع my_plugin_Activate () (/ / / / / کد فعال سازی ...)

# 2 شروع یک روش کلاس

اگر پلاگین از کلاس PHP استفاده کند، کد فعال سازی اضافه می شود:

register_Activation_Hook (__ file__، آرایه (my_plugin "،" install "))؛ کلاس My_Plugin Class (تابع استاتیک نصب () (/ / هیچ خروجی ایجاد نمی کنید ...))

# 3 یک روش کلاس را از یک فایل جداگانه اجرا کنید

اگر کلاس که شامل عملکرد فعال سازی در یک فایل جداگانه است، سپس تابع فعال سازی را به صورت زیر ثبت کنید:

شامل_ONCE __DIR__. "/class-my_plugin.php"؛ Register_Activation_Hook (__ file__، آرایه ("my_plugin"، "on_activate_function"))؛

#four یک کلاس کلاس از کلاس را اجرا کنید

اگر شما در داخل __construct () هستید. مهم، __File__ باید "نگاه" به فایل پلاگین اصلی:

Register_Activation_Hook (__ File__، Array ($ این، "your_method_name"))؛

# 5 بلافاصله پس از فعال شدن پلاگین هر چیزی را بسازید

پس از فعال کردن پلاگین، تنها دو قلاب فعال می شوند: Activated_Plugin و خاموش شدن.

هنگامی که شما نیاز به انجام هر کاری بلافاصله پس از فعال کردن پلاگین، شما می توانید تابع را به آنها متصل کنید.

هنگامی که این راه حل مناسب نیست، می توانید از گزینه های WP استفاده کنید: داده ها را به گزینه ذخیره کنید و سپس در دسترس بودن گزینه را بررسی کنید و اگر گزینه ای باشد، انجام دهید

// فایل اصلی پلاگین ... تابع my_plugin_Activate () (// اضافه کردن یک گزینه برای پس از آن اگر آن را انجام هر کاری. add_option ("Activated_PLugin"، "Plugin-slug")؛ // code code فعال سازی ...) ثبت نام_Activation_Hook (__ file__ " my_plugin_Activate ")؛ تابع load_plugin () (iS_ADMIN () && get_option ("activated_plugin") \u003d\u003d "Plugin-slug") \u003d\u003d حذف گزینه اضافه شده به طوری که آن را دیگر کار نمی کند / / انجام آنچه شما نیاز دارید ... delete_option ("Activated_Plugin")؛ // هر یک از یک بار، پس از فعال کردن پلاگین // به عنوان مثال: add_action (init "،" my_init_function ")؛) add_action (" admin_init "،" load_plugin ")؛

یکی دیگر از گزینه ای برای انجام کاری در طول فعال شدن افزونه این است که رویداد خود را مانند این ایجاد کنید:

تابع my_plugin_Activate () (/ / قلاب خود را نصب کنید تا بتوانید از پلاگین Do_Action خود به آن بروید (my_plugin_active)؛) ثبت نام_ activation_hook (__ file__، my_plugin_active ")؛

# 6 یکی دیگر از تظاهرات استفاده از عملکرد

یک پلاگین کوچک نشان دادن نحوه استفاده از عملکرد:

/ * نام پلاگین: شرح آزمون: آزمون * / نیاز به DIRNAME (__ file__). "/ my_other_file.php"؛ / * این کد کار نخواهد کرد. قلاب فعال باید از فایل اصلی نامیده شود. Register_Activation_Hook (Dirname (__ file__). "/ my_other_file.php"، "my_other_function")؛ * / // این یک کد کاری است. Register_Activation_Hook (__ File__، "test_Activated")؛ / * این گزینه تأیید صحیح و دسترسی به متغیرهای جهانی است. متغیرهای جهانی باید به وضوح اعلام شود. بدون این شما به آنها دسترسی ندارید. * / global $ some_var؛ $ some_var \u003d "سلام"؛ // تابع test_active () (گزینه کار نخواهد کرد. اگر شما نیاز به ضبط سیاهههای مربوط به یک فایل موقت دارید، از fopen / fwrite استفاده کنید. اگر می خواهید بررسی کنید که آیا قلاب فعال سازی کار می کند، از خروج () در داخل عملکرد قلاب استفاده کنید. * / echo "test_activated به نام!"؛)