Sí, las fuentes de WordPress pueden proteger contra el inicio de sesión CSRF.
Los archivos de WordPress se pueden aplicar a URL y también a formularios, como el formulario de inicio de sesión:
Para agregar un nonce a un formulario, llame a wp_nonce_field () especificando una cadena
representando la acción. Por defecto wp_nonce_field () genera dos
campos ocultos, uno cuyo valor es el nonce y otro cuyo valor es el
URL actual (el referente), y se hace eco del resultado. Por ejemplo,
esta llamada:
wp_nonce_field( 'delete-comment_'.$comment_id );
podría hacer eco de algo como:
<input type="hidden" id="_wpnonce" name="_wpnonce" value="796c7766b1" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />
Por lo general, los nonces se crean adjuntos a un usuario que ha iniciado sesión porque tiene sentido proteger a los usuarios que han iniciado sesión. Pero el inicio de sesión de CSRF es especial porque se puede usar para apuntar al usuario que ha finalizado la sesión.
Mirando a través del código wp_create_nonce
puedo ver que los nonces también se crean para usuarios que han cerrado la sesión:
function wp_create_nonce($action = -1) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid ) {
$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
}
$token = wp_get_session_token();
$i = wp_nonce_tick();
return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
}
Luego use wp_verify_nonce
para verificar el nonce. Devuelve falso si el nonce no es válido. De lo contrario, devuelve un entero con el valor de:
-
1 : si el nonce se ha generado en las últimas 12 horas o menos.
-
2 : si el nonce se generó entre 12 y 24 horas.