Quelles sont les meilleures pratiques de sécurité pour les plugins et thèmes WordPress? [fermé]

22

Comme suggéré dans cette question , j'ajoute ce sujet en tant que nouvelle question, pour la discussion / le vote de la communauté concernant les meilleures pratiques pour la sécurité des plugins / thèmes.

Voici la liste de contrôle de départ, basée sur mes paramètres actuels (travail en cours) / liste de contrôle de sécurité des données utilisée pour examiner les thèmes (les principes ne devraient pas être différents pour les plugins que pour les thèmes).

Si vous souhaitez consulter un thème avec une page de paramètres de thème sécurisée et solidement codée, consultez ce thème:
http://wordpress.org/extend/themes/coraline

Chip Bennett
la source
Si quelqu'un avec les privilèges appropriés ne voulait pas en faire un wiki communautaire?
Chip Bennett
Pour obtenir une question en mode wiki, un mod doit marquer la question de manière appropriée , je l'ai signalée à l'attention du mod, c'est juste une question de temps maintenant .. :)
t31os
Quelle est la particularité de la coraline? Imo il y a encore des façons d'entrer. Je suggère de lier les anons A insted: wordpress.stackexchange.com/questions/13539/…
kaiser
Il n'y a peut-être rien de particulier à propos de Coraline. C'est tout simplement celui que nous suggérons actuellement aux développeurs de thèmes, lors de la révision des thèmes, car c'est l'exemple donné par Justin Tadlock, qui a effectué la plupart des révisions initiales des thèmes spécifiques à la sécurité. Je proposerais l'œnologie comme un bon exemple, mais je ne veux pas apparaître comme essayant de proxénétiser mon propre thème. :)
Chip Bennett

Réponses:

12

Assainir, valider et échapper les données

Désinfectez tout ce qui pourrait entrer et sortir de (!) La base de données à la fois front-end et back-end!

Les plugins et les thèmes doivent effectuer une validation des données appropriée:

  1. Validez et désinfectez toutes les données non fiables avant d'entrer des données dans la base de données
  2. Échappez toutes les données non fiables avant de les afficher dans les champs du formulaire Paramètres
  3. Échappez à toutes les données non fiables avant de les afficher dans les fichiers de modèle de thème

Les plugins et les thèmes doivent être utilisés esc_attr()pour les entrées de texte et / esc_html()ou esc_textarea()pour les zones de texte.

Aussi disponible à partir de l'API WordPress est esc_url(), esc_url_raw(), esc_js()et wp_filter_kses().

Mauvais exemple:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Bon exemple:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Voici une superbe vidéo de Mark Jaquith expliquant l'utilisation des fonctions d'échappement:

Chris_O
la source
3
Assainissez en
entrant
9

Utilisez uniquement $ _GET / $ _POST / $ _REQUEST avec précaution et lorsque de meilleures API ne sont pas disponibles

Plugins et thèmes doivent utiliser les API des paramètres pour obtenir et enregistrer les données d'entrée de forme plutôt que de compter sur $_POSTet $_REQUESTdonnées directement.

Rarst
la source
3
Traitez toujours $ _POST, $ _REQUEST et $ _GET comme dangereux. Assainissez et mettez en liste blanche les valeurs de ces tableaux et placez-les dans vos propres variables. Ne nettoyez jamais les valeurs provenant de l'utilisateur et remettez-les dans $ _POST.
goldenapples
2
Vérifiez toujours que la clé que vous devez utiliser est définie dans le tableau approprié. isset () est votre ami :)
mfields
9

Utilisation $wpdb->prepare

Lors de la création de requêtes personnalisées via l' $wpdbobjet, utilisez toujours $wpdb->preparepour remplir les espaces réservés avec des valeurs au lieu d'écrire les requêtes avec des données mélangées avec du code SQL, car les mysql_*fonctions familiales ont mal enseigné à tout le monde.

Matteo Riva
la source
$wpdb->preparen'est pas la même chose que les déclarations préparées.
hakre
8

Soyez prudent avec les fonctions PHP qui pourraient être utilisées pour exécuter du code malveillant

Une bonne lecture pour quiconque écrit PHP: Fonctions PHP exploitables sur StackOverflow.

Utiliser l' API de modification de thème

Les thèmes doivent utiliser set_theme_mod()les fonctions associées et non pas un schéma de noms inventé par soi-même.
L'API theme_mod est une couche spécialisée pour l'API des paramètres; il garantit des noms uniques, pousse toutes les options dans un seul tableau et est - d'après mon expérience - beaucoup plus facile à gérer. De plus, il propose des filtres standardisés pour les plugins - ce qui est bon pour l'interopérabilité.

Éviter activé register_globals

Ne comptez pas sur register_globals = on. Un thème Pro que mon dernier client a acheté fait exactement cela. Je pourrais pirater n'importe quel site utilisant ce thème en 5 minutes…
ThimbThumb l'a fait aussi (et le fait toujours?).

Ne créez pas de fichiers avec des autorisations d'accès large inutiles

Ne créez pas de fichiers avec des autorisations d'accès trop libérées.

Utilisez SSL si disponible

Pointez votre partage sur Twitter / Facebook / Tout lien vers l'URI HTTPS si disponible. La sécurité de votre lecteur est également importante.

fuxia
la source
2
Pouvez-vous expliquer en set_theme_mod()particulier comment la combiner correctement avec l'utilisation de l'API Paramètres?
Chip Bennett
@Chip Bennett J'ai ajouté quelques informations à ma réponse.
fuxia
Pouvez-vous décomposer cette mini-liste en réponses plus petites et plus spécifiques? Plus facile à gérer le wiki de la communauté en petits morceaux. TIA
Rarst
3
Puce: le système de mod Thème ne s'intègre pas trop bien avec l'API Paramètres. Je rédigerai un article expliquant comment le faire correctement très bientôt.
Otto
7

Enregistrer les données dans un seul tableau

Les plugins et les thèmes doivent enregistrer les options dans un seul tableau, plutôt que de créer plusieurs options pour la page des paramètres. L'utilisation de l'API Paramètres gérerait cela.

Chip Bennett
la source
6

Vérifiez la capacité appropriée lors de l'ajout et de la sortie des pages de paramètres

Les plugins doivent utiliser une capacité appropriée (par exemple manage_options) pour la capacité d'ajouter la page des paramètres.

Les thèmes doivent utiliser edit_theme_optionscomme capacité appropriée pour ajouter la page des paramètres.

Rarst
la source
1
Petite mais importante note: vous ne pouvez pas utiliser edit_theme_optionsavec l'API des paramètres, la soumission d'options est codée en dur à exiger manage_optionspour soumettre des mises à jour. Le ticket Trac associé peut être trouvé ici .
t31os
Certes, mais 1) cela n'affectera que les éditeurs, pas les administrateurs; et 2) j'espère que cela sera bientôt résolu, via le ticket Trac lié.
Chip Bennett
Il y a toujours la possibilité de donner un edit_theme_optionscap à un rôle personnalisé ou à un rôle régulier , j'ai pensé qu'il pourrait être utile de souligner que l'API des paramètres dans son état actuel n'est utilisable que par les rôles ayant la manage_optionscapacité.
t31os
5

Utilisez des tutoriels et des informations à jour

Les plug-ins et les thèmes doivent à la fois implémenter délibérément les pages Options et Paramètres et ne pas s'appuyer sur des didacticiels de site Web de copier-coller qui sont obsolètes et n'incluent pas une sécurité des données appropriée, comme celles répertoriées ci-dessous.

Exemples de choses à ne pas faire :

t31os
la source
1
J'ai ajouté un petit texte souligné pour indiquer que les liens sont des exemples de ce qu'il ne faut pas faire, car il est facile de parcourir les informations et de cliquer sur les liens sans lire le paragraphe qui les précède. J'ai également rendu la réponse un peu plus jolie pendant que
j'y étais
2
Cela pourrait utiliser un peu d'explication sur ce que font exactement les exemples de didacticiels d'une manière incorrecte et / ou ancienne.
Rarst
4

Utiliser l'API Paramètres

Les plugins et les thèmes doivent utiliser l'API Paramètres, qui est plus facile à utiliser, plus sécurisé et prend en charge une grande partie du travail acharné des pages de paramètres:

Pour obtenir de bons didacticiels sur l'utilisation de l'API Paramètres, voir:

Chip Bennett
la source
Voir mon commentaire sur cette réponse en ce qui concerne les paramètres API et les options de thème.
t31os
1

Pour les cases à cocher et les options de sélection, les plug-ins et les thèmes doivent utiliser les fonctions checked()et selected()pour la sortie checked="checked"et selected="selected", respectivement.

Chip Bennett
la source
Pas vraiment une question de sécurité, sauf si je manque quelque chose. Toujours très pratique et bon à utiliser. :)
Rarst
Eh bien, peut-être et peut-être pas. J'ai vu BEAUCOUP de code personnalisé pour accomplir la même chose. Plus de spaghetti de code = plus d'occasions d'introduire des risques de sécurité. :)
Chip Bennett
Bennet - de mailing avec toscho il y a quelques jours - je suppose que je peux le dire pour nous deux - les fonctions les plus simples sont beaucoup plus faciles à lire et à comprendre que ces fonctions. Je ne suis pas en baisse, mais je n'évoque pas ça non plus. Imo, cela ne devrait pas faire partie du noyau, car cela n'ajoute aucune valeur.
kaiser
2
Je suis curieux de savoir ce que vous avez trouvé plus facile que checked( $theme_options['whatever_option'] )ou checked( 'some_value' == $theme_options['whatever_option'] ). Je ne sais pas comment ça devient plus succinct que ça?
Chip Bennett
1

Fonction de préfixe et noms de variables

Les plugins doivent préfixer toutes les options, fonctions personnalisées, variables personnalisées et constantes personnalisées avec plugin-slug.

Les thèmes doivent préfixer toutes les options, fonctions personnalisées, variables personnalisées et constantes personnalisées avec le thème-slug.

Chip Bennett
la source
J'étendrais cela à tous les noms de classe ainsi qu'aux noms d'objets personnalisés comme les post_types et les taxonomies.
mfields
1

Utilisez wp_safe_redirect () au lieu d'appeler la fonction header () de php directement lorsque vous dirigez vers une page sur le même domaine.

mfields
la source
0

Ajouter des pages de paramètres aux sections appropriées du menu d'administration

Les plugins doivent utiliser la add_options_page()fonction pour ajouter la page des paramètres du plugin au Settingsmenu, plutôt que d'utiliser add_menu_page()pour ajouter un menu de niveau supérieur.

Les thèmes doivent utiliser la add_theme_page()fonction pour ajouter la page des paramètres de thème au Appearancemenu, plutôt que d'utiliser add_menu_page()pour ajouter un menu de niveau supérieur.

Chip Bennett
la source