WordPress-Nonce-Check immer falsch

Lesezeit: 5 Minuten

Benutzer-Avatar
Vlad Nicula

Ich habe Probleme mit einer grundlegenden Nonce-Validierung über eine Ajax-Anfrage.

Das sind meine Script-Loader- und CSS-Loader-Funktionen: (in gallery.php)

function gallery_js_loader()
{
    if (!is_admin()) return;
    // async flash uploader
    wp_enqueue_script('swfobject', THEMEURL . "/lib/uploadify/swfobject.js", array(), false, true);
    wp_enqueue_script('uploadify', THEMEURL . "/lib/uploadify/jquery.uploadify.v2.1.4.min.js", array('jquery'), false, true);
    wp_enqueue_script('gallery_admin_scripts', THEMEURL . "/inc/galleries/gallery_admin_scripts.js", array(), false, true);
    wp_localize_script('gallery_admin_scripts', 'param',
                   array(
                        'basename' => GALLERYPOST,
                        'baselocation' => THEMEURL,
                        'nonce' => wp_create_nonce('file-upload-nonce'),
                        'thumb_width' => intval(get_option('thumbnail_size_w')),
                        'thumb_height' => intval(get_option('thumbnail_size_h'))
                   ));
// main styles


}

function gallery_css_loader()
{
    wp_enqueue_style('uploadify_styles', THEMEURL . "/lib/uploadify/uploadify.css");
    wp_enqueue_style('gallery_admin_styles', THEMEURL . "/inc/galleries/gallery_admin_styles.css");
}

 add_action('admin_print_scripts-post.php', 'gallery_js_loader');
 add_action('admin_print_scripts-post-new.php', 'gallery_js_loader');
 add_action('admin_print_styles-post.php', 'gallery_css_loader');
 add_action('admin_print_styles-post-new.php', 'gallery_css_loader');


 function gallery_upload_image()
 {
     $nonce = $_POST["nonce"];

     if (is_admin() && !empty($_FILES) /*&& wp_verify_nonce($nonce, 'file-upload-nonce')*/) {
         require_once(ABSPATH . 'wp-admin/includes/image.php');

         $tempFile = $_FILES['Filedata']['tmp_name'];
         //        $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . "https://stackoverflow.com/";
         $targetDir = wp_upload_dir(date('Y'));
         $targetFile = $targetDir['path'] . "https://stackoverflow.com/" . $_FILES['Filedata']['name'];
         $targetFile = str_replace(" ", "", $targetFile);

         move_uploaded_file($tempFile, $targetFile);

         $wp_filetype = wp_check_filetype(basename($targetFile), null);

         $attachment = array(
             'post_mime_type' => $wp_filetype['type'],
             'post_title' => preg_replace('/\.[^.]+$/', '', basename($targetFile)),
             'post_content' => '',
             'post_status' => 'inherit'
         );
         $result['attachmet_id'] = $attach_id = wp_insert_attachment($attachment, $targetFile);
         $result['recieved_nonce'] = $nonce;

         $attach_data = wp_generate_attachment_metadata($attach_id, $targetFile);
         wp_update_attachment_metadata($attach_id, $attach_data);

         $result['success'] = true;
     } else {
         $result['success'] = false;
         $result['recieved_nounce'] = $nonce;
         $result['error'] = array(
             'message' => 'No files or you are not admin ' . $nonce,
             'code' => 'E01'
         );
     }

     echo json_encode($result);
     exit;
 }

 add_action('wp_ajax_do_upload', 'gallery_upload_image');     

In meiner javascrtip-Datei: (in gallery.js)

console.debug("Nonce received ",param.nonce); //c4817b947a 

Mein Ajax-Aufruf greift auf eine do_upload-Aktion von PHP zu. Dieser wird das empfangene Nonce-Feld an die Antwort anhängen … (zurück in der Galerie.php)

function gallery_upload_image()
{
    $nonce = $_POST["nonce"];

    if ( wp_verify_nonce($nonce, 'file-upload-nonce')) {
        /* some logic here, nothing to do with nonce */
        $result['success'] = true;
        $result['debugNonce'] = $nonce;
    } // end validation
    else {
       //invalid nonce
       $result['success'] = false;
       $result['debugNonce'] = $nonce;         
    }
}

Das erhaltene Ergebnis sieht so aus: c4817b947a {“success”:false,”debugNonce”:”c4817b947a”}

Das erste c4817b947a ist wegen des Echos von der Nonce-Erzeugungsfunktion. Es hat keinen Einfluss darauf, wie die Validierung erfolgt.

Meine Schlussfolgerung ist, dass wp_verify_nonce immer fehlschlägt.

Ich verwende wp 3.2.1 auf localhost, Neuinstallation, keine Plugins.

  • Ich habe das gleiche Problem, seit ich mit set_transient spiele. Wie würde ich das loswerden?

    – niklas

    6. Dezember 2013 um 16:32 Uhr

  • Ich bin auf das gleiche Problem gestoßen. Mir ist aufgefallen, dass die Verifizierung funktioniert, wenn ich nicht eingeloggt bin (die Website im Inkognito-Modus öffne). Ich habe das auf jede erdenkliche Weise gegoogelt und Tage damit verbracht, das Problem ohne Erfolg zu lösen. check_ajax_referer schlägt ebenfalls fehl. Ich führe auch eine Neuinstallation durch, die ich sowohl lokal als auch auf einem Online-Server ausprobiert habe. Aber es kann doch nicht sein, dass es all die Jahre nicht funktioniert… Hast du die Lösung gefunden?

    – Dmitri Gamolin

    7. Oktober 2016 um 5:39 Uhr

Benutzer-Avatar
Dmitri Gamolin

Ich bin gerade auf eine gestoßen ähnliches Problem und es stellte sich heraus, dass ich mich nur als admin neu anmelden musste. Ich denke, es sollte auch in Ihrem Fall funktionieren, da alles andere im bereitgestellten Code in Ordnung zu sein scheint.

Ich denke, es hat etwas damit zu tun, wie Sitzungen in WordPress gehandhabt werden.

Ich mache einen fast identischen Austausch ohne Probleme. Dies ist in einem Plugin (Klasse), aber das sollte keine Rolle spielen.

PHP – Javascript initialisieren:

add_action( 'wp_print_scripts', array( &$this, 'enqueue_script') );

PHP- function enqueue_script:

wp_localize_script( 'B99-Portfolio', 'ajax', array(  'ajaxurl'       => admin_url( 'admin-ajax.php' ),
                                                     'imgurl'        => content_url().'/uploads/portfolio-content/',
                                                     'requestNonce'  => wp_create_nonce('b99-request-nonce')) );

JS – Initiieren Sie die Ajax-Anfrage:

$.ajax({
        type    : 'POST',
        cache   : false,
        url     : ajax.ajaxurl,
        data    : {
            action          : 'b99_ajax_request_items',
            requestNonce    : ajax.requestNonce             
        },
        dataType: 'json',
        error   : function(jqXHR, textStatus, errorThrown) {alert(jqXHR+" "+textStatus+" "+errorThrown);},
        success : function( response ) {recieveAjax( response );}
        });

PHP – Anfrage empfangen und verarbeiten ( function b99_ajax_request_items):

$nonce = $_POST['requestNonce'];
        if ( ! wp_verify_nonce( $nonce, 'b99-request-nonce' ) ){
            die ( 'security fail'.$nonce);
        }

Stellen Sie sicher, dass Sie das Skript in die Warteschlange eingereiht haben, bevor Sie es lokalisieren.

Ich verwende aktuelle Versionen von jquery und WordPress und dies funktioniert nahtlos bei einer lokalen Installation von XAMPP. Es sieht Ihrem Austausch ziemlich ähnlich, aber vielleicht ist dies etwas, mit dem Sie es vergleichen können.

  • Vielen Dank für Ihre Antwort. Ich habe den Code aktualisiert, um die vollständige Funktion einzuschließen, die js und CSS lädt. Mein Skript wird vor der Lokalisierung in die Warteschlange gestellt. Die Nonce wird korrekt empfangen, kann aber nicht validiert werden…

    – Vlad Nikula

    11. September 2011 um 6:52 Uhr

  • Zu welcher Aktion fügen Sie gallery_assets_loader() hinzu? Ich weiß, dass es mindestens drei gültige Einfügepunkte gibt, ich verwende wp_print_scripts. Wie sieht Ihr Ajax-Aufruf aus? Sie erwähnen do_upload auf der PHP-Seite, aber Sie zeigen gallery_upload_image(). Wie sieht Ihr kompletter Austausch aus?

    – Bosworth99

    12. September 2011 um 15:00 Uhr


  • Es tut mir leid für die späte Wiederholung, und ich weiß Ihre Bemühungen zu schätzen. Ich habe den Code aktualisiert. Bitte schau es dir an. 🙂

    – Vlad Nikula

    25. September 2011 um 6:16 Uhr

1216190cookie-checkWordPress-Nonce-Check immer falsch

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy