Unlimited do PHP Action. Php _self dans l'attribut de formulaire d'action. Moments indésirables associés à la variable php _self

La principale caractéristique de la fondation flexible WordPress consiste à une utilisation habile des crochets. Utilisé dans des thèmes, des plugins et des noyaux, les crochets permettent d'obtenir une expansion sans précédent tout en maintenant une compatibilité avec des versions WordPress ultérieures. À partir de là, il s'ensuit que la compréhension des crochets devrait être une partie obligatoire du "répertoire" des développeurs. Rejoignez-nous - aujourd'hui, nous examinerons les côtés cachés de cette simple, mais en même temps un système puissant. Ce qui sera discuté: nous courons sur le concept de crochets, de leur utilisation et, bien sûr, montrez des exemples d'utilisation.

Concept: Quels sont les crochets et pourquoi sont-ils utilisés?

Pour tout logiciel écrit qualitativement réside dans un concept puissant qui répond aux questions "Qu'est-ce qui est?" et pourquoi?". Crochets - Aucune exception. Parlant avec des mots simples, un crochet est un espace réservé à l'action. Lorsqu'un événement spécifique survient, tel qu'une publication d'enregistrement, un crochet est activé, vous permettant de mettre en œuvre la réaction appropriée. En termes de développeurs, les crochets sont un exemple de système géré par des événements.

Le concept de crochets nécessite une explication plus détaillée, plutôt qu'une définition simple du terme - nous devons comprendre ce qu'ils sont utiles. Les crochets jouent dans le rôle clé WordPress en raison du développement continu de ce système. Des centaines de développeurs mettent constamment mis à jour le système, ce qui signifie qu'il n'est pas possible de modifier les fichiers de base de chaque plug-in, de chaque plug-in, ou d'un paramètre séparé, car ils changeront souvent. Au lieu de cela, un cadre est nécessaire pour élargir le système, permettant de connecter la fonctionnalité externe pour atteindre le même effet puissant, comme dans le cas de manipulations internes. Hooks - une caractéristique clé de ce cadre.

Comment appliquer des crochets?

En tant que développeur, vous devez comprendre non seulement les crochets ou pourquoi ils sont introduits, mais également savoir comment les créer. En d'autres termes, pour comprendre pleinement le système de crochets, vous devez déterminer comment ils sont appliqués.

Par analogie avec un test écrit, une vue sur les réponses n'est pas toujours la meilleure idée. Selon de nombreuses stratégies de dépassement des tests, vous devez d'abord lire la question, formuler vos propres réflexions sur la réponse, puis prendre une décision que le plus proche rencontre votre justification. Une telle méthode peut être appliquée dans le processus d'étude du développement de logiciels; Au lieu de regarder dans le code de quelqu'un pour comprendre comment une une ou une autre caractéristique est mise en œuvre, il est souvent utile de l'écrire vous-même, puis de revenir en arrière et d'explorer son travail. C'est ainsi que nous ferons.

Travailler avec la documentation

Pour comprendre comment le système est mis en œuvre dans la pratique, il est souvent utile de regarder la documentation. Étudions l'article sur les deux fonctions de base du Sous-Patch présentées dans le code:

  • add_action ($ crochet, $ FONCTION [, $ Priorité [, $ Numargs]]]) - Spécifie le traitement de la fonction de fonction $, qui est appelé si un crochet spécifique $ Crochet est activé à la suite d'un événement. $ Priorité détermine si ce gestionnaire de fonction sera causé avant ou après d'autres gestionnaires de fonctions (par défaut, la variable est de 10). Plus ce indicateur est petit, plus la fonction sera causée précédemment. $ Numargs - Nombre d'arguments reçus par le gestionnaire de fonctions (par défaut 1).
  • do_action ($ crochet [, $ arg1 [, $ arg2 [, $ arg3 [, ...]]]]]]) - Active un certain crochet $ Crochet en appelant toutes les fonctions avec des arguments facultatifs $ arg1, $ arg2, $ arg3, etc. ..

Maintenant, lorsque nous avons une documentation dans une seule main, nous pouvons tirer des conclusions sur ces deux fonctions. Add_action connecte simplement la fonction, la priorité et le nombre d'arguments avec une chaîne. Il rappelle à la tâche idéale pour les tableaux PHP, qui fonctionnent également en tant que cartes de hash stockant des paires de clés. DO_ACTION est une fonction plus triviale - elle fait appel à ce tableau, à la recherche de gestionnaires fonctionnels et les cause par la suite. En tenant notre schéma en mémoire, il est temps d'aller à l'utilisation de crochets.

Appliquer les connaissances acquises dans la pratique

Puisque nous le faisons pour obtenir des connaissances sur le système WordPress Huk, nous n'avons pas besoin d'appliquer ces deux fonctions en pleine conformité avec la documentation. Concentrons plutôt leur utilisation sans paramètres inutiles pour économiser votre temps et comprendre rapidement l'essence.

Avant de commencer, créons un plan d'action:

  • Nous aurons besoin d'un tableau global qui sera disponible pour les deux fonctions.
  • add_action Enregistrer dans la matrice du nom de crochet spécifié et de l'ensemble des gestionnaires appropriés sous la forme d'une paire de valeur de clé.
  • dO_ACTION recevra des gestionnaires de fonctions à partir d'un tableau pour un crochet donné et fera chacune d'elles.

Le code ressemblera à ceci:

$ actions \u003d tableau (); Fonction Add_action ($ Crochet, $ Fonction) (Global $ Actions; // Créez une gamme de gestionnaires de fonction si elle n'existe pas déjà si (! Isset ($ Actions [$ Hook] \u003d Array (); // Ajoutez la fonction actuelle à la liste des gestionnaires de fonction $ $ Actions [$ crochet] \u003d $ fonction;) Fonction DO_ACTION ($ Crochet) (ESSET ($ Actions])) (// Appeler chaque gestionnaire de fonctions Associé à ce crochet foreach ($ Actions [$ Hook] en tant que fonction $ fonction) call_user_func ($ fonction);)))

Excellent; Nous avons créé un système universel de crochets en utilisant environ 20 rangées de code. Maintenant que nous avons une idée de la façon dont les crochets fonctionnent, plongent dans le code de noyau WordPress pour confirmer nos hypothèses.

Vous pouvez rapidement vous déplacer le long du code à l'aide de différents outils, tels que, par exemple, la référence croisée PHP de Yoast de la source WordPress.

Recherche par "add_action" donne le code suivant:

Fonction Add_action ($ TAG, $ FONCTION_TO_AADD, $ priorité \u003d 10, $ accepté_args \u003d 1) (Retour add_filter ($ tag, $ Function_to_add, $ Function_Args ($ étiquette, $ function_to_add, $ priorité \u003d 10 , $ accepté_args \u003d 1) (Global $ wp_filter, $ fused_filters; $ idx \u003d _wp_filter_build_unique_id ($ tag, $ fonction de fonctionnaire_to_add, $ wp_filter [$ tag] [$ IDX] \u003d tableau ("Fonction" \u003d \u003e $ fonctionnaire_to_add, "accepté_args" \u003d\u003e $ accepté_args); non défini ($ fusible_filters [$ tag]); retourne vrai;)

add_action cause add_filter, qui ajoute à son tour une fonction spécifiée à un tableau associé à $ Crochet d'étiquette. Malgré le fait que nous utilisons ici également les paramètres prioritaires et $ acceptées, cette fonctionnalité répond pleinement à nos hypothèses. Do_action sera légèrement plus longue et plus difficile:

Fonction do_action ($ tag, $ arg \u003d "") (DO (FORECH ((((((((($) Courant ($ wp_filter [$ tag]) comme $ the_) Si ($! IS_NULL (_ "Fonction"])) Call_user_func_array ( $ La _ ["Fonction"], Array_slice ($ args, 0, (int) $ THE _ ["accepté_args"])));) tandis que (suivant ($ ($ tag])! \u003d\u003d Faux););

Le passage cyclique des fonctions connexes et le défi de chacun d'entre eux n'est pas pour nous quelque chose d'étrange; En fait, c'est exactement ce dont nous avons parlé dans notre mise en œuvre. Par conséquent, le fait que nous ayons commencé avec des réflexions sur le code, non seulement nous a aidés à mieux comprendre cela, mais également réveillé la pensée critique pour résoudre le problème, ce qui est très important dans le développement de logiciels.

Exemples

Possédant la compréhension du travail des crochets, jetons un coup d'œil aux deux autres exemples. Le premier exemple fonctionne avec RSS; Au lieu d'envoyer des notifications via la syndication, pourquoi ne pas utiliser de courrier électronique pour cela?

Système de notification de courrier

Pour mettre en œuvre ce système, nous devons recevoir la date d'enregistrement. Cependant, quel crochet devrions-nous utiliser pour cela? La description de l'API d'action propose une liste de huttes ainsi que les événements qui leur sont liés, ce qui nous aidera à obtenir la réponse à la question ci-dessus. La description du crochet Publish_post convient à nos exigences, car ajoutons le gestionnaire des fonctions.

Add_action ("Publier_post", "notify_via_email");

Tout ce que nous avons laissé à faire est d'envoyer une notification par courrier électronique dans le gestionnaire de fonctions notify_via_email. Veuillez noter que le crochet Publish_post envoie un identifiant d'entrée comme argument à notre fonction. Cela nous permettra de recevoir des informations d'enregistrement à l'aide de la fonction get_post:

Fonction notify_via_email ($ post_id) ($ post \u003d get_post ($ post_id); $ to \u003d " [Email protégé]"; $ sujette \u003d" message publié sur ". get_bloginfo (" nom "); $ message \u003d $ post-\u003e post_title." a été publié sur ". Get_bloginfo (" comme de "$ post-\u003e post_date . ". Vous pouvez le voir à ". Get_permalink ($ post_id)." "." WP_MAIL ($ to, $ sujet, $ message);)

Après avoir reçu le dossier, nous appliquons son titre, sa date et son lien permanent dans notre message de courrier. Il sera ensuite envoyé à l'aide de la fonction WP_Mail, qui nécessite l'adresse du destinataire, le sujet de la lettre et le message comme paramètres. Avec tout cela, notre système d'envoi de notifications postales est prêt. Veuillez noter qu'il n'est pas recommandé d'appeler plusieurs fonctions WP_MAIL à la fois, car elle conduit à un délai de chargement de page notable après que le bouton de publication d'enregistrement soit enfoncé.

Branchement Google Analytics

Notre première application, laissez une brève introduction à l'utilisation des crochets. Nous allons maintenant donner un deuxième exemple, qui sera plus proche de l'utilisation réelle dans la pratique. Nous allons créer un simple plug-in Google Analytics, qui insérera automatiquement le code de suivi dans la page de la page.

Au début, il peut sembler que le sujet est un environnement plus approprié pour un tel code. Mais ce n'est qu'une performance imaginaire que pour le sujet du site est susceptible de versions et de modifications. Un code d'analyse peut être facilement perdu lors de la déplacement d'un sujet à un autre. La création d'un plugin vous permet d'éviter ce problème, car il restera actif quel que soit le sujet utilisé. Vous n'avez pas besoin de modifier le sujet à chaque fois que cela est remplacé.

Mais comment ajouter du code au pied de page du site? Tout de même - avec l'aide de crochets. Si vous avez travaillé avec des thèmes WordPress avant, vous avez probablement appelé les fonctions WP_head et WP_footer dans l'en-tête et le pied de page de votre site, respectivement. Ces deux fonctions activent simplement des crochets afin que les plugins puissent ajouter facilement leur code à ces zones vitales de la page. Par conséquent, nous allons juste ajouter l'action au crochet WP_footer:

Add_action ("wp_footer", "add_google_analytics_code");

Notre fonctionnalité Add_Google_analytics_Code, comme suppose son nom, imprime Google Analytics:

Assurez-vous de changer l'UA-XXXXXX-X à votre identifiant personnel, en fonction du site. En conséquence, tout fonctionnera. Ajoutez simplement le code spécifié au fichier et téléchargez-le sur votre dossier avec des plugins. Assurez-vous que le plugin contient un titre - par exemple, tel:

"N'utilisez pas l'opérateur GOTO" - Alors nous a dit aux enseignants de l'Académie et, en effet, cet opérateur transforme le code dans une bouillie complète. Les développeurs PHP ont résolu le problème de façon spectaculaire - ce n'est tout simplement pas dans PHP3 et PHP4. Quels étaient-ils initialement guidés? Peut-être que vous vouliez instiller notre style de programmation correct? Eh bien, nous pouvons dire que cela réussit tout à fait réussi - nous sommes tous déjà habitués, c'est vrai que cela ressemblait complètement à cet opérateur, c'est peut-être pour le meilleur, car à un moment donné, je devais trouver un design logique cela complètement compensé pour ce très illicant aller à..
Je ne connais personne comme personne, et j'ai particulièrement souvent le désir d'utiliser Goto lors de la création d'un gestionnaire HTML du formulaire, lorsqu'une variété de données est envoyée sur le serveur, que le script PHP devrait être progressivement. Ce processus est en règle générale, en plusieurs étapes: imprimer la forme elle-même, vérifier les données reçues, le pré-spectacle et, par exemple, sauvegarder. De plus, certaines étapes peuvent répéter: Si la vérification des données ne passe pas avec succès, passez à la forme du formulaire ou si le pré-spectacle ne convenait pas à l'utilisateur, il peut revenir à la saisie de données. En bref, certaines pièces de code peuvent être utilisées plusieurs fois. Il n'est également pas très pratique d'utiliser des fonctions dans ces conditions - de nombreuses variables d'entrée et de sortie, la fonction doit effectuer des actions trop complexes, en général, le Coryavo est obtenu et la lisibilité du code tombe fortement.
Et je suis venu avec un tel design.

fais (

interrupteur ($ Action) (

défaut:

se rompre;

cas "print_form":

Nous imprimons la forme principale

se rompre;

cas "check_form":

Vérifiez l'exactitude des données

se rompre;

cASE "Preview_Form":

Aperçu

se rompre;

cas "save_form":

Nous enregistrons les données

se rompre;

) Alors que (vrai);

Voici le principal opérateur de sélection multiple changer Enfermé dans un cycle infini faire pendant - Ainsi, nous regroupons les actions nécessaires dans les sections cas: pause; Et nous pouvons illimité de passer d'une section à une autre. Dans la section défaut: Il est pratique de faire une analyse préliminaire des données par exemple s'il n'y a pas d'entrée $ Action \u003d 'print_form' Nous imprimons le formulaire, s'il y a par exemple $ _Post ['Soumettre'] Ensuite, envoyez au traitement des données reçues $ Action \u003d 'check_form'. Le contrôle entre les blocs de commutation se produit en modifiant la variable $ Action., Eh bien, hors du cycle en utilisant pause 2; ou sortir.;
Par exemple, dans le bloc d'impression de la forme principale, vous pouvez mettre en sécurité pause 2; Tuyellement La forme de la forme implique la fin du script.
La conception est très flexible et lisible. Mais il y a un inconvénient - si les données sont traitées de manière incorrecte, vous pouvez entrer dans une boucle infinie et le script gèle - il est désagréable d'attendre aussi longtemps que 30 secondes.
Réglons la limite du nombre de cycles d'opérateur faire pendant, 20 suffit avec ta tête. Maintenant, si nous avons volé quelque chose que le script plaide 20 tours, arrêtez-vous et déposez un avertissement sur l'arrêt d'arrêt.
A formulé ce logement est très pratique - assez après l'opérateur sincère Imprimez la variable $ Action et nous obtenons une séquence complète d'exécution de bloc.

Faire (// au début de chaque cycle, imprimer la section Titre // rempli est très pratique pour déboguer echo $ Action. ""; Commutateur ($ Action) (par défaut: casse-caisse "print_form": / * Imprimez le formulaire principal * / break; cas "check_form": / * Nous vérifions l'exactitude des données * / casse; cas "Preview_Form": / * Prévisualisation * / BREAKE; CAS "SAVE_FORM": / * Enregistrer les données * / Break;) // Interrupteur de fin) tandis que ((($ i ++)< 20) or die("Принудительный останов цикла"));

Fais (

// au début de chaque cycle en tapant le nom

// la section complète est très pratique pour le débogage

echo $ action. "";< / strong >

Interrupteur ($ Action) (

défaut:

se rompre;

cas "print_form":

nous imprimons la forme principale

se rompre;

Cet article fait référence à l'utilisation de la variable PHP _self.

Quelle est la variable php _self?

La variable PHP _self renvoie le nom et le chemin du fichier actuel (par rapport à la racine du document). Vous pouvez utiliser cette variable dans l'attribut de formulaire d'action. Il y a aussi des nuances que vous devez savoir. Bien sûr, nous ne pouvons pas contourner ces nuances.

Regardons quelques exemples.

Echo $ _Server ["php_self"];

1) Supposons que votre fichier PHP soit situé à l'adresse suivante:

Http://www.yourserver.com/form-action.php.

Dans ce cas, la variable PHP _self contiendra:

"/Form-action.php"

2) Supposons que votre fichier PHP soit situé à cette adresse:

Http://www.yourserver.com/dir1/form-action.php.

Php _self sera:

"/Dir1/form-action.php"

Php _self dans l'attribut de formulaire d'action. Pourquoi en a-t-elle besoin là-bas?

En règle générale, la variable PHP _self est utilisée dans l'attribut TAG de formulaire. L'attribut d'action indique l'adresse auquel le contenu du formulaire sera envoyé après confirmation (cliquez sur le bouton avec le bouton Type \u003d "Soumettre"). En règle générale, il s'agit de la même page avec laquelle la forme est partie.

Toutefois, si vous renommez le fichier auquel le formulaire fait référence, vous devrez renommer le nom du fichier dans l'attribut Action, sinon le formulaire ne fonctionnera pas.

La variable PHP _self vous évitera des corrections inutiles, car l'adresse de la page sera générée automatiquement, en fonction du nom de fichier.

Supposons que vous ayez un fichier avec formulaire Form-Action.PHP, et vous souhaitez aller après la confirmation dans le même fichier. Écrire typiquement comme ça:

Mais vous pouvez utiliser la variable PHP _self au lieu de former-action.php. Dans ce cas, le code regardera:

" >

Code pour form-action.php

Nous combinons le script avec le formulaire:

$ Nom."; Écho"
YoucanRegarde un nouveau nom. ";)?\u003e ">

Le code qui se tient en haut de la page HTML sera effectué en premier. Dans la première ligne du code, il est vérifié: le formulaire est envoyé ou non. S'il y a $ _Post ["Soumettre"], alors la conception si elle est effectuée (true) et le nom entré par l'utilisateur sera affiché.

Si la variable $ _Post ["Soumettre"] n'existe pas, le formulaire n'a pas été envoyé et, en conséquence, la conception IF ne sera pas exécutée (Faux). Par conséquent, le nom d'utilisateur ne sera pas affiché.

Moments indésirables associés à la variable php _self

La variable PHP _self est utilisée pour obtenir le nom et le chemin du fichier actuel - bien, mais il peut également utiliser des pirates informatiques - mauvais. Si votre page est pHP _self, l'utilisateur peut entrer dans la barre oblique (/) et prescrire des scripts XXS de malveillants.

Considérons un exemple:

"Méthode \u003d" POST "\u003e

Maintenant, si l'utilisateur provient d'une URL normale, il y aura quelque chose comme ça dans la barre d'adresse.
http://www.yourdomaine.com/form-action.php.
Et le code décrit ci-dessus peut être trouvé comme celui-ci:

Dans ce cas, comme vous le voyez, tout va bien.

Considérons maintenant la situation lorsque l'utilisateur commence à "tricher" avec la chaîne d'adresse:
http://www.yourdomaine.com/form-action.php/%22%3eAalert ("XSS")% 3C.c.
/ script% 3e% 3CFOO% 22

Dans ce cas, après le travail PHP, votre code prendra ce genre:

Vous pouvez vous voir que la balise de script et l'équipe d'alerte ont été ajoutées au code. Lorsque cette page est chargée, l'utilisateur verra une fenêtre d'avertissement. Il s'agit d'un exemple simple de la manière dont la variable PHP _self peut être utilisée.

Tout code JavaScript peut être ajouté entre les balises de script. Hacker peut également se référer au fichier JavaScript qui sera situé sur un autre serveur. Dans ce fichier, ce sera probablement un code malveillant par lequel un pirate informatique peut changer de variables globales et modifier le formulaire à une autre adresse afin d'intercepter les données saisies par l'utilisateur.

Comment éviter les problèmes liés à php _self

Les problèmes peuvent être évités à l'aide de la fonction HTMLenties (). Jetez un coup d'œil au code du formulaire où la fonction HTMLenties () est présente.

"Méthode \u003d" Post "\u003e

La fonction HTMLENTIES () convertit tous les caractères possibles aux entités HTML correspondantes. Maintenant, une tentative de contournement de la variable PHP _self échouera et le résultat de l'introduction d'un code malveillant à exprimer dans ce qui suit:

Avez-vous aimé l'article? Partager avec des amis: