Comme suggéré dans cette question , j'ajoute ce sujet en tant que nouvelle question, destinée à la discussion/au vote de la communauté concernant les meilleures pratiques en matière de sécurité des plugins/thèmes.
Voici la liste de contrôle de départ, basée sur la liste de contrôle de sécurité des paramètres/données actuelle (en cours de préparation) utilisée pour examiner les thèmes (les principes ne doivent pas être différents pour les plug-ins, mais 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
Les plugins et les thèmes doivent explicitement fournir la vérification nonce de la page Settings, si vous n'utilisez pas l'API Settings:
Désinfectez tout ce qui pourrait entrer et sortir de (!) La base de données à la fois en amont et en aval!
Les plugins et les thèmes doivent effectuer la validation des données appropriée:
Escape toutes les données non fiables avant d'être affichées dans les fichiers de modèle de thème
Les plugins et les thèmes doivent utiliser esc_attr()
pour les saisies de texte et esc_html()
ou esc_textarea()
pour les zones de texte.
Également disponible à partir de l'API WordPress: 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:
$wpdb->prepare
Lors de la création de requêtes personnalisées via l'objet $wpdb
, utilisez toujours $wpdb->prepare
pour renseigner des espaces réservés avec des valeurs plutôt que d'écrire les requêtes avec des données mélangées avec du code SQL, car les fonctions de la famille mysql_*
ont été mal enseignées à tout le monde.
Les plugins et les thèmes doivent utiliser l’API de configuration pour obtenir et enregistrer des données d’entrée de formulaire plutôt que de s’appuyer directement sur les données $_POST
et $_REQUEST
.
Une bonne lecture pour tous ceux qui écrivent PHP: Exploitable PHP fonctions sur StackOverflow.
Les thèmes doivent utiliser set_theme_mod()
et les fonctions associées not un schéma de noms inventé par eux-mêmes.
L'API theme_mod est une couche spécialisée pour l'API de paramètres. il garantit des noms uniques, insère toutes les options dans one array 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é.
register_globals
Ne comptez pas sur register_globals = on
. Un Pro Theme que mon dernier client a acheté fait exactement cela. Je pourrais pirater n'importe quel site utilisant ce thème en 5 minutes…
ThimbThumb a fait cela aussi (et le fait toujours?).
Ne créez pas de fichiers avec des autorisations d'accès trop libérées.
Pointez vos Partager sur Twitter/Facebook/Anything liens vers l'URI HTTPS, le cas échéant. La sécurité de votre lecteur est également importante.
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 Settings permettrait de gérer cela.
Les plugins doivent utiliser une capacité appropriée (par exemple, manage_options
) pour pouvoir ajouter la page des paramètres.
Les thèmes doivent utiliser edit_theme_options
en tant que capacité pour ajouter la page de paramètres.
Les plug-ins et les thèmes doivent à la fois implémenter les pages Options et Paramètres délibérément et not s'appuyer sur des tutoriels de site Web copiés et collés qui sont obsolètes et qui n'incluent pas une sécurité des données appropriée, telle que celles énumérées ci-dessous.
Exemples de ce que ne pas faire :
Comment créer une page d'options pour votre thème wordpress (1stwebdesigner.com)
Créez une page d'options pour le thème WordPress géniale, partie 1 (wpshout.com)
Les plugins et les thèmes doivent utiliser l'API Settings, qui est plus facile à utiliser, plus sécurisée et prend en charge une grande partie du travail acharné des pages de paramètres:
Pour de bons tutoriels sur l’utilisation de l’API de paramètres, voir:
Utilisez wp_safe_redirect () au lieu d’appeler directement la fonction header () de php lors du passage à une page du même domaine.
Les plugins doivent préfixer plugin-slug dans toutes les options, fonctions personnalisées, variables personnalisées et constantes personnalisées.
Les thèmes doivent préfixer theme-slug dans toutes les options, les fonctions personnalisées, les variables personnalisées et les constantes personnalisées.
Pour les cases à cocher et les options sélectionnées, les plug-ins et les thèmes doivent utiliser les fonctions checked()
et selected()
pour générer checked="checked"
et selected="selected"
, respectivement.
Les plug-in doivent utiliser la fonction add_options_page()
pour ajouter la page des paramètres du plug-in au menu Settings
, plutôt que d'utiliser add_menu_page()
pour ajouter un menu de niveau supérieur.
Les thèmes doivent utiliser la fonction add_theme_page()
pour ajouter la page des paramètres de thème au menu Appearance
, plutôt que d'utiliser add_menu_page()
pour ajouter un menu de niveau supérieur.