PHP Code Sniffer – Стандарты кодирования WordPress VIP

Вопрос или проблема

Я пытаюсь привести свой код в соответствие со стандартами кодирования WordPress VIP. У меня возникло несколько проблем, которые я хотел бы решить, но не уверен, какая стратегия лучше.

Первая проблема возникает, когда я проверяю nonce при сохранении данных метабокса:

$nonce = isset( $_POST['revv_meta_box_nonce'] ) ? $_POST['revv_meta_box_nonce'] : '';

Ошибка, которую я получаю здесь, – 'Обработка данных без проверки nonce'. Это довольно глупо, так как я просто сохраняю nonce в переменной, которую я потом проверяю на следующей строке.

Вторая проблема возникает, когда я сохраняю данные:

$foo = isset($_POST['foo']) ? sanitize_text_field( $_POST['foo'] ) : '';
update_post_meta( $post_id, '_foo', $foo );

На первой строке здесь анализатор жалуется, что я не использую wp_unslash на данных перед их санитацией. Но данные сразу идут в update_post_meta на следующей строке, который ожидает, что данные не будут unslashed.

Есть идеи по поводу лучшей стратегии для устранения этих сообщений об ошибках? Спасибо!

Вы можете использовать filter_input, чтобы очистить ваш массив $_POST.

$nonce = filter_input( INPUT_POST, 'revv_meta_box_nonce', FILTER_SANITIZE_STRING )

Используйте empty(), чтобы проверить, есть ли у $nonce значение или нет.

Вы можете использовать то же самое для второй проблемы

$foo = filter_input( INPUT_POST, 'foo', FILTER_SANITIZE_STRING )

Измените третий параметр в зависимости от ожидаемых данных в $_POST['foo']. Ознакомьтесь с этой документацией для доступных фильтров.

Ответ или решение

Чтобы привести ваш код в соответствие со стандартами кодирования WordPress VIP и устранить указанные вами проблемы, вы можете использовать функцию filter_input, которая помогает более безопасно и эффективно обрабатывать данные, поступающие из формы.

Проблема 1: Проверка nonce

Вместо того чтобы просто извлекать значение nonce из массива $_POST и назначать его переменной, вы можете использовать функцию filter_input для фильтрации и проверки значения nonce сразу. Это исключает необходимость в дополнительной проверке на наличие значения.

Вот как вы можете сделать это:

$nonce = filter_input(INPUT_POST, 'revv_meta_box_nonce', FILTER_SANITIZE_STRING);

if (empty($nonce) || !wp_verify_nonce($nonce, 'your_nonce_action')) {
    // Обработка ошибки, если nonce отсутствует или неверен
    return;
}

В этом примере мы используем filter_input для получения значения nonce прямо из массивов $_POST, очищая его от нежелательных символов, заносим в переменную, а затем проверяем ее на пустоту и валидируем с использованием wp_verify_nonce.

Проблема 2: Сохранение данных метабокса

Что касается второго вопроса, вы правы в том, что прямое использование $_POST без предварительного снятия слешей может вызвать предупреждения от PHP Code Sniffer. Вы можете использовать ту же функцию filter_input, чтобы отфильтровать данные, прежде чем их сохранять, но также учтите, что нужно правильно обрабатывать данные.

Вот модифицированная версия кода, которая решает эту проблему:

$foo = filter_input(INPUT_POST, 'foo', FILTER_SANITIZE_STRING);
if ($foo !== null) {
    $foo = sanitize_text_field($foo); // Применяем дополнительно к sanitization перед сохранением.
    update_post_meta($post_id, '_foo', $foo);
}

Здесь мы используем filter_input для получения значения поля foo, а затем, если оно не равно null, применяем sanitize_text_field к значению, что гарантирует, что данные безопасны перед сохранением через update_post_meta.

Заключение

Использование filter_input в сочетании с проверками на пустоту и подходящими методами для проверки nonce и очистки данных поможет вам соответствовать стандартам WordPress VIP, устраняя предупреждения PHP Code Sniffer. Всегда следите за тем, чтобы данные из пользовательского ввода были должным образом очищены и проверены, прежде чем использовать их в вашем коде.

Оцените материал
Добавить комментарий

Капча загружается...