Limpiar enlaces inyectados en WordPress

Categorías: WordPress
Etiquetas: ,

A día de hoy todavía nos llega algún que otro WordPress infectado al que le han inyectado enlaces en las publicaciones, páginas y custom post types. Estos enlaces no tienen el atributo hidden para que no puedan encontrarse rápidamente, sino que se esconden detrás de un punto que no tiene subrayado de enlace.

Por ejemplo: <a style="text-decoration:none" href="/eriacta-online-offer">.</a>

¿Cómo podemos eliminar estos enlaces si tenemos miles de publicaciones?

La forma más rápida es eliminarlo a través de la base de datos. Para ello lo más sencillo es usar el plugin SEARCH REGEX que aunque hace tiempo no se actualiza, sigue funcionando y nos sirve (con una pequeña modificación) para lo que queremos conseguir.

Hay instrucciones y ejemplos de uso de SEARCH REGEX aquí.

El mayor problema es que el plugin por defecto solo busca en páginas y entradas, no en CUSTOM POST TYPES, pero esto lo podemos solucionar de la siguiente forma:

SEARCH REGEX en CUSTOM POST TYPES

Para que SEARCH REGEX busque en CUSTOM POST TYPES, tenemos que editar el archivo del plugin post_content.php que está en la carpeta /searches/. Normalmente no recomendamos nunca editar un archivo de un plugin porque lo que modifiquemos se perderá en la próxima actualización y muy probablemente no nos acordemos de que lo hemos modificado cuando lo actualizamos. Pero en este caso el plugin se actualizó la última vez hace más de 2 años y no tiene vistas a que lo actualicen pronto. No obstante como solo lo vamos a usar una vez para hacer un cambio puntual y después lo desactivaremos, no pasa nada.

Línea 7:

$sql = "SELECT ID, post_content, post_title FROM {$wpdb->posts} WHERE post_status != 'inherit' AND post_type IN ('post','page') ORDER BY ID ".$orderby;

Cambiarla por:

$sql = "SELECT ID, post_content, post_title FROM {$wpdb->posts} WHERE post_status != 'inherit' ORDER BY ID ".$orderby;

O incluir los post types que queramos:

$sql = "SELECT ID, post_content, post_title FROM {$wpdb->posts} WHERE post_status != 'inherit' AND post_type IN ('post','page','post_type_mio') ORDER BY ID ".$orderby;

Aunque nosotros usamos el siguiente, que también reemplaza en el texto de los ATTACHMENTS (imágenes, etc):

$sql = "SELECT ID, post_content, post_title FROM {$wpdb->posts} ORDER BY ID ".$orderby;

 

En este caso la infección era de enlaces como el siguiente:  <a style="text-decoration:none" href="/eriacta-online-offer">.</a>

Siendo la URL siempre distinta. Para poder hacer el reemplazo masivo, necesitamos crear una expresión regular que encuentre ese texto (con distintas URLs) y nos permita reemplazarlo.

Podemos usar estos dos comprobadores de REGEX para ver si nuestra expresión regular funciona correctamente: Rubular o Regex101.

En este caso la expresión regular que reemplaza esos enlaces es:

#<a style="text-decoration:none" href="\/(.*?)">.</a>#

En el plugin SEARCH REGEX hay que incluir la almohadilla al principio y al fin porque sino no detecta correctamente el principio y fin de la expresión regular.

Ejecutamos el plugin (primero una prueba con search y luego el definitivo que hace los cambios con Replace&Save) y adiós enlaces malignos:

Salir de la versión móvil