2012-06-03 1 views
2

Smart Wordpress people say que les développeurs de plugins doivent utiliser un nonce dans chaque requête AJAX qui est renvoyée d'une page vers le blog wordpress (admin-ajax.php).Comment fonctionne check_ajax_referer()?

Cela se fait par (1) la génération d'un nonce sur le côté serveur, via

$nonce = wp_create_nonce ('my-nonce'); 

... (2) faisant que nonce à la disposition de code Javascript qui envoie des requêtes AJAX. Par exemple, vous pouvez le faire comme ceci:

function myplg_emit_scriptblock() { 
    $nonce = wp_create_nonce('myplg-nonce'); 
    echo "<script type='text/javascript'>\n" . 
     " var WpPlgSettings = {\n" . 
     " ajaxurl : '" . admin_url('admin-ajax.php') . "',\n" . 
     " nonce : '" . $nonce . "'\n" . 
     " };\n" . 
     "</script>\n"; 
} 
add_action('wp_print_scripts','myplg_emit_scriptblock'); 

... et (3) les références logiques javascript ajax qui variable globale.

var url = WpPlgSettings.ajaxurl + 
     "?action=my-wp-plg-action&" + 
     "nonce=" + WpPlgSettings .nonce + 
     "docid=" + id; 

    $.ajax({type: "GET", 
      url: url, 
      headers : { "Accept" : 'application/json' }, 
      dataType: "json", 
      cache: false, 
      error: function (xhr, textStatus, errorThrown) { 
       ... 
      }, 
      success: function (data, textStatus, xhr) { 
       ... 
      } 
      }); 

... et enfin (4) vérification du nonce reçu dans la logique côté serveur.

add_action('wp_ajax_nopriv_skydrv-hotlink', 'myplg_handle_ajax_request'); 
add_action('wp_ajax_skydrv-hotlink', 'myplg_handle_ajax_request'); 
function myplg_handle_ajax_request() { 
    check_ajax_referer('myplg-nonce', 'nonce'); // <<=----- 
    if (isset($_GET['docid'])) { 
     $docid = $_GET['docid']; 
     $response = myplg_generate_the_response($docid); 
     header("Content-Type: application/json"); 
     echo json_encode($response) ; 
    } 
    else { 
     $response = array("error" => "you must specify a docid parameter."); 
     echo json_encode($response) ; 
    } 

    exit; 
} 

Mais comment le contrôle fonctionne-t-il vraiment?

Répondre

12

Revising some AJAX procedures, je suis arrivé à la même question. Et il est une simple question de vérifier la function code:

function check_ajax_referer($action = -1, $query_arg = false, $die = true) { 
    if ($query_arg) 
     $nonce = $_REQUEST[$query_arg]; 
    else 
     $nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce']; 

    $result = wp_verify_nonce($nonce, $action); 

    if ($die && false == $result) { 
     if (defined('DOING_AJAX') && DOING_AJAX) 
      wp_die(-1); 
     else 
      die('-1'); 
    } 

    do_action('check_ajax_referer', $action, $result); 

    return $result; 
} 

Si wp_verify_nonce est false et vous ne l'avez pas envoyé false dans le paramètre $die, il exécutera wp_die(-1);.


Dans votre exemple de code, check_ajax_referer() interrompra la procédure et revenir -1 à l'appel AJAX. Si vous voulez gérer l'erreur vous, ajoutez le paramètre $die et faire vos trucs avec $do_check:

$do_check = check_ajax_referer('myplg-nonce', 'nonce', false); 

Notez que la bonne façon de gérer AJAX dans WordPress est: register, enqueue et localize les fichiers JavaScript en utilisant wp_enqueue_scripts au lieu de wp_print_scripts.
Voir Use wp_enqueue_scripts() not wp_print_styles().

+0

Vous êtes sur le point d'obtenir un badge, parce que je vais accepter votre réponse, 14 mois après avoir posté la question. Merci! – Cheeso

+0

Je pense que le badge vient quand il y a 2 upvotes;) Ravi de voir un vieux Q être résolu, de rien! – brasofilo

0

C'est juste un test que le code "nonce" correspond à ce qui a été donné, donc un hacker ne peut pas intervenir et obtenir un raccourci vers votre base de données. Si le code de sécurité ne correspond pas, le php mourra et la page s'arrêtera. "Si le code est correctement vérifié, il passera au-delà, sinon il déclenchera le dé ('- 1'), ce qui stoppera le code."