Очистить поля Wordpress Metabox (массив POST) - правильный путь - PullRequest
0 голосов
/ 11 января 2020

Я работаю над плагином WordPress с Metaboxes. Плагин был отклонен из-за Sanitize полей metabox.

Моя save_fields функция

public function save_fields( $post_id ) {
    if ( ! isset( $_POST['modalsettings_nonce'] ) )
        return $post_id;
    $nonce = $_POST['modalsettings_nonce'];
    if ( !wp_verify_nonce( $nonce, 'modalsettings_data' ) )
        return $post_id;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;
    foreach ( $this->meta_fields as $meta_field ) {
        $userInput = $_POST[ $meta_field['id'] ];
        if ( isset( $userInput ) ) {
            switch ( $meta_field['type'] ) {
                case 'email':
                    $userInput = sanitize_email( $_POST[ $meta_field['id'] ] );
                    break;
                case 'text':
                    $userInput = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                    break;
            }
            update_post_meta( $post_id, $meta_field['id'], $userInput );
        } else if ( $meta_field['type'] === 'checkbox' ) {
            update_post_meta( $post_id, $meta_field['id'], '0' );
        }
    }
}

Комментарий от рецензионной команды Wordpress

Данные должны быть обработаны, удалены и проверены

Когда вы включаете вызовы POST / GET / REQUEST / FILE в свой плагин, важно их санировать, проверять и экранировать. Целью здесь является предотвращение случайной отправки пользователем данных tra sh через систему, а также защита их от потенциальных проблем безопасности.

SANITIZE: данные, которые вводятся (пользователем или автоматически) должны быть продезинфицированы как можно скорее. Это уменьшает вероятность уязвимостей XSS и MITM-атак, когда публикуемые данные подвергаются подрыву.

VALIDATE: все данные должны быть проверены, несмотря ни на что. Даже когда вы дезинфицируете, помните, что вы не хотите, чтобы кто-то вставлял «собаку», когда единственными допустимыми значениями являются числа.

ESCAPE: Данные, которые выводятся, должны быть правильно экранированы, когда они отражены, поэтому он не может захватить админ-экраны. Существует множество функций esc _ * (), которые можно использовать, чтобы убедиться, что вы не показываете людям неверные данные.

Чтобы помочь вам в этом, WordPress поставляется с рядом функций очистки и экранирования. Вы можете прочитать о них здесь:

https://developer.wordpress.org/plugins/security/securing-input/ https://developer.wordpress.org/plugins/security/securing-output/

Помните: вы должны использовать наиболее подходящие функции для контекста. Если вы очищаете электронную почту, используйте sanitize_email (), если вы выводите HTML, используйте esc_ html () и т. Д.

Простая мантра здесь такова:

Ранняя очистка Escape Late Always Validate

Очистите все, проверьте все, удалите все и никогда не доверяйте пользователям всегда иметь вводимые вменяемые данные. В конце концов, пользователи приходят из всех слоев общества.

Пример (ы) из вашего плагина:

stylisti c -modals / admin / metaboxes. php: 202: $ userInput = $ _POST [$ meta_field ['id']]; if (isset ($ userInput)) {switch ($ meta_field ['type']) {case 'email': $ userInput = sanitize_email ($ _POST [$ meta_field ['id']]); перемена; case 'text': $ userInput = sanitize_text_field ($ _POST [$ meta_field ['id']]); перемена; } update_post_meta ($ post_id, $ meta_field ['id'], $ userInput);

Поскольку вы позже сохраняете $ userInput, вы должны очистить его.

Что могу ли я это сделать?

У меня больше нет идей о том, что WordPress хочет от меня и когда мне следует очистить поля ... также, если я ищу примеры, я нахожу именно этот способ очистки массивов $ _POST. ...

У вас есть идеи?

Редактировать: Будет ли это работать?

public function save_fields( $post_id ) {
    if ( ! isset( $_POST['modalsettings_nonce'] ) )
        return $post_id;
    $nonce = $_POST['modalsettings_nonce'];
    if ( !wp_verify_nonce( $nonce, 'modalsettings_data' ) )
        return $post_id;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;
    foreach ( $this->meta_fields as $meta_field ) {
        if ( isset( $_POST[ $meta_field['id'] ] ) ) {
            $sanitizedUserInput = "";
            $sanitizedMetaFieldID = "";
            switch ( $meta_field['type'] ) {
                case 'email':
                    $sanitizedUserInput = sanitize_email( $_POST[ $meta_field['id'] ] );
                    $sanitizedMetaFieldID = sanitize_email( $meta_field['id']);
                    break;
                case 'text':
                    $sanitizedUserInput = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                    $sanitizedMetaFieldID = sanitize_text_field( $meta_field['id']);
                    break;
                default:
                    $sanitizedUserInput = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                    $sanitizedMetaFieldID = sanitize_text_field( $meta_field['id']);
            }
            update_post_meta( $post_id, $sanitizedMetaFieldID, $sanitizedUserInput );
        } else if ( $meta_field['type'] === 'checkbox' ) {
            $sanitizedMetaFieldID = sanitize_text_field( $meta_field['id']);
            update_post_meta( $post_id, $sanitizedMetaFieldID, '0' );
        }
    }
}

1 Ответ

1 голос
/ 11 января 2020

Ну, у вас есть это назначение $userInput = $_POST[ $meta_field['id'] ]; перед оператором if. Тогда у вас есть switch заявление. Теперь, скажем, по некоторым причинам поток выполнения php не имеет доступа к оператору switch.

Далее, поток выполнения php достигает здесь:

update_post_meta( $post_id, $meta_field['id'], $userInput );

Это означает, что переменная $userInput НЕ подвергается санитарной обработке. Это может быть причиной. Я надеюсь, что это поможет вам.

...