Tiempo de lectura aprox: 3 minutos, 29 segundos
Crear plugins con seguridad. Comprobar las capacidades del usuario.
Esto que parece una amenaza, se trata solamente de seguir con un principio elemental de seguridad.
Ya que te has adentrado en la programación de tu propio plugin, bien para uso propio o con intenciones comerciales, una de las primeras prioridades que debes aprender, es que la seguridad es necesaria.
Al hilo de noticias como las que hemos publicado el 19 de febrero de 2020 y que nos advertía del uso de un plugin mal programado, quiero que tengas la seguridad como primera meta.
Para eso, una de las tareas que debe realizar todo plugin, es asegurarse de que el usuario que está intentando ejecutar una tarea, tenga los permisos necesarios para hacerlo. Así que …
Crear plugins con seguridad. Comprobar las capacidades del usuario.
Si tu plugin permite a los usuarios enviar datos, ya sea en el lado del administrador o del público, debe verificar las capacidades del usuario.
Roles y capacidades del usuario
El paso más importante para crear una capa de seguridad eficiente es contar con un sistema de permisos de usuario. WordPress proporciona esto en forma de roles y capacidades de usuario.
Cuando un administrador crea un usuario para que acceda al sitio WordPress, le otorga un rol.
Cada usuario que inicia sesión tiene asignadas unas capacidades de usuario específicas, dependiendo del rol asignado.
Los roles de usuario son solo una forma elegante de decir a qué grupo pertenece el usuario. Cada grupo tiene un conjunto específico de capacidades predefinidas.
Por ejemplo, el usuario principal de su sitio web tendrá la función de Usuario de un Administrador, mientras que otros usuarios podrían tener funciones como Editor o Autor. Podría tener más de un usuario asignado a un rol, es decir, podría haber dos administradores para un sitio web.
Las capacidades del usuario son los permisos específicos que asignas a cada usuario o a un rol de usuario.
Siguiendo con el ejemplo, los administradores tienen la capacidad «manage_options» que les permite ver, editar y guardar opciones para el sitio web.
Los editores, por otro lado, carecen de esta capacidad, lo que les impedirá interactuar con las opciones.
Estas capacidades se verifican en varios puntos dentro del administrador. Dependiendo de las capacidades asignadas a un rol; Se pueden agregar o eliminar menús, funcionalidades y otros aspectos de la experiencia de WordPress.
A medida que creas un complemento, asegúrate de que ejecuta su código solo cuando el usuario actual tenga las capacidades necesarias.
Jerarquía
Cuanto mayor es el rol del usuario, más capacidades tiene el usuario. Cada rol de usuario hereda los roles anteriores en la jerarquía.
Por ejemplo, el «Administrador», que es el rol de usuario más alto en una instalación de un solo sitio, hereda los siguientes roles y sus capacidades: «Suscriptor», «Colaborador», «Autor» y «Editor».
Ejemplos
Sin restricciones
En el siguiente código, no se ha tenido en cuenta la seguridad, por lo que este plugin NO debe implementarse.
La intención del plugin es hacer que se cree un enlace en la interfaz que le da la posibilidad de eliminar publicaciones. Debido a que este código no verifica las capacidades del usuario, ¡permite que cualquier visitante del sitio elimine las publicaciones!
<?php /** * genera un enlace de «Borrar» basado en la url */ function wporg_generate_delete_link($content) { // ejecutar solo en caso de entrada única if (is_single() && in_the_loop() && is_main_query()) { // añadir los argumentos de la consulta: action, post $url = add_query_arg( [ 'action' => 'wporg_frontend_delete', 'post' => get_the_ID(), ], home_url() ); return $content . ' <a href="' . esc_url($url) . '">' . esc_html__('Borrar entrada', 'wporg') . '</a>'; } return null; } /** * solicitar handler */ function wporg_delete_post() { if (isset($_GET['action']) && $_GET['action'] === 'wporg_frontend_delete') { // verifica que tenemos el ID de la entrada $post_id = (isset($_GET['post'])) ? ($_GET['post']) : (null); // verifica que existe una entrada con ese número $post = get_post1 { return; } // borra la entrada wp_trash_post($post_id); // redirecciona a la página principal $redirect = admin_url('edit.php'); wp_safe_redirect($redirect); // hemos terminado die; } } /** * añade el enlace de borrado al final del contenido de la entrada */ add_filter('the_content', 'wporg_generate_delete_link'); /** * registra nuestra petición en el gancho de inicio */ add_action('init', 'wporg_delete_post'); ?>
Restringido a una capacidad específica
Con el ejemplo anterior, tenemos un plugin que permite a cualquier visitante hacer clic en el enlace «Borrar entrada» y eliminar la publicación, lo cual puede ser desastroso.
Como solo queremos que la capacidad de borrar la entrada esté limitada a «Editores» o superiores, debemos editar el código para lograrlo.
Para conseguir esto, verificaremos que el usuario actual tenga la capacidad «edit_others_posts, que solo los Editores o superiores tendrían:
<?php /** * genera un enlace de «Borrar» basado en la url */ function wporg_generate_delete_link($content) { // ejecutar solo en caso de entrada única if (is_single() && in_the_loop() && is_main_query()) { // añadir los argumentos de la consulta: action, post $url = add_query_arg( [ 'action' => 'wporg_frontend_delete', 'post' => get_the_ID(), ], home_url() ); return $content . ' <a href="' . esc_url($url) . '">' . esc_html__('Borrar entrada', 'wporg') . '</a>'; } return null; } /** * solicitar handler */ function wporg_delete_post() { if (isset($_GET['action']) && $_GET['action'] === 'wporg_frontend_delete') { // verifica que tenemos el ID de la entrada $post_id = (isset($_GET['post'])) ? ($_GET['post']) : (null); // verifica que existe una entrada con ese número $post = get_post2 { return; } // borrar la entrada wp_trash_post($post_id); // redirige a la página principal $redirect = admin_url('edit.php'); wp_safe_redirect($redirect); // hemos terminado die; } } if (current_user_can('edit_others_posts')) { // si el usuario actual tiene derechos /** * añade el enlace de borrado al final del contenido de la entrada */ add_filter('the_content', 'wporg_generate_delete_link'); /** * registra nuestra petición en el gancho de inicio */ add_action('init', 'wporg_delete_post'); } ?>
De esta forma, el plugin es básicamente el mismo, pero en la parte final, sólo se ejecutarán las acciones de presentar el enlace y registrar la petición, en caso en que el usuario tenga los permisos adecuados.
Recuerda poner la seguridad siempre en primer lugar. ¡Feliz aprendizaje!
¡Gracias por leernos!
¡Tus comentarios y preguntas nos ayudan a mejorar, por favor comenta!