【问题标题】:Wordpress nonce check always falseWordpress 随机数检查总是错误的
【发布时间】:2011-11-14 13:26:44
【问题描述】:

我在通过 ajax 请求进行基本随机数验证时遇到问题。

这些是我的脚本加载器和 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 {"成功":false,"debugNonce":"c4817b947a"}

第一个 c4817b947a 是因为来自 nonce 生成函数的回声。它不会影响验证发生的方式。

我的结论是 wp_verify_nonce 总是失败。

我在本地主机上使用 wp 3.2.1,全新安装,没有插件。

【问题讨论】:

  • 自从玩 set_transient 后我遇到了同样的问题。我该如何摆脱它?
  • 我遇到了同样的问题。我注意到,当我没有登录(以隐身模式打开网站)时,验证有效。我已经以任何可能的方式在谷歌上搜索了这个,并花了几天时间试图解决这个问题,但没有成功。 check_ajax_referer 也失败了。我也在运行全新安装,在本地和在线服务器上都尝试过。但不可能这些年就不管用了……你找到解决办法了吗?

标签: ajax wordpress nonce


【解决方案1】:

我刚刚遇到similar issue,结果我所要做的就是以管理员身份重新登录。我认为它也应该适用于您的情况,因为提供的代码中的其他所有内容似乎都很好。

我想这与 Wordpress 中会话的处理方式有关。

【讨论】:

    【解决方案2】:

    我做了一个几乎相同的交换没有问题。 这是在插件(类)中,但这无关紧要。

    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 的本地安装上无缝运行。它看起来与您的交换非常相似,但也许这是可以比较的东西。

    【讨论】:

    • 感谢您的回复。我更新了代码以包含加载 js 和 css 的完整功能。我的脚本在本地化之前排队。随机数被正确接收,但无法验证...
    • 您将添加 gallery_assets_loader() 的操作是什么?我知道至少有三个有效的插入点,我使用 wp_print_scripts。另外,你的 ajax 调用是什么样的?您在 php 端提到了 do_upload,但您正在显示 gallery_upload_image()。您的完整交换是什么样的?
    • 对于迟到的重播,我深表歉意,感谢您的努力。我更新了代码。请看一下。 :)
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2023-03-31
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2019-07-02
    • 2016-08-26
    相关资源
    最近更新 更多