Limpiar enlaces inyectados en WordPress

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.

Eliminar enlaces de forma masiva en WordPress

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:

Search Regex

Un comentario en “Limpiar enlaces inyectados en WordPress

  1. Manuel

    Buenos días Ramón!

    Yo también he visto infinidad de webs así. Últimamente por la zona en la que vivo muchos negocios (curiosamente con webs que ha hecho una misma empresa local…cosa que me da qué pensar…) tienen ese problema.

    Lo mejor de todo es que se lo digo al propietario, les da un toque al que le lleva la web, los quita y al poco aparecen otros jajajaja (vamos que ni puta idea, con perdón de la expresión ….)

    Y para rematar la faena encima siguen con ellos trabajando… En fin, qué te voy a contar 🙂 Buen aporte ^_^

    Un saludo!

    Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Los comentarios de esta página se procesan por un sistema automático de moderación por lo cual no siempre se publican de forma instantánea. Por favor respeta a los demás y ciñete al tema del post. Nos reservamos el derecho de eliminar cualquier comentario o enlace que nos parezca inadecuado o tenga una expresión de grosería, insulto, odio, hostilidad o negatividad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.