Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Permitir incrustar servicios externos (embed) en el contenido de un post en WordPress Multisite: la capacidad unfiltered_html y los filtros kses

Imago voragine.net

Por seguridad WordPress Multisite desactiva la capacidad de incluir determinado código HTML para usuarios que no sean superadministradores (administradores de la red de sitios). Es una medida lógica para evitar que un usuario incluya código malicioso a través de la caja de contenido de un post. Sin embargo en redes de sitios controladas, con una comunidad de usuarios de confianza, puede tener sentido activar esta capacidad.

Lo que hace WordPress Multisite añadir los filtros KSES, que normalmente solo se aplican a colaboradores y autores, a los usuarios editores y administradores. También desactiva la capacidad unfiltered_html para editores y administradores.

El plugin Unfiltered MU elimina esta limitación. Aunque hace más de dos años que no se actualiza, estar desarrollado por Automattic, la empresa que está detrás del desarrollo de WordPress, es una garantía de calidad y seguridad. Además son unas 20 líneas de código, no más, lo cual limita la posibilidad de bugs y agujeros de seguridad. Es una buena opción.

Para quien prefiera prescindir de plugin se puede incluir la activación en el theme que se esté usando. El código a continuación realiza la tarea: es el mismo código del plugin pero asociado a los hooks de activación y desactivación de un theme.

El código utiliza el hook after_switch_theme para añadir la capacidad unfiltered_html a administradores y editores: las acciones asociadas a este hook se ejecutan justo después de activar el theme. Utiliza el hook switch_theme para eliminar la capacidad, ya que las acciones asociadas a este hook se ejecutan justo después de desactivar el theme. Así limitamos la funcionalidad a un theme, como medida de seguridad.

// unfilter admin and editor roles to allow them to include HTML tags in content when activating theme
add_action( 'init', 'basurama_kses_init', 11 );
add_action( 'set_current_user', 'basurama_kses_init', 11 );
add_action( 'after_switch_theme', 'basurama_unfilter_roles', 10 );
        
// refilter admin and editor roles when deactivating theme
add_action( 'switch_theme', 'basurama_refilter_roles', 10 );

// remove KSES filters for admins and editors
function basurama_kses_init() {
        if ( current_user_can( 'edit_others_posts' ) )
                kses_remove_filters();
}       

// add unfiltered_html capability for admins and editors
function basurama_unfilter_roles() {
        // Makes sure $wp_roles is initialized
        get_role( 'administrator' );
        
        global $wp_roles;
        // Dont use get_role() wrapper, it doesn't work as a one off.
        // (get_role does not properly return as reference)
        $wp_roles->role_objects['administrator']->add_cap( 'unfiltered_html' );
        $wp_roles->role_objects['editor']->add_cap( 'unfiltered_html' );
}

// remove unfiltered_html capability for admins and editors
function basurama_refilter_roles() {
        get_role( 'administrator' );
        global $wp_roles;
        // Could use the get_role() wrapper here since this function is never
        // called as a one off.  It is always called to alter the role as
        // stored in the DB.
        $wp_roles->role_objects['administrator']->remove_cap( 'unfiltered_html' );
        $wp_roles->role_objects['editor']->remove_cap( 'unfiltered_html' );
}

Dejar un comentario

No hay comentarios en esta entrada.
*
*

 

No hay trackbacks