wp_verfy_nonce продолжает давать ложные - PullRequest
0 голосов
/ 12 июня 2019

у меня есть что-то вроде этого

<form id="sample_docs" method="post" action="<?php echo admin_url('admin-ajax.php'); ?>">
 <?php wp_nonce_field('nonce_action_sample_docs', 'nonce_sample_docs'); ?>
 <input type="hidden" name="action" value="sample_docs">
 </form>

и тогда у меня есть Ajax для этого, как это

$('form#sample_docs').on('submit', function(e){
    e.preventDefault();
    id = $(this).attr('id');
    url = $(this).attr('action');
    $.ajax({
        url: url,
        type: "POST",
        data: formData,
        cache: false,
        processData: false,
        contentType: false,
        async: true,
        headers: {
             "cache-control": "no-cache"
           },
        success: function(data){
            data = $.parseJSON(data);
            console.log('data', data);

        }
    });
    return false;
});

, а затем в моей стороне PHP, чтобы обработать AJAX M делает это

function sample_docs()
{

 var_dump(wp_verify_nonce($_POST['nonce_sample_docs'],'nonce_action_sample_docs));
 die();
if(wp_verify_nonce($_POST['nonce_sample_docs'],'nonce_action_sample_docs'))
  {
    //do something
   }
} add_action('wp_ajax_sample_docs', 'sample_docs'); add_action('wp_ajax_nopriv_sample_docs', 'sample_docs');

функция wp_verify_nonce() (во встроенной функции WordPress)

function wp_verify_nonce( $nonce, $action = -1 ) {
        $nonce = (string) $nonce;
        $user  = wp_get_current_user();
        $uid   = (int) $user->ID;
        if ( ! $uid ) {
            /**
             * Filters whether the user who generated the nonce is logged out.
             *
             * @since 3.5.0
             *
             * @param int    $uid    ID of the nonce-owning user.
             * @param string $action The nonce action.
             */
            $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
        }

        if ( empty( $nonce ) ) {
            return false;
        }

        $token = wp_get_session_token();
        $i     = wp_nonce_tick();

        // Nonce generated 0-12 hours ago
        $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
        if ( hash_equals( $expected, $nonce ) ) {
            return 1;
        }

        // Nonce generated 12-24 hours ago
        $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
        if ( hash_equals( $expected, $nonce ) ) {
            return 2;
        }

        /**
         * Fires when nonce verification fails.
         *
         * @since 4.4.0
         *
         * @param string     $nonce  The invalid nonce.
         * @param string|int $action The nonce action.
         * @param WP_User    $user   The current user object.
         * @param string     $token  The user's session token.
         */
        do_action( 'wp_verify_nonce_failed', $nonce, $action, $user, $token );

        // Invalid nonce
        return false;
    }

поэтому, когда я делаю это, я получаю false я проверил, если значение $_POST['nonce_sample_doc'], идет в функцию и он также проверил, что если он входит в функцию wp_verify_nonce() и делает то, что мне показалось странным, это

в сторону функции wp_verify_nonce(), когда я проверил значение $expected и $nonce, оно было другим

так что мой вопрос в том, как сделать значение истинным внутри моей sample_doc функции

1 Ответ

1 голос
/ 12 июня 2019

В вашей функции sample_doc есть опечатка, имя ввода nonce_sample_docs, но вы используете nonce_sample_doc в $ _POST.

Фиксированный код:

function sample_doc()
{

 var_dump(wp_verify_nonce($_POST['nonce_sample_docs'],'nonce_action_sample_docs));
 die();
if(wp_verify_nonce($_POST['nonce_sample_doc'],'nonce_action_sample_docs'))
  {
    //do something
   }
} add_action('wp_ajax_sample_doc', 'sample_doc'); add_action('wp_ajax_nopriv_sample_doc', 'sample_doc');
...