Я работаю над плагином 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' );
}
}
}