Отправка защищенного запроса WordPress AJAX - PullRequest
1 голос
/ 18 октября 2019

Я создаю страницу в Wordpress, чтобы каждый менеджер мог управлять своим заказом на woo-commerce. Есть кнопка, с помощью которой менеджер может обновить статус заказа до выполненного. Я хочу установить ограничение, чтобы только соответствующий менеджер мог изменять статус.

    <?php
            $nonce = wp_create_nonce( "manager_completed_nonce" );
            $link = admin_url( 'admin-ajax.php?action=manager_completed&order_id=' . $orderid . '&nonce=' . $nonce );
            echo '<a class="o-btn" data-nonce="' . $nonce . '" data-order_id="' . $orderid . '" href="' . $link . '">Make it Completed</a>';
            ?>

и в function.php

    add_action( "wp_ajax_manager_completed", "manager_completed" );
    add_action( "wp_ajax_nopriv_manager_completed", "please_login" );


    function manager_completed() {

        // nonce check for an extra layer of security, the function will exit if it fails
        if ( !wp_verify_nonce( $_REQUEST[ 'nonce' ], "manager_completed_nonce" ) ) {
            exit( "Woof Woof Woof" );
        }
        $order = new WC_Order( $_REQUEST[ "order_id" ] );
        $order->update_status( 'completed' );
        die();
    }
    function please_login() {
        echo "You must log in";
        die();
    }

Теперь проблема безопасности: если менеджер копирует свой собственныйКнопка URL и просто меняет идентификатор заказа, он может изменить статус заказа других менеджеров, потому что у него есть одноразовый код, и это работает для других идентификаторов заказа! Как мне их остановить?

1 Ответ

0 голосов
/ 19 октября 2019

Перед выполнением update_status вам необходимо проверить идентификатор менеджера заказа.

Вы можете проверить, выполняет ли менеджер обновление, получив идентификатор WC_Order и сравнив его с менеджером, вошедшим в систему. .

Если предположить, что идентификатор менеджера является текущим идентификатором пользователя, проверка перед update_status должна быть такой. Будьте осторожны, так как вы не должны получать идентификатор менеджера из URL, так как пользователь может его изменить.

$managerId = get_current_user_id();
$ordeManagerId = get_post_meta( $_REQUEST[ "order_id" ], 'manager', true);
if($ordeManagerId != $managerId){
    exit( "Woof Woof Woof" );
}

Полный код должен быть таким:

add_action( "wp_ajax_manager_completed", "manager_completed" );
add_action( "wp_ajax_nopriv_manager_completed", "please_login" );


function manager_completed() {

    // nonce check for an extra layer of security, the function will exit if it fails
    if ( !wp_verify_nonce( $_REQUEST[ 'nonce' ], "manager_completed_nonce" ) ) {
        exit( "Woof Woof Woof" );
    }
    $managerId = get_current_user_id();
    $ordeManagerId = get_post_meta( $_REQUEST[ "order_id" ], 'manager', true);
    if($ordeManagerId != $managerId){
        exit( "Woof Woof Woof" );
    }
    $order = new WC_Order( $_REQUEST[ "order_id" ] );
    $order->update_status( 'completed' );
    die();
}
function please_login() {
    echo "You must log in";
    die();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...