4

ajax リクエストによる基本的な nonce 検証に問題があります。

これらは私のスクリプト ローダーと css ローダー関数です: (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'] . '/';
         $targetDir = wp_upload_dir(date('Y'));
         $targetFile = $targetDir['path'] . '/' . $_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');     

私のjavascrtipファイルで:(gallery.jsで)

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

私の ajax 呼び出しは、php から do_upload アクションにアクセスします。これは、受信した nonce フィールドを応答に追加します... (gallery.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;         
    }
}

受信した結果は次のようになります: c4817b947a {"success":false,"debugNonce":"c4817b947a"}

最初の c4817b947a は、ノンス生成関数からのエコーによるものです。検証が行われる方法には影響しません。

私の結論は、 wp_verify_nonce は常に失敗するということです。

ローカルホストで wp 3.2.1 を使用しています。新規インストールで、プラグインは使用していません。

4

2 に答える 2

2

同様の問題に遭遇したばかりで、管理者として再ログインするだけでよいことがわかりました。提供されたコードの他のすべては問題ないように見えるので、あなたのケースでもうまくいくはずです。

これは、Wordpress でのセッションの処理方法に関係していると思います。

于 2016-10-07T22:57:53.673 に答える
0

ほぼ同一のやり取りを問題なく行います。これはプラグイン (クラス) にありますが、それは問題ではありません。

PHP - JavaScript を初期化します。

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 - ajax リクエストを開始します。

$.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 - リクエストを受信して​​処理します ( function b99_ajax_request_items):

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

スクリプトをローカライズする前に、スクリプトをキューに入れたことを確認してください。

jquery と wordpress の両方の現在のバージョンを使用していますが、これは XAMPP のローカル インストールでシームレスに動作します。インターチェンジとよく似ていますが、これは比較対象となる可能性があります。

于 2011-09-10T23:07:16.353 に答える