Cómo proteger la cuenta de administrador de tu blog

Wordpress security

Hace unos meses Mannie Schumpert publicó un excelente artículo sobre cómo modificar al vuelo (en lugar de guardar los datos permanentemente en la base de datos) algunas capacidades y roles de usuario de WordPress.

Básicamente se trata de utilizar los filtros user_has_cap y map_meta_cap creando funciones en el archivo functions.php que cambien los permisos de usuarios que cumplan unas determinadas condiciones.

Pero para quienes no son programadores o no tienen unos conocimientos demasiado avanzados de PHP, lo más interesante del artículo es el filtro que protege la cuenta original de administrador, evitando que pueda ser editada o borrada por otro usuario.

¿Cuándo podemos necesitar proteger la cuenta de administrador?

Es posible que en algún momento necesitemos otorgar a alguien permisos de administrador en el blog, ya sea para que nos resuelva un problema, para instalar un nuevo theme, o cualquier otro imprevisto que nos pueda surgir.

En esos casos, aun cuando la persona a la que concedemos el acceso sea de absoluta confianza, siempre puede haber accidentes no deseados. Y si uno de ellos es borrar nuestra cuenta de administrador, tendremos un problema.

La solución es añadir al archivo functions.php de nuestro theme estas líneas de código:

<?php
/**
 * Prevent Editing of a specified user
 * 
 * This example shows how you can protect the original admin from being edited or deleted by anyone else
 */
add_filter('map_meta_cap', 'prevent_user_edit', 10, 4 );
function prevent_user_edit( $required_caps, $cap, $user_id, $args ){
        $protected_user = 1; // ID of user not editable
    
    if ( $user_id === $protected_user ) // Don't block caps if current user = protected user
        return $required_caps;
 
    $blocked_caps = array(
        'delete_user',
        'edit_user'
        );
    if ( in_array( $cap, $blocked_caps ) && $args[0] === $protected_user )
        $required_caps[] = 'do_not_allow';
 
    return $required_caps;}

Además Schumpert ha creado un Gist con más ejemplos, donde podemos encontrar el código para otorgar a los administradores secundarios menos control sobre la instalación:

<?php
// Give secondary "administrators" less control:

add_filter( 'user_has_cap',
function( $caps, $cap, $args ) {
    $user_id = $args[1];
    $user = new WP_User( $user_id );
    $email = $user->user_email;
    if ( $email != get_option('admin_email') )
        $caps['manage_options'] = false;
    return $caps;
}, 10, 3 );

O para permitir sólo a los administradores borrar posts publicados:

<?php
// Only administrators can delete published posts:

add_filter( 'map_meta_cap',
function( $required_caps, $cap ) {
    if ( 'delete_post' == $cap )
        $required_caps[] = 'manage_options';
    return $required_caps;
}, 10, 2 );