Wp_nonce_field est-il vulnérable si vous connaissez le nom de l'action? En fait, j'ajoute un champ caché avec name = le nom du nom de l'action dans mon formulaire afin que mon plug-in puisse l'identifier. Je veux savoir s'il y a des problèmes de sécurité si je mets mon nom d'action "visible"?
edit: J'automatise en réalité mon flux de travail de soumission de formulaire; Donc, si l'affichage du nom de l'action est une préoccupation, je peux le chiffrer. ex. J'appelle MyFormPlugin::generateAction( 'submitQuestion' );
dans mon formulaire pour générer le nonce et mon champ d'action "form_action" masqué.
class MyFormPlugin{
public static function generateAction( $action, $referer = true ){
$nonce_field = wp_nonce_field( self::secured_action( $action ), "mfp_nonce" , $referer , FALSE );
return $nonce_field.'<input type="hidden" name="form_action" value="'.$action.'"/>';
}
public static function secured_action( $action ){
return md5( $action.'randomsalt');
}
public function verify_nonce( $action ){
$nonce = $_POST[ 'mfp_nonce' ];
return wp_verify_nonce( $nonce, self::secured_action( $action ) );
}
}
cela semble-t-il sécurisé?
Réponse courte: Non. Vous pouvez utiliser des chaînes normales pour les actions, leur md5 ne change rien.
Le nonce est construit à partir de trois informations principales:
Time: La time()
actuelle divisée par 43200 est insérée dans le nonce. C’est ce qui permet de changer le nonce toutes les 12 heures (43 200 secondes en 12 heures).
La chaîne d'action que vous fournissez. Plus à ce sujet ci-dessous.
L'ID utilisateur. Chaque utilisateur obtient différents nonces.
Maintenant, ces éléments sont concaténés et le nonce lui-même est (un plus petit morceau) la wp_hash()
de cette chaîne combinée. La fonction wp_hash()
corrige automatiquement le hachage, en utilisant ici les constantes NONCE_KEY et NONCE_SALT, qui doivent être définies dans votre fichier wp-config.php et qui doivent être uniques pour votre site particulier.
(Notez que si vous utilisez le paramètre par défaut "placez votre phrase unique ici" dans ce fichier pour une raison quelconque, WordPress génère en interne des valeurs aléatoires de 64 caractères pour les clés/sels et les stocke dans la base de données. Il n'utilisera pas le Les valeurs par défaut en tant que sels ne vous autoriseront pas non plus à utiliser des clés en double ou des sels. Néanmoins, vous devez avoir les clés et les sels définis dans le fichier wp-config.php et ne pas vous y fier. pouvez obtenir des lignes aléatoires pour ce fichier à partir d’ici: https://api.wordpress.org/secret-key/1.1/salt/ )
Donc, pour dupliquer un nonce, vous avez besoin de toutes ces informations. Le temps et l'ID utilisateur peuvent probablement être déduits. La chaîne d'action peut être connue. Mais le sel est une valeur secrète qui ne devrait pas être connue de l’attaquant, ce qui rend impossible la duplication du nonce.
Cela dit, la chaîne "action" doit être aussi unique que possible dans chaque cas. Il devrait être différent pour chaque action, comme delete_thing vs update_thing vs create_thing. Et il devrait contenir un "ID" s'il agit sur un objet spécifique, par exemple "delete_thing_123" pour cet objet spécifique.
L'inclusion de données complexes dans la chaîne d'action, comme le hachage MD5 de quelque chose, n'apporte pas nécessairement une sécurité réelle. Le nonce est déjà construit à l'aide de la méthode de synthèse de message HMAC avec des valeurs secrètes salées. Toutefois, le nonce sera le même pour la même action. L'action doit donc être spécifique au cas afin de rendre le nonce imprévisible pour plusieurs cas. Un nonce utilisé pour supprimer un élément ne supprimera aucun élément, type de chose.
Sachez également que les valeurs d’action générant des nonces doivent être entièrement générées en interne. En aucun cas, les entrées de l'utilisateur ne doivent être utilisées pour déterminer l'action qui génère le nonce. Si un utilisateur peut injecter des données pour déterminer la chaîne d'action, il peut alors obtenir des informations à l'avance. Les nonces doivent être des chaînes statiques uniques avec éventuellement un identifiant concaténé.
TL; DR: Utilisez une chaîne simple avec un ID (si le fait de posséder un ID a un sens). C'est juste bien.