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 );
  • Comparte este artículo:

Loading...

Something went wrong. Please refresh the page and/or try again.