Meilleures pratiques pour sécuriser les données de champs personnalisés dans Field Forge.
Échappement de Sortie
Échappez toujours les valeurs de champ avant la sortie. Field Forge n’échappe pas automatiquement les valeurs retournées par 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' );Validation des Entrées
Field Forge valide les valeurs lors de l’enregistrement. Les champs de texte vérifient maxlength, les champs numériques vérifient min/max/step, les champs email valident le format. Lors de l’enregistrement par programme, assurez-vous que vos valeurs sont valides :
// 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 );
}Sécurité de l’API REST
Les points de terminaison de mutation (POST, PUT, DELETE) nécessitent la capacité manage_options. Les points de terminaison de lecture (GET) nécessitent un utilisateur authentifié avec des capacités de niveau éditeur (read_private_posts ou edit_posts) ; le point de terminaison des valeurs par publication (GET /fields/{post_id}) utilise current_user_can('read_post', $post_id) donc les publications privées sont filtrées de la même manière que le cœur de WordPress filtre les métadonnées de publication. Les requêtes anonymes obtiennent toujours 401. Les groupes de champs marqués private (ou restreints par des règles de localisation aux administrateurs) sont filtrés des réponses GET non administratives. La propriété publique fieldforge sur les points de terminaison de publication de base WordPress n’expose que les champs opt-in comme décrit dans la section 20. Voir la section 20 pour la matrice complète des capacités par point de terminaison.
// 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 );Champs de Mot de Passe et Sensibles
Le type de champ password stocke les valeurs en texte brut. Pour les données sensibles :
// 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 );—