Πώς να δημιουργήσετε τη δική σας σελίδα εγγραφής στο WordPress Multisite. Πώς να δημιουργήσετε τη δική σας σελίδα εγγραφής στο Bonus Multisite Wordpress. Προστασία από τους Spammers

Οι σύνδεσμοι μιας χρήσης μπορούν να χρησιμοποιηθούν σε διάφορες καταστάσεις: προκειμένου να παρέχουν προσωρινή πρόσβαση στο αρχείο ή τη σελίδα ή να επιβεβαιώσετε την εγγραφή. Σε αυτό το μάθημα, θα δείξουμε πώς να δημιουργήσουμε και να εφαρμόσουμε μια διευθύνσεις URL μιας χρήσης.

Δημιουργία URL

Ας υποθέσουμε ότι ο ιστότοπός μας διαθέτει ένα σύστημα ελέγχου ταυτότητας χρήστη. Μετά την εγγραφή, ζητάμε από τον χρήστη να περάσει τη διαδικασία επαλήθευσης ηλεκτρονικού ταχυδρομείου. Για να δημιουργήσετε τέτοιους συνδέσμους, μπορούμε να χρησιμοποιήσουμε την παράμετρο ειδικού διακριτικού. Ένα παράδειγμα ενός τέτοιου συνδέσμου:

Http: //example.com/activate; Token \u003d ee97780 ...

Χωρίς μια βάση δεδομένων, δεν μπορούμε να κάνουμε εδώ, οπότε ας δούμε το τραπέζι με το οποίο θα εργαστούμε.

Δημιουργία πίνακα Pending_users (Token Char (40) Not Null, Username Varchar (45) Όχι Null, Tstamp ακέραιος μη υπογεγραμμένος όχι μηδέν, πρωτεύον κλειδί (διακριτικό);

Στο τραπέζι θα αποθηκεύσουμε 3 πεδία: Token, όνομα χρήστη και χρόνο. Για να δημιουργήσετε ένα διακριτικό, θα χρησιμοποιήσουμε τη λειτουργία SHA1 (), η οποία δίνει μια σειρά από 40 χαρακτήρες. Το πεδίο Tstamp θα αποθηκεύσει τον χρόνο παραγωγής διακριτικών έτσι ώστε να μπορούμε να παρακολουθήσουμε τους συνδέσμους με ένα outdier.

Υπάρχουν πολλοί τρόποι για να δημιουργήσετε ένα διακριτικό, αλλά σε αυτό το μάθημα θα χρησιμοποιήσουμε τις λειτουργίες Uniqid () και SHA1 (). Ανεξάρτητα από τη μέθοδο δημιουργίας ενός διακριτικού, βεβαιωθείτε ότι οι παραγόμενες τιμές θα είναι διαφορετικές και η πιθανότητα αντιγράφου είναι ελάχιστη.

$ token \u003d SHA1 (Uniqid ($ Username, True)).

Ως παράμετρος, η λειτουργία Uniqid () παίρνει τη συμβολοσειρά και η έξοδος δίνει ένα μοναδικό αναγνωριστικό βασισμένο στο μεταδιδόμενο επιχείρημα και την τρέχουσα ώρα. Επίσης, ως δεύτερο επιχείρημα, αυτή η λειτουργία λαμβάνει μια τιμή Boolean που θα δώσει το Uniqid σήμα για να προσθέσει αρκετούς πρόσθετους χαρακτήρες για να αυξήσετε την πιθανότητα μοναδικής τιμής. Το χαρακτηριστικό SHA1 παίρνει ένα μοναδικό αναγνωριστικό και δημιουργεί ένα hash.

Μετά την εργασία σε δύο λειτουργίες, θα έχουμε ένα μοναδικό διακριτικό που μπορεί να χρησιμοποιήσει για να δημιουργήσει διευθύνσεις URL. Τώρα πρέπει να το βάλουμε στη βάση δεδομένων:

$ Query \u003d $ DB-\u003e προετοιμασία ("Εισαγωγή σε εκκρεμείς τιμές (όνομα χρήστη, διακριτικό, tstamp) τιμές (?,?)"); $ Query-\u003e Execute (Array ($ username, $ token, $ _server ["request_time"]));

Προκειμένου να γνωρίζουμε ποιος χρήστης πρέπει να ενεργοποιηθεί, θα καταγράψουμε και θα συνδεθούμε στο τραπέζι. Σε ένα παράδειγμα, πιο προσαρμοσμένο για έναν πραγματικό ιστότοπο, μπορείτε να χρησιμοποιήσετε το αναγνωριστικό χρήστη.

Τώρα που έχουμε όλες τις απαραίτητες πληροφορίες, μπορούμε να δημιουργήσουμε μια προσωρινή διεύθυνση URL:

$ URL \u003d "http://example.com/activate.php?token\u003d$$"?

$ Μήνυμα \u003d.<<

Ελεγχος

Τώρα χρειαζόμαστε ένα σενάριο, χάρη στην οποία θα ελέγξουμε. Το μόνο που πρέπει να κάνουμε είναι να συγκρίνουμε το διακριτικό από τη διεύθυνση URL και το διακριτικό από τη βάση. Εάν υπάρχει ένα τέτοιο πράγμα, και ο χρόνος της ζωής του δεν έχει λήξει, τότε όλα είναι εντάξει.

// Πάρτε εάν το Token (Isset ($ _ get ["Token"]) && preg_match ("/ ^ (40) $ / i", $ _get ["Token"])) ($ token \u003d $ _get ["Token" ]) Αλλού (ρίξτε νέα εξαίρεση ("Tocken δεν είναι έγκυρη.)) ·) // Έλεγχος $ Query \u003d $ DB-\u003e Ετοιμάστε το Token (" Επιλογή Όνομα χρήστη, TSTAMP από pending_users όπου token \u003d? "); $ Query-\u003e Execute (Array ($ token)). $ Row \u003d $ Query-\u003e Fetch (ΠΟΠ :: Fetch_assoc); $ Query-\u003e Closuresor (); Εάν ($ ROW) (απόσπασμα ($ ROW),) αλλού (ρίξτε νέα εξαίρεση ("Tocken δεν είναι έγκυρη.");) // Ενεργοποίηση του λογαριασμού χρήστη // ... // Αφαιρέστε το διακριτικό από το βάθος $ $ Query \u003d $ Db\u003e προετοιμασία ("Διαγραφή από το Pending_users όπου το όνομα χρήστη \u003d; και το Token \u003d; και tstamp \u003d?",); $ Query-\u003e Execute (Array ($ Username, $ Token, $ TSTAMP)).

Πρέπει επίσης να παρέχουμε δοκιμές των μάρκων, η διάρκεια της οποίας έχει λήξει:

// 1 ημέρα σε δευτερόλεπτα \u003d 60 δευτερόλεπτα * 60 λεπτά * 24 ώρες $ delta \u003d 86400; // Ελέγξτε εάν ($ _server ["request_time"] - $ TSTAMP\u003e $ DELTA) (ρίξτε νέα εξαίρεση ("Lifetime Tocken έληξε");) // Ενεργοποίηση προσαρμοσμένου λογαριασμού // ...

Έτσι, θα έχουμε δύο ελέγχους: ένα στην εγκυρότητα του διακριτικού, το άλλο κατά τη στιγμή της ύπαρξής του.

Αποτέλεσμα

Αυτή η μέθοδος μπορεί να εφαρμοστεί όχι μόνο για να ενεργοποιήσετε τους λογαριασμούς χρηστών, αλλά και σε άλλες ανάγκες: για παράδειγμα, για την παροχή μιας ή προσωρινής πρόσβασης σε έναν πόρο ή μια υπηρεσία.

Εκτός από όλα αυτά, μπορείτε να δημιουργήσετε ένα σενάριο που θα αφαιρέσει τα μάρκες που δεν έχουν χρησιμοποιήσει ποτέ. Αυτό το σενάριο μπορεί να ξεκινήσει από καιρό σε καιρό ή να υποβάλει αίτηση για αυτό το Cron.

SEGAL Θα εξετάσουμε την εκμετάλλευση της κρίσιμης ευπάθειας 1η ημέρα στο δημοφιλές CMS Joomla, το οποίο βυθίστηκε στο Διαδίκτυο στα τέλη Οκτωβρίου. Θα αφορά τις ευπάθειες με αριθμούς CVE-2016-8869, CVE-2016-8870 και CVE-2016-9081. Και οι τρεις συμβαίνουν από ένα κομμάτι κώδικα, το οποίο ήταν κάποτε στα βάθη του πλαισίου, περιμένοντας τις δικές τους ώρες, στη συνέχεια να ξεφύγουν και να φέρουν μαζί του χάος, hacked sites και δάκρυα σε οποιονδήποτε αθώους χρήστες αυτού του Joomla. Μόνο οι πιο γενναίος και τολμηροί προγραμματιστές των οποίων τα μάτια είναι κόκκινα από το φως των οθονών, και τα πληκτρολόγια είναι γεμάτα με ψίχουλα ψωμιού, ήταν σε θέση να αμφισβητήσουν την πρησμένη επίχρωση και να επιβάλουν το κεφάλι της στο βωμό των διορθώσεων.

Προειδοποίηση

Όλες οι πληροφορίες παρέχονται αποκλειστικά για ενημερωτικούς σκοπούς. Ούτε οι συντάκτες ούτε ο συγγραφέας είναι υπεύθυνες για τυχόν βλάβη που προκαλούνται από τα υλικά αυτού του άρθρου.

Γιατί όλα ξεκίνησαν

Στις 6 Οκτωβρίου 2016, η Damis Palma (Demis Palma) δημιούργησε ένα θέμα στην ανταλλαγή στοίβα, η οποία ρώτησε: γιατί στην πραγματικότητα, στην Joomla Version 3.6 Υπάρχουν δύο μέθοδοι για την εγγραφή χρηστών με το ίδιο όνομα εγγραφής (); Το πρώτο βρίσκεται στον ελεγκτή των χρηστώνControlerregistration και το δεύτερο είναι στον UsersControllerUser. Ο Damis ήθελε να μάθει αν ο userscontrolleruser :: η μέθοδος εγγραφής () χρησιμοποιείται κάπου, ή είναι μόνο ένας εξελικτικός αναχρονισμός που παραμένει από την παλιά λογική. Διαταράσσεται από το γεγονός ότι, ακόμη και αν αυτή η μέθοδος δεν χρησιμοποιείται σε οποιαδήποτε παρουσίαση, μπορεί να καλείται χρησιμοποιώντας ένα σχηματισμένο αίτημα. Ποια ήταν η απάντηση από τον προγραμματιστή κάτω από το ψευδώνυμο του iToctopus, επιβεβαιώνοντας: το πρόβλημα υπάρχει πραγματικά. Και έστειλε μια αναφορά στους προγραμματιστές του Joomla.

Στη συνέχεια, τα γεγονότα ανέπτυξαν τον πιο γρήγορο τρόπο. Στις 18 Οκτωβρίου, οι προγραμματιστές του Joomla δέχονται Damis Report, η οποία από εκείνη την εποχή επιθυμεί poC, επιτρέποντάς σας να καταχωρίσετε τον χρήστη. Δημοσίευσε μια σημείωση στον ιστότοπό του, όπου σε γενικές γραμμές είπε σχετικά με το πρόβλημα και τις σκέψεις σχετικά με αυτό. Την ίδια ημέρα, η νέα έκδοση του Joomla 3.6.3 βγαίνει, η οποία εξακολουθεί να περιέχει έναν ευάλωτο κώδικα.

Μετά από αυτό, ο David Tampellini (Davide Tampellini) περιστρέφει το σφάλμα στην κατάσταση εγγραφής δεν είναι απλός χρήστης, αλλά διαχειριστής. Και στις 21 Οκτωβρίου, η ομάδα ασφαλείας Joomla φτάνει μια νέα υπόθεση. Μιλάει ήδη για την αύξηση των προνομίων. Την ίδια ημέρα, η ανακοίνωση εμφανίζεται στην ιστοσελίδα του Joomla ότι την Τρίτη 25 Οκτωβρίου, θα κυκλοφορήσει μια άλλη έκδοση με έναν αριθμό ακολουθίας 3.6.3, το οποίο διορθώνει την κρίσιμη ευπάθεια στον πυρήνα του συστήματος.

Στις 25 Οκτωβρίου, η ομάδα απεργίας ασφαλείας Joomla βρίσκει το τελευταίο πρόβλημα που ένα κομμάτι κώδικα που ανακάλυψε το Damis. Στη συνέχεια, στο κύριο κλάδο του επίσημου αποθετηρίου Joomla, η δέσμευση της 21ης \u200b\u200bΟκτωβρίου, με ένα δυσδιάκριτο όνομα να προετοιμάσει 3.6,4 σταθερή απελευθέρωση, η οποία καθορίζει το κακοποιημένο σφάλμα.

Μετά από αυτό, πολλά ενδιαφερόμενα άτομα συνδέονται με τη διαβίβαση των προγραμματιστών στη διαβίβαση των προγραμματιστών - αρχίζουν να προωθούν την ευπάθεια και να μαγειρεύουν στερεά.

Στις 27 Οκτωβρίου, ο ερευνητής του Harry Roberts καθορίζει μια έτοιμη εκμετάλλευση στο Reporial Reporitor Xibhos, το οποίο μπορεί να ανεβάσει ένα αρχείο PHP σε ένα διακομιστή με ένα ευάλωτο CMS.

Λεπτομέριες

Λοιπόν, με την προϊστορία, πηγαίνετε στο πιο ενδιαφέρον πράγμα - τη διάκριση της ευπάθειας. Ως δοκιμαστική έκδοση, εγκατέστησα Joomla 3.6.3, οπότε όλοι οι αριθμοί της σειράς θα είναι σχετικές για αυτήν την έκδοση. Και όλα τα μονοπάτια στα αρχεία που θα δείτε στη συνέχεια θα υποδεικνύονται σε σχέση με τη ρίζα του εγκατεστημένου CMS.

Χάρη στο Find Damis Palm, γνωρίζουμε ότι υπάρχουν δύο μέθοδοι που εκτελούν εγγραφή χρήστη στο σύστημα. Το πρώτο χρησιμοποιείται από το CMS και βρίσκεται στο /components/com_users/controllers/comers/controllers/registration.php:108. Το δεύτερο (αυτό που θα πρέπει να καλέσουμε), ζει σε / στοιχεία / com_users / ελεγκτές / user.php: 293. Ας το κοιτάξουμε πιο κοντά.

286: / ** 287: * Μέθοδος εγγραφής ενός χρήστη. 288: * 289: * @ Επαναφέρει Boolean 290: * 291: * @since 1.6 292: * / 293: Public Function Εγγραφή () 294: (295: JSESSION :: CheckToken ( "POST") Ή JEXIT (JTEXT :: _ ("Jinvalid_Token")); ... 300: // Πάρτε τα δεδομένα της φόρμας. 301: $ Data \u003d $ Αυτό-\u003e είσοδος-\u003e post-\u003e get ("χρήστης", πίνακας (), "Array"); .. 315: $ Επιστροφή \u003d $ Μοντέλο-\u003e επικυρώστε ($, $ δεδομένα), 316: 317: // Ελέγξτε για σφάλματα. 318: Εάν ($ Επιστροφή \u003d\u003d\u003d FALSE) 319: (... 345: / / Τελειώστε την εγγραφή. 346: $ Επιστροφή \u003d $ Μοντέλο-\u003e Εγγραφή ($ δεδομένα);

Εδώ έφυγα μόνο ενδιαφέρουσες γραμμές. Η πλήρης έκδοση της ευάλωτης μεθόδου μπορεί να προβληθεί στο αποθετήριο Joomla.

Θα το καταλάβουμε τι θα συμβεί όταν η τακτική εγγραφή χρηστών: ποια δεδομένα αποστέλλονται και πώς επεξεργάζονται. Εάν η εγγραφή του χρήστη είναι ενεργοποιημένη στις ρυθμίσεις, η φόρμα μπορεί να βρεθεί στο http: //joomla.local/index.php/component/users/? View \u003d εγγραφή.


Ένα νόμιμο αίτημα εγγραφής χρήστη μοιάζει με το ακόλουθο στιγμιότυπο οθόνης.


Τα εξαρτήματα COM_USERS είναι υπεύθυνα για την εργασία με τους χρήστες. Δώστε προσοχή στην παράμετρο εργασίας στο ερώτημα. Έχει $ ελεγκτή. $ Μέθοδος. Ας δούμε τη δομή του αρχείου.

Ονόματα σεναρίων σε φάκελο Ελεγκτές. Συμμορφώνεται με τα ονόματα των καλούμενων ελεγκτών. Δεδομένου ότι στο αίτημά μας είναι τώρα $ ελεγκτής \u003d "εγγραφή", το αρχείο θα καλέσει. Εγγραφή.php. Και τη μέθοδο του μητρώου ().

Προσοχή, ερώτηση: Πώς να μεταδώσετε την επεξεργασία εγγραφής σε μια ευάλωτη περιοχή στον κώδικα; Πιθανότατα έχετε ήδη μαντέψει. Τα ονόματα των ευάλωτων και παρόντων μεθόδων συμπίπτουν (μητρώο), έτσι μπορούμε απλά να αλλάξουμε το όνομα του καλούμενου ελεγκτή. Και πού είναι ο ευάλωτος ελεγκτής; Δεξιά στο αρχείο user.php.. Αποδεικνύεται $ ελεγκτή \u003d "χρήστης". Συλλέγουμε όλα μαζί και λαμβάνουμε εργασία \u003d user.register. Τώρα το αίτημα εγγραφής επεξεργάζεται με τη μέθοδο που χρειαζόμαστε.


Το δεύτερο πράγμα που πρέπει να κάνουμε είναι να στείλουμε δεδομένα στη σωστή μορφή. Όλα είναι απλά εδώ. Το νόμιμο μητρώο () περιμένει μια σειρά από εμάς που ονομάζεται JFform, στην οποία μεταδίδουμε δεδομένα για εγγραφή - όνομα, σύνδεση, κωδικό πρόσβασης, αλληλογραφία (βλέπε στιγμιότυπο οθόνης με ένα ερώτημα).

  • /components/com_users/controllers/registration.php: 124: // Αποκτήστε τα δεδομένα χρήστη. 125: $ requestdata \u003d $ this-\u003e είσοδος-\u003e post-\u003e get ("jform", πίνακας (), "Array");

Ο θάλαμος μας λαμβάνει αυτά τα δεδομένα από τον πίνακα που ονομάζεται χρήστης.

  • /components/com_users/controllers/user.php: 301: // Λάβετε τα δεδομένα της φόρμας. 302: $ data \u003d $ this-\u003e είσοδος-\u003e post-\u003e get ("χρήστης", πίνακας (), "Array");

Επομένως, αλλάζουμε τα ονόματα όλων των παραμέτρων με το JFrom στον χρήστη.

Το τρίτο βήμα μας είναι να βρούμε ένα έγκυρο διακριτικό CSRF, καθώς δεν θα υπάρξει εγγραφή χωρίς αυτό.

  • /Components/com_users/controllers/usesser.php: 296: jsession :: checktooken ("post") ή jexit (jinvalid_token)).

Μοιάζει με ένα Hash MD5, και μπορείτε να το πάρετε, για παράδειγμα, από τη φόρμα εξουσιοδότησης στην περιοχή /index.php/component/users/?view\u003dlogin.


Τώρα μπορείτε να δημιουργήσετε χρήστες μέσω της επιθυμητής μεθόδου. Αν συμβεί όλα, συγχαίρω - απλά κατανοούσατε την ευπάθεια CVE-2016-8870 "Η έλλειψη επαλήθευσης των αδειών για την καταχώριση νέων χρηστών".

Εδώ είναι πώς μοιάζει με τη μέθοδο "Εργασία" του μητρώου () από τον ελεγκτή του UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Εάν η εγγραφή είναι απενεργοποιημένη - Ανακατεύθυνση στη σελίδα σύνδεσης. 114: Αν (jcomponenthelper :: getparams ("com_users") -\u003e get ("afallaserregistration") \u003d\u003d 0) 115: (116: $ Αυτό-\u003e setredirect (jroute :: _ ("index.php? Επιλογή \u003d com_users & View \u003d Login ", FALSE)). 117: 118: Επιστροφή FALSE, 119 :)

Και έτσι σε ευάλωτα:

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

Ναι, σε καμία περίπτωση.

Για να κατανοήσουμε το δεύτερο, πολύ πιο σοβαρό πρόβλημα, θα στείλουμε ένα αίτημα που σχηματίζεται από εμάς και θα ακολουθήσουμε πώς εκτελείται σε διαφορετικά τμήματα του κώδικα. Εδώ είναι ένα κομμάτι που είναι υπεύθυνο για τον έλεγχο των δεδομένων που αποστέλλονται από το χρήστη στη μέθοδο εργασίας:

Συνέχεια που διατίθεται μόνο στους συμμετέχοντες

Επιλογή 1. Συμμετοχή στην κοινότητα του ιστότοπου για να διαβάσετε όλα τα υλικά στον ιστότοπο

Η ιδιότητα μέλους στην κοινότητα κατά τη διάρκεια της καθορισμένης περιόδου θα σας ανοίξει πρόσβαση σε όλα τα υλικά του χάκερ, θα αυξήσει την προσωπική σας συσσωρευμένη έκπτωση και θα συσσωρεύσει μια επαγγελματική βαθμολογία βαθμολογίας xakep!

Δημιουργήστε τη δική σας σελίδα εγγραφής για πολυεπίπεδη αντί για πρότυπο WP-signup.php.

Στη συνήθη εγκατάσταση του WordPress, η σελίδα εγγραφής (εξουσιοδότηση, επαναφορά κωδικού πρόσβασης) εμφανίζει το αρχείο WP-login.php.

  • /wp-login.php - Εξουσιοδότηση
  • /wp-login.php?action\u003dregister - εγγραφή
  • /wp-login.php?action\u003dlostpassword - επαναφορά κωδικού πρόσβασης

Για πολλούς πολλαπλούς WP-login.php Υπάρχουν ξεχωριστές συνθήκες. Έτσι, όταν κάνετε κλικ στο σύνδεσμο /wp-login.php?action\u003dregister σε multisaite, το WordPress θα κάνει μια ανακατεύθυνση στη σελίδα /wp-signup.php. Σε πολλά θέματα, η σελίδα δεν φαίνεται πολύ ελκυστική, οπότε θα κάνουμε το δικό μας.

Κύριο δίκτυο ιστοχώρου

Από προεπιλογή, το WordPress ανοίγει τη σελίδα εγγραφής (WP-Signup.php) στο δίκτυο κύριου τομέα (ιστότοπου). Ωστόσο, μπορείτε να κάνετε μια ξεχωριστή σελίδα εγγραφής για κάθε τοποθεσία δικτύου, ακόμα και αν έχουν διαφορετικά θέματα. Θα εξετάσουμε την υπόθεση όταν σε όλες τις τοποθεσίες δικτύου έχουν τη δική του σελίδα εγγραφής, αλλά το ίδιο θέμα χρησιμοποιείται και οι τοποθεσίες διαφέρουν μόνο στη γλώσσα. Εάν χρησιμοποιούνται διαφορετικά θέματα, θα χρειαστεί να γράψετε περισσότερους κώδικες.

functions.php;

Δεν. Το όνομα αυτού του αρχείου φαίνεται να αναφέρεται σε οποιοδήποτε άρθρο σχετικά με το WordPress. Στην περίπτωσή μας, λαμβάνοντας υπόψη το γεγονός ότι η λειτουργικότητα καταχώρισης έχει σχεδιαστεί για αρκετούς ιστότοπους, έχει νόημα να το πάρετε σε mu-plugins που φορτώνονται κατά το άνοιγμα οποιουδήποτε ιστότοπου.

Λυρική απομάκρυνση

Αξίζει να σημειωθεί ότι τα mu-plugins είναι φορτωμένα νωρίτερα από τα συνηθισμένα plug-ins και μέχρι να μεταφορτωθεί πλήρως ο πυρήνας του WordPress, οπότε η πρόσκληση για ορισμένες λειτουργίες μπορεί να οδηγήσει σε σφάλματα FATABAL σε PHP. Παρόμοιες η λήψη "νωρίς" έχει τα πλεονεκτήματά του. Ας πούμε μέσα σε οποιοδήποτε θέμα δεν μπορεί να προσκολληθεί σε κάποια ενέργεια που ενεργοποιείται πριν κατεβάσει το αρχείο functions.php από το θέμα. Ένα παράδειγμα αυτού μπορεί να χρησιμεύσει ως plugin jetpack_module_loaded_related-posts (σχετικές θέσεις - το όνομα της μονάδας) με το οποίο είναι δυνατόν να εντοπιστεί η δραστηριότητα των μονάδων στο jetpack. Είναι αδύνατο να "συμπλέκτη" από το αρχείο θέματος σε αυτή τη δράση, επειδή η ενέργεια έχει ήδη εργαστεί πριν από τη φόρτωση του θέματος - τα plugins φορτώνονται νωρίτερα. Μπορείτε να ρίξετε μια ματιά στην κοινή εικόνα της εντολής εκκίνησης του WordPress στη σελίδα αναφοράς δράσης στον κώδικα.

Παραγγελία στα αρχεία

Τα mu-plugins ενδέχεται να περιέχουν οποιοδήποτε αριθμό αρχείων και οποιοδήποτε διάγραμμα, το οποίο θα φανεί λογικό σε εσάς. Προσέχω περίπου μια τέτοια ιεραρχία:

| -Επιλογές | - Load.php | - | - | Selena-Network | - | - | - | - - | - | - | - | - | - | - | - | -... | - | - | - - | -jetpack | - | - | - | - | - -Plugin.php

Στο αρχείο Load.php, όλα τα απαραίτητα "plugins" είναι συνδεδεμένα στο δίκτυό μας:

Τοποθετήστε τα Trashlates για όλα τα addons load_muplugin_textdomain ("selena_network", "/ selena-network / γλώσσες /"); // Εγγραφή δικτύου Απαιτείται wpmu_plugin_dir. "/selena-network/signup/plugin.php"; // άλλα plugins // απαιτούν wpmu_plugin_dir ...

Μέσα στο φάκελο Selena-Network, αποθηκεύονται φακέλους plug-in, το καθένα έχει το δικό του plugin.php, το οποίο συνδέουμε στο Load.php. Δίνει ευελιξία και τη δυνατότητα να απενεργοποιήσετε γρήγορα και να συμπεριλάβετε μερικά πράγματα.

Διεύθυνση της σελίδας εγγραφής

Για να καθορίσετε τη διεύθυνση της σελίδας εγγραφής, χρησιμοποιήστε το φίλτρο WP_Signup_Location. Μπορεί να βρεθεί μέσα στο αρχείο WP-login.php και αυτός είναι υπεύθυνος για την ανακατεύθυνση στο WP-signup.php.

Περίπτωση "Εγγραφή": εάν (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 στο site μου για να αποφύγετε τις συγκρούσεις, θα πρέπει να αντικατασταθούν με το δικό του μοναδικό πρόθεμα. Η προτεραιότητα της προσθήκης φίλτρου 99, επειδή ορισμένα plugins, όπως το Bbpress και το BuddyPress, μπορούν να αντικαταστήσετε αυτή τη διεύθυνση με τη δική σας (τα mu-plugins φορτώνονται νωρίτερα από τα συμβατικά plugins, βλέπε παραπάνω). Παρακαλείστε να σημειώσετε ότι το home_url () χρησιμοποιείται, αντί του network_site_url (), για να αφήσετε τον επισκέπτη στον ίδιο τομέα. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε διεύθυνση URL ως διεύθυνση.

Δημιουργία σελίδας

Τώρα ας δημιουργήσουμε μια σελίδα με το site.com/signup/ μέσω μιας τακτικής διεπαφής και στο πρότυπο φακέλου υποκειμένου της κόρης για τη νέα μας σελίδα - signup.php. Αντί της λέξης "εγγραφή" μπορείτε να χρησιμοποιήσετε ένα μοναδικό αναγνωριστικό.

Μέσα στο νέο πρότυπο, πρέπει να καλέσετε τη λειτουργία Selena_Network_Signup_Main (), η οποία θα εμφανίσει τη φόρμα εγγραφής.

Αξίζει να σημειωθεί ότι η όλη διαδικασία με πρότυπα δεν απαιτείται και αντ 'αυτού μπορείτε να δημιουργήσετε το δικό σας shortcode, το οποίο θα καλέσει επίσης τη λειτουργία Selena_Network_Signup_Main ().

wp-signup.php και wp-activate.php

Τώρα θα δημιουργήσουμε μια λειτουργία που θα εμφανίσει τη φόρμα εγγραφής. Για να το κάνετε αυτό, αντιγράψτε τα αρχεία WP-Signup.php και WP-Activate.php από τη ρίζα Wordpress σε Mu-Plugings / 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-Activate.php. Μπορείτε να απενεργοποιήσετε αυτή τη λειτουργία χρησιμοποιώντας το φίλτρο wpmu_signup_user_notification μετακινώντας το ψεύτικο σε αυτό (αν αυτό δεν είναι να γίνει, η επιστολή ενεργοποίησης θα σταλεί δύο φορές, το εντάξει, στην πραγματικότητα δύο διαφορετικά γράμματα).

Λειτουργία ArmyOfselenagomez_wpmu_signup_user_notification ($ user_mail, $ key, $ meta \u003d contray (// ... // κώδικα από τη λειτουργία WPMU_Signup_user_notification () λειτουργία WP_Mail ) · Επιστρέψτε ψευδής;) add_filter ("wpmu_signup_user_notification", "Armatofselegenagomez_wpmu_signup_user_notification", 10, 4).

Ως αποτέλεσμα, η σελίδα εγγραφής στο θέμα της Selena άρχισε να φαίνεται πολύ καθαροί και προσεκτικοί.

συμπέρασμα

Το Διαδίκτυο έχει πολλούς άλλους τρόπους για να κάνει το ίδιο πράγμα - το Apache ανακατευθύνει, Ajax-Forms που δεν θα λειτουργήσει χωρίς το σενάριο Java κλπ. Δεν μου άρεσε πολύ, γι 'αυτό προσπάθησα να το κάνω πιο σωστά δική μου ιστοσελίδα.

Σημειώνω ότι τα αρχεία επεξεργασίας θα πρέπει να είναι σε θέση να είναι σε θέση να απομακρυνθούν προσεκτικά και να μην απομακρυνθούν από την πηγή στο RANDNESH, εάν το WordPress αλλάζει τα αρχεία WP-Signup.php και WP-Activate.php, ήταν ευκολότερα να τους συγκρίνουν να βρουν αλλαγές .

Μην ξεχάσετε να εξετάσετε τον πηγαίο κώδικα όλων των λειτουργιών που περιγράφονται παραπάνω για να αντιμετωπίσετε πλήρως το τι και πώς συμβαίνει μέσα στον κώδικα.

Δώρο. Προστασία από τους Spammers

Ακόμα και οι νεότερες τοποθεσίες στο WordPress υπόκεινται συχνά σε εγγραφή ανεπιθύμητων μηνυμάτων. Μπορείτε να γράψετε ατελείωτες συνθήκες για το φιλτράρισμα των bots, συχνά πιο παρόμοια με την προσπάθεια δημιουργίας μιας τεχνητής νοημοσύνης 🙂 στην περίπτωση ενός πολλαπλών, ένα τακτικό ανακατεύθυνση στο Apache με βοήθησε, με το οποίο όταν το άνοιγμα /wp-signup.php και / wp- Acitvate.php, ζήτησα να εκδώσω 404 (δεν είμαι ειδικός για τη ρύθμιση του Apache, έτσι ώστε οι κανόνες μου να μην είναι πολύ σωστοί).

Rewriteengine on rewritebase / rewriterule ^ wp-signup \\ grpp - rewriterule ^ wp-activate \\ nppp - # αρχίστε wordpress # κανόνες από το wordpress από προεπιλογή Μην αγγίζετε :) # ... # End Wordpress

Π. S. Προσπαθώ να περιγράψω κάποια πράγματα τρίτων όσο το δυνατόν λεπτομερώς, διότι όταν άρχισα, μερικές φορές ήταν κάπως να πει και να εξηγήσω πολλά πράγματα. Πιστεύω επίσης ότι παρόμοιες μικρές συμβουλές για άλλα υλικά θα ωθηθούν στη μελέτη κάτι καινούργιο και επεκτείνοντας το πεδίο γνώσης τους. Οι κανονικές εκφράσεις χρησιμοποιούνται σε αρχεία Reritityule, δεν είναι εντελώς πολύπλοκες, για παράδειγμα, το σύμβολο ^ σημαίνει την αρχή της γραμμής.

Καταγράφει μια λειτουργία που θα ενεργοποιηθεί κατά την ενεργοποίηση του plugin.

Αυτή η λειτουργία συνδέεται η καθορισμένη λειτουργία επανάκλησης στο γάντζο. Ενεργοποίηση_ (plugin) Και είναι ένα περιτύλιγμα για αυτό το άγκιστρο.

(Plugin) Στην ενεργοποίηση του αγκίστρου (plugin) αντικαθίσταται από το όνομα του σχετικού επιτρεπόμενου στο κύριο αρχείο plug-in. Για παράδειγμα, εάν το plugin είναι τοποθετημένο: περιεχόμενο WP / plugins / tamplegin / sample.php, τότε το όνομα του άγκιστρου θα είναι: Activate_SamplePlugin / Sample.php.

Από την έκδοση 3.1. Το άγκιστρο ενεργοποιείται μόνο κατά τη διάρκεια της ενεργοποίησης του plugin και δεν λειτουργεί κατά τη διάρκεια της αυτόματης ενημέρωσης του plugin.

Πως δουλεύει

Το plugin ενεργοποιείται από τη λειτουργία activate_plugin () στην οποία ενεργοποιείται η ενεργοποίηση του αγκίστρου (plugin).

Η λειτουργία Activate_plugin () στον πυρήνα προκαλείται μετά Φόρτωση μέσου VP . Αυτή η λειτουργία συνδέει το κύριο αρχείο Plug-in (και το μόνο που καθορίζεται σε αυτό) και στη συνέχεια μέσω ενός αγκίστρου ενεργοποιεί την καθορισμένη λειτουργία επανάκλησης. Λόγω αυτού, όλες οι λειτουργίες και οι τάξεις του plug-in είναι διαθέσιμες στη λειτουργία επανάκλησης. Όμως, δεδομένου ότι όλα τα κύρια γάντζοι του WP έχουν ήδη εργαστεί κατά τη διάρκεια της μεσαίας εκκίνησης, τότε δεν υπάρχουν συμβάντα plug-in που δεν έχουν τα άγκιστρα, για παράδειγμα plugins_loaded, δεν λειτουργούν πλέον όταν συνδέετε το κύριο αρχείο plug-in. Έτσι, το plugin μας θα συνδεθεί, αλλά όχι εντελώς: όχι όπως πρέπει να συνδεθεί όταν έχει ήδη ενεργοποιηθεί.

Για παράδειγμα, εάν το plugin κάνει οτιδήποτε κατά τη διάρκεια του plugins συμβάντος_loaded, τότε όλες αυτές οι ενέργειες απλά δεν θα συμβούν όταν η ενεργοποίηση του plug-in. Για παράδειγμα, εάν συνδέει το αρχείο μετάφρασης, το αρχείο μετάφρασης δεν θα συνδεθεί τη στιγμή που ενεργοποιεί τη λειτουργία επανάκλησης που καθορίζεται για την εγγραφή_action_hook ().

Κατά κανόνα, μετά την ενεργοποίηση της λειτουργίας επανάκλησης, υπάρχουν 2 συμβάντα για να κρεμάσετε λειτουργίες: Ενεργοποίηση_plugin και τερματισμός λειτουργίας.

Για να κάνετε κάτι εξαιρετικό όταν ενεργοποιηθεί το plugin, δείτε το παράδειγμα 5.

Οροι χρήσης

Η λειτουργία δεν θα λειτουργήσει εάν το καλέσετε τη στιγμή του γάντζου, για παράδειγμα, plugins_loaded, init. Η λειτουργία πρέπει να καλείται απευθείας από το κύριο αρχείο plug-in. Κανόνες ενεργοποίησης:

    Το Register_Active_Hook () θα πρέπει να καλείται από το αρχείο Master Plugin, από όπου βρίσκεται η οδηγία για το όνομα Plugin: ... και δεν πρέπει να καλείται από οποιοδήποτε άγκιστρο, όπως plugins_loaded ή init.

    Η λειτουργία του αγκίστρου θα πρέπει να βρίσκεται στο ίδιο αρχείο με το άγκιστρο ή να συνδεθεί εκ των προτέρων από άλλο αρχείο.

    Η λειτουργία του αγκίστρου δεν λειτουργεί στην οθόνη (ηχώ). Επειδή λαμβάνει χώρα η ανακατεύθυνση και η ηχώ. Αλλά μπορείτε να χρησιμοποιήσετε τη μήτρα ().

  1. Οι παγκόσμιες μεταβλητές (εάν υπάρχουν) πρέπει να καθοριστούν ρητά για την πρόσβαση σε αυτές από τη λειτουργία γάντζου.

Σημειώσεις σχετικά με την περιοχή των μεταβλητών

Κατά την ενεργοποίηση του plugin, το κύριο αρχείο plug-in δεν είναι συνδεδεμένο στην παγκόσμια περιοχή, αλλά στο εσωτερικό της λειτουργίας Activate_Plugin (). Επομένως, οι μεταβλητές που θεωρούνται παγκόσμιες στον συνήθη τρόπο λειτουργίας του plugin.

Έτσι, η λειτουργία που χρησιμοποιείται στην εγγραφή_activation_hook () μπορεί να μην βλέπει τις παγκόσμιες μεταβλητές, ακόμη και αν τις δηλώνονταν ως παγκόσμια μέσα σε αυτή τη λειτουργία. Παράδειγμα:

$ Myvar \u003d "κάτι"? Εγγραφή_activation_hook (__ αρχείο __, "myplugin_activate"); Λειτουργία Myplugin_action () (Global $ myvar, echo $ myvar, // η μεταβλητή δεν είναι ίση με "κάτι")

Λόγω αυτού του χαρακτηριστικού, θα πρέπει πάντα να προσδιορίζονται οι παγκόσμιες μεταβλητές. Όλες οι παγκόσμιες μεταβλητές πρέπει να ορίζονται ως παγκόσμια, ακόμη και αν η μεταβλητή υποδεικνύεται στο σώμα του plug-in. Μόνο στην περίπτωση αυτή θα είναι πρόσβαση σε αυτά οπουδήποτε. Παράδειγμα:

Global $ myvar; // δείχνουν σαφώς ότι πρόκειται για μια παγκόσμια μεταβλητή $ myvar \u003d "κάτι". Εγγραφή_activation_hook (__ αρχείο __, "myplugin_activate"); Λειτουργία Myplugin_action () (Global $ myvar, echo $ myvar, //\u003e κάτι)

Δεν υπάρχουν γάντζοι.

Επιστρέφει

ΜΗΔΕΝΙΚΟ. Τίποτα δεν επιστρέφει.

Χρησιμοποιώντας

Εγγραφή_activation_hook ($ αρχείο, λειτουργία $); $ αρχείο. (συμβολοσειρά) (απαιτείται) Η διαδρομή προς το κύριο αρχείο PHP Plugin, συμπεριλαμβανομένου του ονόματος του ίδιου του Plugin. Συνήθως χρησιμοποίησε τη μαγική σταθερή PHP __FILE__. $ Λειτουργία. (γραμμή / πίνακα / λάμδα) (απαιτείται)

Όνομα της λειτουργίας επανάκλησης. Για μαθήματα, χρησιμοποιήστε μια συστοιχία: πίνακα ($ αυτό, "όνομα λειτουργίας"). .

Η λειτουργία θα λάβει μια λογική μεταβλητή $ network_wide - εάν το plugin ενεργοποιείται για ολόκληρο το δίκτυο τοποθεσιών, με πολυκατάρι.

Παραδείγματα

#ένας. Εκτέλεση μιας λειτουργίας κατά την ενεργοποίηση του plugin

Υποθέτουμε ότι έχουμε μια λειτουργία my_plugin_activate () στο κύριο αρχείο plugin: WP-περιεχόμενο / plugins / myplugin / myplugin.php, στη συνέχεια για να ξεκινήσετε αυτή τη λειτουργία κατά την ενεργοποίηση του plugin, χρησιμοποιήστε έναν τέτοιο κωδικό:

Εγγραφή_activation_hook (__ αρχείο __, "my_plugin_active"); Λειτουργία my_plugin_activate () (// κωδικός ενεργοποίησης ...)

# 2. Εκκίνηση μιας μεθόδου κλάσης

Εάν το plugin χρησιμοποιεί την κλάση PHP, ο κωδικός ενεργοποίησης προστίθεται ως:

Εγγραφή_activation_hook (__ αρχείο __, πίνακα ("my_plugin", "εγκατάσταση")); CLASS MY_PLUGIN (Εγκατάσταση στατικής λειτουργίας () (// Μην δημιουργείτε κάποια έξοδο εδώ ...))

# 3. Εκτελέστε μια μέθοδο κλάσης από ένα ξεχωριστό αρχείο

Εάν η τάξη που περιέχει τη λειτουργία ενεργοποίησης βρίσκεται σε ένα ξεχωριστό αρχείο και, στη συνέχεια, καταχωρίστε τη λειτουργία ενεργοποίησης ως εξής:

Συμπεριλάβετε το __dir__. "/class-my_plugin.php"; register_activation_hook (__ αρχείο __, πίνακας ("my_plugin", "on_activate_function"));

#four. Εκτελέστε μια κατηγορία κατηγορίας από την τάξη

Εάν είστε μέσα __construct (). Σημαντικό, __File__ θα πρέπει να "κοιτάξει" στο master plugin αρχείο:

Register_activation_hook (__ αρχείο __, πίνακα ($ αυτό, "your_method_name"));

# 5 Κάντε κάτι αμέσως μετά την ενεργοποίηση του plugin

Μετά την ενεργοποίηση του plugin, ενεργοποιούνται μόνο δύο άγκιστρα: ενεργοποιηθεί_plugin και τερματισμός λειτουργίας.

Όταν πρέπει να κάνετε οτιδήποτε αμέσως μετά την ενεργοποίηση του plugin, μπορείτε να επισυνάψετε τη λειτουργία σε αυτά.

Όταν αυτή η λύση δεν είναι κατάλληλη, μπορείτε να χρησιμοποιήσετε τις επιλογές WP: Αποθηκεύστε τα δεδομένα στην επιλογή και, στη συνέχεια, ελέγξτε τη διαθεσιμότητα της επιλογής και κάντε κάτι εάν η επιλογή είναι:

// Κύριο αρχείο plug-in. ... Λειτουργία my_plugin_activate () (// Προσθέστε μια επιλογή σε τότε αν πρόκειται να κάνετε οτιδήποτε. add_option ("ενεργοποίηση_plugin", "plugin-slug"); // εδώ κωδικός ενεργοποίησης ...) my_plugin_activate "); Λειτουργία Load_plugin () (αν (IS_ADMIN () && get_option ("Activated_plugin") \u003d\u003d "plugin-slug") (// Αφαιρέστε την πρόσθετη επιλογή έτσι ώστε να μην λειτουργεί πια // και να κάνετε ό, τι χρειάζεστε ... delete_option ("Ενεργοποίηση_plugin") · // Κάντε οτιδήποτε άλλη μια φορά, μετά την ενεργοποίηση του plug-in // για παράδειγμα: add_action ("init", "my_init_function");)) Προσθήκη)))))).

Μια άλλη επιλογή να κάνετε κάτι κατά τη διάρκεια της ενεργοποίησης του plug-in είναι να δημιουργήσετε το δικό σας συμβάν όπως αυτό:

Λειτουργία My_PLUGIN_ACTIVATE () (// Εγκαταστήστε το γάντζο σας, ώστε να μπορείτε να πάτε σε αυτό από το ίδρυμα του plugin do_action ("my_plugin_active");) εγγραφή_activation_hook (__ αρχείο __, "my_plugin_action").

# 6 Μια άλλη επίδειξη της χρήσης της λειτουργίας

Ένα μικρό plugin που δείχνει πώς να χρησιμοποιήσετε τη λειτουργία:

/ * Όνομα Plugin: Περιγραφή δοκιμής: Δοκιμή * / Αποδείχνετε το Dirname (__ File__). "/ my_other_file.php"; / * Αυτός ο κώδικας δεν θα λειτουργήσει. Το άγκιστρο ενεργοποίησης πρέπει να καλείται από το κύριο αρχείο. Register_activation_hook (dirname (__ file__). "/My_other_file.php", "my_other_function"); * / // Αυτή είναι ένας κωδικός εργασίας. Εγγραφή_activation_hook (__ αρχείο __, "test_activated"); / * Αυτή είναι η σωστή επιλογή ανακοίνωσης και η πρόσβαση στις παγκόσμιες μεταβλητές. Οι παγκόσμιες μεταβλητές πρέπει να δηλώνονται σαφώς. Χωρίς αυτό δεν θα έχετε πρόσβαση σε αυτά. * / Global $ some_var; $ some_var \u003d "hey"? // λειτουργία test_active () (η επιλογή δεν θα λειτουργήσει. Εάν θέλετε να καταγράψετε αρχεία καταγραφής σε ένα προσωρινό αρχείο, χρησιμοποιήστε το FOPEN / FWRITE. Εάν θέλετε να ελέγξετε εάν το άγκιστρο ενεργοποίησης λειτουργεί, χρησιμοποιήστε την έξοδο () μέσα στη λειτουργία EXIT (). * / Echo "test_activated που ονομάζεται!";)