Найкращі практики для захисту даних користувацьких полів у Field Forge.
Вихідне екранування
Завжди екрануйте значення полів перед виводом. Field Forge не виконує автоматичне екранування значень, що повертаються функцією get_field().
// Text fields -- use esc_html()
echo esc_html( get_field( 'headline' ) );
// URLs -- use esc_url()
echo '<a href="' . esc_url( get_field( 'link' ) ) . '">Click</a>';
// HTML attributes -- use esc_attr()
echo '<div class="' . esc_attr( get_field( 'css_class' ) ) . '">';
// WYSIWYG fields are already sanitized via wp_kses_post()
// Safe to output directly
echo get_field( 'body_content' );Валідація вводу
Field Forge перевіряє значення при збереженні. Текстові поля перевіряють maxlength, числові поля перевіряють min/max/step, поля електронної пошти перевіряють формат. При програмному збереженні переконайтеся, що ваші значення є дійсними:
// Sanitize before update_field()
$email = sanitize_email( $_POST['user_email'] );
if ( is_email( $email ) ) {
update_field( 'contact_email', $email, $post_id );
}
$price = floatval( $_POST['price'] );
if ( $price >= 0 ) {
update_field( 'price', $price, $post_id );
}Безпека REST API
Точки доступу до мутацій (POST, PUT, DELETE) вимагають можливості manage_options. Точки доступу для читання (GET) вимагають автентифікованого користувача з можливостями рівня редактора (read_private_posts або edit_posts); точка доступу до значень для кожного поста (GET /fields/{post_id}) використовує current_user_can('read_post', $post_id), тому приватні пости обмежуються так само, як основний WordPress обмежує метадані постів. Анонімні запити завжди отримують 401. Групи полів, позначені як private (або обмежені правилами місцезнаходження для адміністраторів), фільтруються з відповідей GET для неадміністраторів. Публічна властивість fieldforge на основних точках доступу до постів WordPress лише відкриває поля за вибором, як описано в розділі 20. Дивіться розділ 20 для повної матриці можливостей для кожної точки доступу.
// Restrict REST API access to specific fields
add_filter( 'fieldforge/rest/public_field_allowed', function( $allowed, $field, $post_id ) {
return ( $field['name'] ?? '' ) === 'public_subtitle' ? true : $allowed;
}, 10, 3 );Паролі та чутливі поля
Поле типу password зберігає значення у вигляді простого тексту. Для чутливих даних:
// Encrypt on save
add_action( 'fieldforge/value_updated', function( $post_id, $field_name ) {
if ( $field_name === 'api_secret' ) {
$raw = FIELDFORGE_Field_Values::instance()->get_value( 'api_secret', $post_id );
$encrypted = openssl_encrypt( $raw, 'aes-256-cbc', AUTH_KEY, 0, substr( AUTH_SALT, 0, 16 ) );
FIELDFORGE_Field_Values::instance()->update_raw( 'api_secret', $encrypted, $post_id );
}
}, 10, 2 );
// Decrypt on load
add_filter( 'fieldforge/load_value', function( $value, $field_name ) {
if ( $field_name === 'api_secret' && $value ) {
return openssl_decrypt( $value, 'aes-256-cbc', AUTH_KEY, 0, substr( AUTH_SALT, 0, 16 ) );
}
return $value;
}, 10, 2 );—