Desinfectando URLs en WordPress
Trabajar con campos centrados en el usuario en WordPress, como inputelementos, textareaelementos o cualquier tipo de campo en el que un usuario pueda proporcionar sus propios valores, es un lugar que siempre debe ser un objetivo de desinfección.
Afortunadamente, la API de WordPress proporciona una serie de funciones para ayudar con esto. Dependiendo de su caso de uso, es posible que deba realizar una de las siguientes acciones:
Y todo eso está muy bien, pero también hay formas en las que puede trabajar para desinfectar los datos utilizando las funciones proporcionadas por PHP.
Claro, a veces las expresiones regulares son el camino a seguir pero, otras veces, es posible que desee utilizar funciones integradas en el lenguaje, más fáciles de entender y de seguir.
Cuando escribo mi propio código (y cuando reviso otros) trato de tener eso en cuenta. Entonces, dicho esto, aquí hay un proceso que puede usar que puede facilitar sus esfuerzos cuando trabaja con URL en WordPress.
Si no está preparado para la discusión completa sobre esto, puede saltar al encabezado en la parte inferior de la publicación que describe el código y cómo usarlo en su trabajo.
Digamos que tiene un inputelemento abierto y desea permitir que el usuario proporcione una URL que finalmente se representará en el front-end, quizás en un enlace, en algún tipo de esquema o simplemente tal cual.
Es posible ser muy agresivo y simplemente hacer algo como "Si esta no es una URL válida, entonces no la guardes".
Y, para ser claros, no estoy diciendo que una URL válida no devuelva un 404 (porque a veces existen páginas y años después no lo hacen). Estoy definiendo una URL válida como una que está correctamente formateada y no incluye ninguna información superflua.
Digamos que, por el bien de este ejemplo simple, está ofreciendo un campo de texto que eventualmente se guardará en la tabla de metadatos de la publicación. Además, eliminará todo lo que sea ilegal en una URL y dejará solo lo que crearía una URL válida.
Para hacer eso, encuentro que las siguientes funciones son las más útiles:
- tira_etiquetas. Quite las etiquetas HTML y PHP de una cadena.
- tiras oblicuas. Elimina las comillas de una cadena entrecomillada.
- var_filtro. Filtra una variable con un filtro especificado.
Esto último suena un poco confuso porque se basa en la idea de que entiendes qué son realmente los filtros. En PHP, los filtros se pueden dividir en dos casos de uso:
- Validación
- Desinfección
Y son esencialmente formas preconstruidas para que procesemos los datos de tal manera que los procese para determinar si es el tipo de información, generalmente una cadena o una matriz, que estamos buscando.
Ponerlo a trabajar
Con eso en mente, así es como puede intentar guardar información en la base de datos sin ningún tipo de desinfección (lo cual es algo malo):
<?php
$data['url'] = 'https://tommcfarlin.com/<script type="text/javascript">alert('hello world!');</script>';
Con el código anterior, el usuario puede literalmente ingresar cualquier cosa en el campo y guardarlo en la base de datos. Por eso es importante la sanitización. Sin él, el usuario puede causar estragos en la experiencia del usuario o en toda la instalación de WordPress.
Entonces, ¿cómo se ve aplicar el código de arriba al desinfectar las URL? En términos generales, se ve así :
<?php
if (!isset($data['url']) {
return '';
}
$url = $data['url'];
$data['url'] = strip_tags(
stripslashes(
filter_var($url, FILTER_VALIDATE_URL)) );
Primero, el código se ejecuta a través de un filtro PHP que valida una URL. Si la cadena pasada a la función de filtro ni siquiera funciona como URL, la función devolverá false.
Si, por el contrario, funciona como una URL válida, entonces podemos quitar las barras que no sean necesarias. Esto significa que podemos "quitar las comillas de cualquier cadena entrecomillada". Más precisamente, esto eliminará la primera barra invertida consecutiva (porque, en PHP, las barras invertidas se usan para escapar de una barra invertida). ¿Claro? 🙂
Finalmente, optamos por eliminar las etiquetas porque solo queremos la URL en sí. No queremos marcas, etiquetas ni nada que pueda sabotear los datos que se escriben en la base de datos. Esto significa que si opta por ejecutar algo como:
https://tommcfarlin.com/<script type="text/javascript">alert('hello world!');</script>
Te quedarás con:
"https://tommcfarlin.com/alert('hello world!');"
Entonces, juntando todo el código anterior usando esta cadena:
https://tommcfarlin.com/<script type="text/javascript">alert('hello world!');</script>'
Dará como resultado la siguiente salida:
https://tommcfarlin.com/alert('hello world!');
Obviamente, esta no es una URL válida, pero es limpia, segura y le permite realizar cualquier otro trabajo que pueda necesitar para validar que la URL es segura para el usuario.