Comenzamos en: 17d 10h 11m 17s
PLAZAS LIMITADAS

Cloaking o encubrimiento en el SEO

El encubrimiento es una práctica engañosa para beneficiarse ofreciendo un contenido diferente al usuario del de los bots de los motores de búsqueda.

Fecha de publicación: 2022-08-10
Última revisión: 2022-09-19

El cloaking o encubrimiento es la práctica de mostrar una URL o contenido distintos a usuarios y a los buscadores. El Cloaking incumple directamente las directrices para webmaster de Google, no solo porque proporcione a los usuarios resultados diferentes a los que esperaban. Sino porque se está tratando de «hackear» o alterar los resultados de Google de una forma inorgánica, sin proporcionar beneficio alguno en los usuarios. Por lo que es una técnica totalmente blackhat.

Yo no recomiendo nunca el black hat para trabajar SEO de forma profesional y mucho menos cuando lo que están en juego son negocios. Y en este caso tampoco hago una excepción.

Sin embargo, para mí un principio básico de la seguridad es saber que pueden hacer los «malos». Así que conociendo las formas más avanzadas de cloaking podemos corregir errores propios de nuestra web e incluso ataques de cloaking que nos hagan si han conseguido acceso a nuestra web.

Ataques de Cloaking

Si bien antes el Cloaking se utilizaba para ocultar contenido propio y aparecer en los resultados de búsqueda por alguna palabra clave ahora se utiliza más bien cuando se hackea un sitio para poner enlaces sin que la víctima lo note:

Para que esto ocurra, el atacante ha tenido que tener acceso de alguna forma al hosting o servidor, y es un ataque muy sutil que le puede ir trayendo beneficios al atacante a costa del trabajo de otro, o le puede servir para hacer un ataque de SEO negativo, que consiste en conseguir una penalización o una bajada de visibilidad de la web de la víctima en los motores de búsqueda. Un tipo de ataque que puede resultar mucho más dañino que simplemente cerrar o eliminar una web y que puede hasta arruinar negocios.

Por lo que entre otros muchos motivos, es muy importante tener siempre una web segura y no confiar en software crakeado que resulta ser gratuito por amor al arte (para eso existe el software libre).

Como hacer Cloaking

Las formas más avanzadas de Cloaking siguen dos técnicas. Una por medio del User-agent y otra por medio de la IP.

Esto se puede hacer de diversas formas. Desde un servidor como Apache o Nginx o desde un lenguaje de servidor. Voy a mostrar como se hace con PHP de una forma relativamente sencilla, y que si alguien inserta este código en tu web, puede hacer que tengas enlaces a otras webs y ni si quiera te hayas dado cuenta.

Mostrar contenido solo a ciertos USER-AGENTS.

Hay varias formas relativamente sencillas de mostrar contenido a ciertos User-agents. Mostraré dos distintas basadas en el mismo principio:

<?php
// Forma 1 de poner un contenido si user agent
if(strstr(strtolower($_SERVER[‘HTTP_USER_AGENT’]), «googlebot»))
{
echo «Este contenido solo se mostrará a esos User-agents.»;
}
?>
<?php
// Forma 2 de poner un contenido si user agent
if (preg_match(‘/bot|googlebot|bingbot|facebookexternalhit/i’, $_SERVER[‘HTTP_USER_AGENT’])) {
echo ‘Este contenido solo se mostrará a esos User-agents.’;
}
?>

Básicamente ambas formas lo que hacen un condicional y si el user-agent que hace el request coincide, muestra el contenido. De esta forma se podría poner un enlace no visible para el usuario:

<?php
if(strstr(strtolower($_SERVER[‘HTTP_USER_AGENT’]), «googlebot»))
{
echo «Así inserto un <a href=»https://example.com»>enlace de cloaking</a> que solo ve Googlebot»;
}
?>

Esto puede ser relativamente fácil de detectar con Screaming-frog si se cambia el user-agent o con la misma consola de Google Chrome.

Mostrar contenido sólo a ciertas IP.

La desventaja del Cloaking por User-agent es que se puede detectar en cualquier momento con alguna herramienta cambiando facilmente de User-Agent. Pero la cosa cambia si solo mostramos ese contenido a las IP que utiliza Google cuando rastrea Googlebot. Que para ello podemos utilizar fácilmente el listado de direcciones IP de Googlebot. También tenemos el listado de IP de Bingbot, que no lo añador en el ejemplo porque es simplemente un ejemplo.

El código si hacemos un array con todo el listado de IPs quedaría así:

<?php
$deny = array( «2001:4860:4801:10::/64», «2001:4860:4801:11::/64», «2001:4860:4801:12::/64», «2001:4860:4801:13::/64», «2001:4860:4801:14::/64», «2001:4860:4801:15::/64», «2001:4860:4801:16::/64», «2001:4860:4801:17::/64», «2001:4860:4801:18::/64», «2001:4860:4801:19::/64», «2001:4860:4801:1a::/64», «2001:4860:4801:1b::/64», «2001:4860:4801:20::/64», «2001:4860:4801:21::/64», «2001:4860:4801:22::/64», «2001:4860:4801:23::/64», «2001:4860:4801:24::/64», «2001:4860:4801:25::/64», «2001:4860:4801:26::/64», «2001:4860:4801:27::/64», «2001:4860:4801:28::/64», «2001:4860:4801:29::/64», «2001:4860:4801:2::/64», «2001:4860:4801:2a::/64», «2001:4860:4801:2b::/64», «2001:4860:4801:2c::/64», «2001:4860:4801:2d::/64», «2001:4860:4801:2e::/64», «2001:4860:4801:2f::/64», «2001:4860:4801:30::/64», «2001:4860:4801:31::/64», «2001:4860:4801:32::/64», «2001:4860:4801:33::/64», «2001:4860:4801:34::/64», «2001:4860:4801:35::/64», «2001:4860:4801:36::/64», «2001:4860:4801:37::/64», «2001:4860:4801:38::/64», «2001:4860:4801:39::/64», «2001:4860:4801:3::/64», «2001:4860:4801:3a::/64», «2001:4860:4801:3b::/64», «2001:4860:4801:3c::/64», «2001:4860:4801:3d::/64», «2001:4860:4801:3e::/64», «2001:4860:4801:40::/64», «2001:4860:4801:41::/64», «2001:4860:4801:42::/64», «2001:4860:4801:43::/64», «2001:4860:4801:44::/64», «2001:4860:4801:45::/64», «2001:4860:4801:46::/64», «2001:4860:4801:47::/64», «2001:4860:4801:48::/64», «2001:4860:4801:49::/64», «2001:4860:4801:4a::/64», «2001:4860:4801:50::/64», «2001:4860:4801:51::/64», «2001:4860:4801:53::/64», «2001:4860:4801:60::/64», «2001:4860:4801:61::/64», «2001:4860:4801:62::/64», «2001:4860:4801:63::/64», «2001:4860:4801:64::/64», «2001:4860:4801:65::/64», «2001:4860:4801:66::/64», «2001:4860:4801:67::/64», «2001:4860:4801:68::/64», «2001:4860:4801:69::/64», «2001:4860:4801:6a::/64», «2001:4860:4801:6b::/64», «2001:4860:4801:6c::/64», «2001:4860:4801:6d::/64», «2001:4860:4801:6e::/64», «2001:4860:4801:6f::/64», «2001:4860:4801:70::/64», «2001:4860:4801:71::/64», «2001:4860:4801:72::/64», «2001:4860:4801:73::/64», «2001:4860:4801:74::/64», «2001:4860:4801:75::/64», «2001:4860:4801:76::/64», «2001:4860:4801:77::/64», «2001:4860:4801:80::/64», «2001:4860:4801:81::/64», «2001:4860:4801:82::/64», «2001:4860:4801:83::/64», «2001:4860:4801:84::/64», «2001:4860:4801:85::/64», «2001:4860:4801:86::/64», «2001:4860:4801:90::/64», «2001:4860:4801:91::/64», «2001:4860:4801:92::/64», «2001:4860:4801::/64», «2001:4860:4801:c::/64», «2001:4860:4801:f::/64», «66.249.64.0/27», «66.249.64.128/27», «66.249.64.160/27», «66.249.64.192/27», «66.249.64.224/27», «66.249.64.32/27», «66.249.64.64/27», «66.249.64.96/27», «66.249.65.0/27», «66.249.65.128/27», «66.249.65.160/27», «66.249.65.192/27», «66.249.65.224/27», «66.249.65.32/27», «66.249.65.64/27», «66.249.65.96/27», «66.249.66.0/27», «66.249.66.128/27», «66.249.66.192/27», «66.249.66.32/27», «66.249.66.64/27», «66.249.68.0/27», «66.249.68.32/27», «66.249.68.64/27», «66.249.69.0/27», «66.249.69.128/27», «66.249.69.160/27», «66.249.69.192/27», «66.249.69.224/27», «66.249.69.32/27», «66.249.69.64/27», «66.249.69.96/27», «66.249.70.0/27», «66.249.70.128/27», «66.249.70.160/27», «66.249.70.192/27», «66.249.70.224/27», «66.249.70.32/27», «66.249.70.64/27», «66.249.70.96/27», «66.249.71.0/27», «66.249.71.128/27», «66.249.71.160/27», «66.249.71.192/27», «66.249.71.32/27», «66.249.71.64/27», «66.249.71.96/27», «66.249.72.0/27», «66.249.72.128/27», «66.249.72.160/27», «66.249.72.192/27», «66.249.72.224/27», «66.249.72.32/27», «66.249.72.64/27», «66.249.72.96/27», «66.249.73.0/27», «66.249.73.128/27», «66.249.73.160/27», «66.249.73.192/27», «66.249.73.224/27», «66.249.73.32/27», «66.249.73.64/27», «66.249.73.96/27», «66.249.74.0/27», «66.249.74.32/27», «66.249.74.64/27», «66.249.74.96/27», «66.249.75.0/27», «66.249.75.128/27», «66.249.75.160/27», «66.249.75.192/27», «66.249.75.224/27», «66.249.75.32/27», «66.249.75.64/27», «66.249.75.96/27», «66.249.76.0/27», «66.249.76.128/27», «66.249.76.160/27», «66.249.76.192/27», «66.249.76.224/27», «66.249.76.32/27», «66.249.76.64/27», «66.249.76.96/27», «66.249.77.0/27», «66.249.77.128/27», «66.249.77.32/27», «66.249.77.64/27», «66.249.77.96/27», «66.249.79.0/27», «66.249.79.128/27», «66.249.79.160/27», «66.249.79.192/27», «66.249.79.224/27», «66.249.79.32/27», «66.249.79.64/27», «66.249.79.96/27»);
if (in_array ($_SERVER[‘REMOTE_ADDR’], $deny)) {
echo ‘Mostrar solo si es una IP de Google’;
}
?>

De esta forma el contenido solo se mostraría si pertenece a una IP de Google. Y todavía se puede rizar más el rizo, haciendo que ese contenido solo sea visible si proviene de Googlebot con una IP oficial de Google.

Cloaking a la práctica

He creado una página para poder comprobar hasta que punto podemos detectar dichas implementaciones, la página para detectar cloaking. No es una herramienta que detecte el cloaking, sino más bien una página con cloaking para ir pudiendo hacer distintas pruebas.

La idea de esto es poder simular ser Google para comprobar que la página arroja el mismo contenido al usuario que a Google. Si conseguimos todos los resultados en verde, es que hemos conseguido simular ser Google, y podemos auditar así cualquier proyecto para comprobar que no ha sido hackeado y no está siendo infectado con alguna técnica de Cloaking como en el vídeo que he mostrado al principio.

Para la realización de la prueba he hecho 3 frases «encubiertas». Estas frases solo se mostrarán en el caso de que el usuario que lo rastree es Google. De otra forma, se mostrará un contenido en color rojo que dice «NO DETECTADO». Los 3 métodos son:

  1. Si la IP Corresponde a los servidores que Google utiliza para rastrear contenido de cara a la indexación y al posicionamiento.
  2. Si el User-Agent es Googlebot.
  3. Si se cumplen las dos condiciones previas.

Cabe decir que el método de cloaking más fácil de detectar (aunque era previsible), es el del User-Agent.

Probando que funciona

Primero he comprobado que todo el código es correcto, he añadido mi IP al listado y cambiado mi User-Agent por Googlebot y funciona:

Google Mobile Testing y resultados enriquecidos

He probado con el Google Mobile Testing, el cual ha rastreado mi página con la ip 66.249.72.149, la cual no está en el listado oficial y saco la conclusión de que esta herramienta rastrea por medio de otro listado de IPs. Por lo que esta herramienta, si bien rastrea con Googlebot, es insuficiente para poder comprobar un cloaking muy cuidadoso.

probar cloaking mobile test

Los resultados obtenidos con otras herramientas como el proveedor de resultados enriquecidos han sido los mismos, con una ip muy cercana: 66.249.72.147, pero siguen sin ser las IP que utiliza Google a la hora de rastrear o indexar.

Google Traductor

Rastreando mi página con Google traductor si que me permite rastrear la web con la ip: 66.249.93.201, una IP distinta a la mía, pero sin ser del listado de Google. Tampoco usa el user-agent de Googlebot.

rastreo Google Traductor

Webcache

Tenía mucha esperanza que con esta herramienta si pudiera ver con los ojos de Google con su propia IP, ya que no es una herramienta con la que puedas rastrear cuando quieras, y es cuando pasa el bot. No obstante, los resultados de webcaché fueron dilapidarios.

Cloaking indetectable por webcache

Al parecer me investigó con la IP 66.249.70.147, una IP fuera de los rangos del potente rastreador. Por lo cual este método tampoco es detectable por el propio Google.

Es decir, la realidad es que se hacer un mejor Cloaking que el que sé detectar.

Search Console

El rastreo que se hace por medio de la Search Console tampoco parece compartir IP con los rastreadores reales. Arrojando los mismos resultados que con Friendly Mobile Testing y con la herramienta de resultados enriquecidos.

Esto no quiere decir que no se pueda detectar con la Search Console. Pero no de forma preventiva.

cloaking search console
Fuente de la imagen: Links assistant.

Seguiré investigando acerca de como poder detectar de forma preventiva si alguien accede a una web y coloca este tipo de código. Como podéis comprobar, poner un código de estas características en la web de un usuario para que sólo lo detecte Google, sería difícil de detectar.

Consecuencias del Cloaking

Cualquier tipo de encubrimiento infringe las directrices de calidad de Google. Por lo que no existe ningún tipo de «White-hat» cloaking. Todos los tipos de encubrimiento infringen nuestras directrices.

Matt Cutts

Por lo que sí, podríamos decir que experimentar con esta práctica conlleva cierto riesgo. Precisamente, por el riesgo que conlleva, es más habitual que se emplee en ataques de SEO negativo que en mejorar el posicionamiento propio.

Por ejemplo si el cloaking enlaza a tu web, es posible (no garantizado) que también acabes llevando una penalización por medio de enlaces. Por lo que recomiendo emplear la herramienta Disavow (Utilizar la herramienta con sumo cuidado y solo con la supervisión de un experto en el tema) si detectas un enlace por medio de la Search Console de una URL que parece emplear Cloaking. Sin embargo el principal penalizado si se detecta Cloaking va a ser la web que lo emplee. Porque o bien es intencional e intenta mejorar los resultados de una forma artificial en los motores de búsqueda, o es una web hackeada y por tanto insegura para el usuario.

¿Qué puede ser considerado Cloaking?

Aunque por definición sea mostrar un contenido distinto a los usuarios que a los motores de búsqueda.

Por cuestión de anuncios y dinamismo de la web, no se tiene en cuenta que todo el contenido sea exactamente el mismo. De hecho, no entrarían dentro de estas prácticas ofrecer un contenido diferente por idioma/geolocalización o por el tamaño de dispositivo movil.

La ofuscación de enlaces no se considera Cloaking tampoco, ya que no está mostrando a los motores de búsqueda ningún contenido distinto al de los usuarios.

¿Se puede considerar Cloaking el CSR/SPA?

Google cada vez rastrea mejor el contenido de Javascript. Y aunque tiene que hacer varios pasos en contraposición con una web con cualquier otro tipo de renderizado, a día de hoy acaba detectando el contenido si tiene suficiente crawl budget. En el peor de los casos, Google no detectará el contenido, pero a no ser que se muestre algo diferente, no lo considerará como engañoso, al igual que no considera engañoso el dynamic rendering siempre y cuando ambas versiones tengan el mismo contenido, dicho por el propio Martin Splitt.

Cloaking que Google detecta facilmente

Google cada vez ha avanzado más en la detección del Cloaking, y hay ciertos tipos de encubrimiento que detecta tan fácilmente que es posible que no lo penalice, sino que directamente nunca tenga en cuenta dicho contenido. Ya que la realidad es que no es encubrimiento como tal. Ya que no se le muestra un contenido diferente a los motores de búsqueda que a los usuarios, sino que no se muestra en el entorno visual o sin la carga de Javascript. Lo cual pueden ser errores de implementación y es algo de hecho bastante común en el CSR como he comentado previamente.

El contenido oculto sería más bien que aunque se pueda ver por medio del código fuente o cargando javascript, un usuario normal o que no haya cargado Javascript no consigue ver el contenido completo o de una forma correcta (aquí también desagregamos de esta práctica contenido que se genere con @media por ejemplo en las webs responsive).

Por ejemplo, si se oculta contenido por medio de CSS (sobre todo inline); incluyendo enlaces, estos no contarán como enlaces. Aunque luego este contenido se vuelva a mostrar por medio de JavaScript.

En el mejor de los casos no rastreará los enlaces (aunque aparezcan en el código fuente), y en el peor (yéndonos al extremo) se puede considerar contenido engañoso y ser penalizable.

Si por algún efecto de la funcionalidad de la web, se tiene que ocultar el contenido. Es mejor que sea visible de forma «nativa» y que se «oculte» por medio de Javascript.

Elementos que pueden ser considerados ocultos:

Muchas veces puede no ser intencional, y no todo el texto oculto se considera engañoso. Por ejemplo hay incluso estándares como con la navbar de desktop y mobile. Pero hay que tener cuidado con las prácticas mencionadas arriba, porque a veces se producen no intencionadamente.

Ejemplo de web que es invisible a priori por medio de CSS aunque luego Javascript elimine el visibility hidden.

Bibliografía

Documentación de Google sobre encubrimiento.

Ponencia de Matt Cutts acerca del Cloaking. (Inglés)

Verificación de Googlebot.

Ocultar tu propia ip.

 

¿Quieres hacer el Master de SEO Técnico?

Accede a una formación avanzada que te permitirá aplicar e implementar SEO en cualquier tipo de WEB

¡Accede al Master de SEO Técnico!
Tal vez te interesen estos artículos: