Cross-Site Request Forgery (CSRF) est une vulnérabilité de sécurité qui permet aux attaquants d’inciter les utilisateurs à effectuer des actions sur un site Web à leur insu ou sans leur consentement. Il s’agit d’une menace sérieuse, en particulier pour les sites Web qui traitent des données ou des transactions sensibles.
Pour vous protéger contre les attaques CSRF, utilisez des nonces dans votre code WordPress.
Remarque : Nous comprenons que le terme « nonce » est un terme d’argot au Royaume-Uni et peut être mis à jour à l’avenir. Dans ce cas, nous nous référons uniquement au terme technique actuel.
Que sont les nonces ?
UN nonce est un jeton à usage unique généré pour chaque session utilisateur. Le nonce peut être inclus dans un formulaire, une URL ou une requête AJAX et est utilisé pour vérifier la légitimité de cette requête.
Pour aider à combattre les attaques CSRF, un nonce garantit que l’action sous forme prise était prévue par l’utilisateur. Cela confirme que la demande est légitime et ne peut pas être manipulée par des attaquants.
Lors de la validation d’un nonce, faites attention à l’opérateur que vous utilisez dans votre conditionnel. En un coup d’œil, ce qui suit semble sûr mais est facilement exploitable en soumettant n’importe quelle valeur nonce :
// ❌ incorrect nonce validation.
if ( ! isset( $_POST('_wpnonce') ) && ! wp_verify_nonce( $_POST('_wpnonce'), 'update-post' ) ) {
return;
}
Instead, a correct validation would look like this:
if ( ! isset( $_POST('_wpnonce') ) || ! wp_verify_nonce( $_POST('_wpnonce'), 'update-post' ) ) {
return;
}
Utilisation de nonces dans WordPress VIP
Toute personne codant pour WordPress VIP doit utiliser avec vigilance valider, assainir et évacuer pour gérer en toute sécurité les données entrant dans WordPress et les présenter à l’utilisateur final. Pour vous protéger contre les attaques CSRF, utilisez des nonces pour valider toutes les soumissions de formulaire.
Il existe trois façons principales d’incorporer des nonces dans le code WordPress VIP : via l’URL, le formulaire et AJAX.
1. Nonces d’URL
Pour ajouter un nonce à une URL, utilisez la fonction wp_nonce_url(). Cette fonction génère une URL qui inclut un nonce, qui peut être vérifié à l’aide de la fonction wp_verify_nonce.
Exemple de code nonce d’URL:
<?php
// Create a menu page for the demo nonce URL link.
add_action( 'admin_menu', function() {
add_menu_page(
'URL Nonce Example',
'URL Nonce Example',
'publish_posts',
'vip__nonce_url_link',
'vip__nonce_url_link_callback'
);
} );
// Contents for the demo nonce URL page.
function vip__nonce_url_link_callback () {
/**
* Verify the nonce URL exists & is legitimate.
*
* @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
*/
if ( isset( $_GET('_vip__nonce') ) && wp_verify_nonce( $_GET('_vip__nonce'), 'vip__nonce_action' ) ) {
?>
<p>✅ Valid nonce.</p>
<?php
return;
}
$url = admin_url('options.php?page=vip__nonce_url_link');
/**
* Create a nonce URL.
*
* @see https://codex.wordpress.org/Function_Reference/wp_nonce_url
*/
$nonce_url = wp_nonce_url( $url, 'vip__nonce_action', '_vip__nonce' );
?>
<a href="https://wpvip.com/2023/02/28/how-to-protect-against-csrf-attacks-with-wordpress-nonces/<?php echo esc_url( $nonce_url ); ?>" class="button button-primary">Nonce URL »</a>
<?php
}
2. Formez des nonces
Pour ajouter un nonce à un formulaire, utilisez la fonction wp_nonce_field(). Cette fonction génère un champ de formulaire masqué qui inclut un nonce, qui peut être vérifié à l’aide de la check_admin_referer(), check_ajax_referer()ou wp_verify_nonce() les fonctions.
Remarque : L’utilisation de check_admin_referer() sans l’argument action, ou de check_ajax_referer() avec le dernier argument défini sur false, peut conduire à un contournement CSRF.
Formulaire exemple de code nonce:
<?php
// Add custom metabox to `post` post types.
add_action( 'add_meta_boxes', function () {
add_meta_box(
'vip__metabox_nonce_example',
'Example Field',
'vip__custom_post_metabox',
'post'
);
} );
function vip__custom_post_metabox( $post ) {
/**
* Create a hidden nonce field, along side a custom form field.
*
* @see https://codex.wordpress.org/Function_Reference/wp_nonce_field
*/
wp_nonce_field( 'vip__metabox_checkbox', '_vip__nonce' );
?>
<label>
<input type="checkbox" name="vip__checkbox" />
</label>
<?php
}
add_action( 'save_post', function ( $post_id, $post ) {
if ( 'post' !== $post->post_type ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
/**
* Verify the nonce exists & verify it's correct.
*
* @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
*/
if ( ! isset( $_POST('_vip__nonce') ) || ! wp_verify_nonce( $_POST('_vip__nonce'), 'vip__metabox_checkbox' ) ) {
return;
}
// valid request, do something with `$_POST('vip__checkbox')`.
}, 10, 2 );
3. Nonces AJAX
Pour ajouter un nonce à une requête AJAX, incluez le nonce dans les données envoyées au serveur. Vérifiez le nonce côté serveur à l’aide de wp_verify_nonce() ou check_ajax_referer() fonction. Attention : en utilisant cette dernière méthode de vérification avec le le dernier argument défini sur false peut conduire à un contournement CSRF.
Exemple de code nonce AJAX:
<?php
// Create a menu page for the demo AJAX script.
add_action( 'admin_menu', function() {
add_menu_page(
'AJAX Nonce Example',
'AJAX Nonce Example',
'publish_posts',
'vip__ajax_form',
'vip__ajax_form_callback'
);
} );
// Contents for the demo menu page.
function vip__ajax_form_callback() {
/**
* Create the nonce for the admin page, including the action name for context.
*
* @see https://codex.wordpress.org/Function_Reference/wp_create_nonce
*/
$ajax_nonce = wp_create_nonce( "vip__ajax_form_nonce" );
?>
<h2>AJAX Nonce</h2>
<input type="submit" class="button button-primary" id='click_me' value="Send AJAX Post Request »">
<pre id='vip__ajax_form_output'></pre>
<script type="text/javascript">
jQuery(document).ready( function($) {
var data = {
action: 'vip__ajax_form_action',
_vip__nonce: <?php echo wp_json_encode( $ajax_nonce ); ?>,
my_string: 'Freedom to Publish!'
};
$('#click_me').click(function() {
// Post the request to WordPress' AJAX URL.
$.post( ajaxurl, data, function( response ) {
$('#vip__ajax_form_output').text("Response: " + response.data);
});
});
});
</script>
<?php
}
// The AJAX hook for the demo forms POST request.
add_action( 'wp_ajax_vip__ajax_form_action', function() {
/**
* Verify the nonce exists & and is correct.
*
* @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
*/
if ( ! isset( $_POST('_vip__nonce') ) || ! wp_verify_nonce( $_POST('_vip__nonce'), 'vip__ajax_form_nonce' ) ) {
wp_send_json_error( 'invalid nonce' );
}
if ( ! current_user_can( 'publish_posts' ) ) {
wp_send_json_error( 'invalid permissions' );
}
$data = esc_html( sanitize_text_field( $_POST('my_string') ) );
$return = '✅ Nonce is valid! Data is: ' . $data;
wp_send_json_success( ( $return ) );
});
<?php
// Create a menu page for the demo AJAX script.
add_action( 'admin_menu', function() {
add_menu_page(
'AJAX Nonce Example',
'AJAX Nonce Example',
'publish_posts',
'vip__ajax_form',
'vip__ajax_form_callback'
);
} );
// Contents for the demo menu page.
function vip__ajax_form_callback() {
/**
* Create the nonce for the admin page, including the action name for context.
*
* @see https://codex.wordpress.org/Function_Reference/wp_create_nonce
*/
$ajax_nonce = wp_create_nonce( "vip__ajax_form_nonce" );
?>
<h2>AJAX Nonce</h2>
<input type="submit" class="button button-primary" id='click_me' value="Send AJAX Post Request »">
<pre id='vip__ajax_form_output'></pre>
<script type="text/javascript">
jQuery(document).ready( function($) {
var data = {
action: 'vip__ajax_form_action',
_vip__nonce: <?php echo wp_json_encode( $ajax_nonce ); ?>,
my_string: 'Freedom to Publish!'
};
$('#click_me').click(function() {
// Post the request to WordPress' AJAX URL.
$.post( ajaxurl, data, function( response ) {
$('#vip__ajax_form_output').text("Response: " + response.data);
});
});
});
</script>
<?php
}
// The AJAX hook for the demo forms POST request.
add_action( 'wp_ajax_vip__ajax_form_action', function() {
/**
* Verify the nonce exists & and is correct.
*
* @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
*/
if ( ! isset( $_POST('_vip__nonce') ) || ! wp_verify_nonce( $_POST('_vip__nonce'), 'vip__ajax_form_nonce' ) ) {
wp_send_json_error( 'invalid nonce' );
}
if ( ! current_user_can( 'publish_posts' ) ) {
wp_send_json_error( 'invalid permissions' );
}
$data = esc_html( sanitize_text_field( $_POST('my_string') ) );
$return = '✅ Nonce is valid! Data is: ' . $data;
wp_send_json_success( ( $return ) );
});
L’utilisation de nonces dans WordPress VIP aide à se protéger contre les attaques CSRF
L’utilisation de nonces dans votre code WordPress est une étape importante dans la protection de votre site Web contre les attaques CSRF. En vérifiant que les demandes sont légitimes et proviennent du même utilisateur qui a initié la session, les nonces aident à sécuriser votre site Web et la confidentialité de vos utilisateurs.
Apprendre à augmentez votre sécurité WordPress au niveau supérieur et obtenir une démo gratuite pour voir comment WordPress VIP peut sécuriser votre site.