Tabla de contenidos
A la hora de desarrollar un plugin o un tema, es importante garantizar la seguridad ante un posible ataque. El core de WordPress nos ofrece herramientas para desarrollar con seguridad nuestros temas y plugins.
Posibles problemas
Los formularios y URLS son los recursos más usados por los hackers para colarse en nuestra web.
- Nos llenen la base de datos de información.
- Nos hagan cientos de peticiones sobrecargando el servidor.
- Puedan añadir un perfil administrador sin nuestro consentimiento.
- Pueden modificar el contenido.
- Pueden borrar la base de datos entera.
Controlar él envió de formularios y las URLS mediante NONCE
WordPress añade los NONCE para proteger las urls y él envió de formularios. Lo que hacen es impedir el acceso no autorizado mediante la generación de una clave secreta antes de enviarse la solicitud. Y comprueba antes de procesar la información sea la misma.
Para comprobar que una URL ésta correctamente enviada usamos en la creación:
wp_nonce_url
wp_nonce_url( $mi_url, 'borrar-_'.$post->ID ); //genera una url con el nonce <a href="<?php echo wp_nonce_url( $mi_url, 'borrar-_'.$post->ID );?>">
Este código genera una cadena _wpnonce en la url. Y para comprobar su envió antes de la acción usamos:
check_admin_referer('borrar-_'.$post->ID);
Y para añadir un nonce en un formulario usamos dentro del formulario:
wp_nonce_field
<form> <input name=”nombre”> <?php wp_nonce_field('mi_nonce_action','mi_nonce_field'); ?> </form> //oculta el nonce como input
Y en la página de recepción del formulario podemos comprobar que se ha enviado correctamente:
check_admin_referer(‘mi_nonce_action’, 'mi_nonce_field'); //comprueba el envió de la url
Controlar el guardado en la base de datos
Por otro lado, otro ataque típico, es usar los propios cajones de entrada de datos, para introducir códigos que puedan alterar nuestra base de datos, o provocar errores en nuestra plataforma. Imagina si alguien en vez de poner su nombre pone código de programación, que puede suceder? y eso es lo que hay que controlar, para lo que dependiendo del tipo de dato hay una función de WordPress:
Antes de guardar debemos pasar los datos por las funciones:
- sanitize_email() => Elimina caracteres que no deban ir en un mail, ejemplo acentos los quita
- sanitize_text_field() => Elimina html convirtiendo la variable en caracteres inofensivos
- sanitize_file_name()
- sanitize_html_class()
- sanitize_key()
- sanitize_meta()
- sanitize_mime_type()
- sanitize_option()
- sanitize_sql_orderby()
- sanitize_title()
- sanitize_title_for_query()
- sanitize_title_with_dashes()
- sanitize_user()
$nombre= sanitize_text_field( $_POST['nombre'] ); //luego guardamos en BD
Y para mostrar la información por pantalla:
- esc_html() => Escapar datos que tienen HTML
- esc_url() => Escapar urls
- esc_js() => Escapar js
- esc_attr() => Se usa para escapar elementos que tengan que ir dentro de html, por ejemplo etiquetas class, value, etc.
- esc_textarea() => Escapar textarea
$html = esc_html( '<a href="https://imacreste.com/">Enlace</a>' ); //se visualizaría asi: <a href="https://imacreste.com/">Enlace</a>
Otras medidas para asegurar él envió de información
- El prefijo de la base de datos debe ser distinto al que viene por defecto.
- Podemos incluir un captcha para evitar intentos de fuerza bruta, es decir que una maquina éste intentando meternos algo sin una acción humana.
- Instalar plugins de seguridad que nos avisen de tareas sospechosas.
- NUNCA, NUNCA des por hecho que los usuarios usarán las cosas como deben.