web-dev-qa-db-fra.com

Comment vérifier un nonce ajax dans PHP

Je modifie le mode multimédia en ajoutant un nouvel élément de menu pour ajouter des pièces jointes externes à la bibliothèque multimédia. Depuis le code JS, j'appelle une fonction PHP qui touche la base de données et accepte trois paramètres (url, post id et nonce). Ma question est, comment puis-je vérifier le nonce à partir du code PHP? Une autre question, l'envoi d'un nonce est-il vraiment nécessaire dans ce cas?

JS:

wp.media.controller.Custom = wp.media.controller.State.extend({

    initialize: function(){
        this.props = new Backbone.Model({ url: '' });
    },

    customAction: function(){
        wp.media.post( 'add-attachment', {
            url:     this.props.get( 'url' ),
            post_id: wp.media.view.settings.post.id,
            nonce:   wp.media.view.settings.post.nonce
        });
    }

});

PHP:

add_action( 'wp_ajax_add-attachment', 'add_attachment' );
function add_attachment() {
    $url = trim($_POST['url']);
    $post_ID = intval($_POST['post_id']);
    $nonce = $_POST['nonce'];

    CHECK NONCE HERE!

    if (!current_user_can( 'edit_post', $post_ID ) ) {
        wp_send_json_error();
    }

    $attachment = array( ...data... );
    $attachment_id = wp_insert_post( $attachment );
    if( ! is_int($attachment_id) ) {
        wp_send_json_error();
    }

    if ( ! $attachment_js = wp_prepare_attachment_for_js( $attachment_id ) ) {
        wp_send_json_error();
    }

    wp_send_json_success( $attachment_js );

}

Merci d'avance

1
leemon

A partir de 4.1.1, le nonce est défini dans wp-includes/media.php, ligne 2883:

$settings['post'] = array(
    'id' => $post->ID,
    'nonce' => wp_create_nonce( 'update-post_' . $post->ID ),
);

Donc pour vérifier le nonce:

wp_verify_nonce( $nonce, "update-post_$post_ID" );
3
TheDeadMedic