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.
El cloaking o encubrimiento es la práctica de mostrar un contenido distintos a usuarios y a los buscadores. El Cloaking incumple directamente las directrices para webmaster de Google (2022), 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.
Hay cierto contenido que si que está permitido que se muestre distinto a Google que a los usuarios. Por ejemplo:
En estos casos se considera que son cuestiones que si tiene sentido ofrecerle a Google algo distinto que a un usuario, por lo que no estarán sujetos a penalizaciones
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).
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.
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.
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.
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:
Cabe decir que el método de cloaking más fácil de detectar (aunque era previsible), es el del User-Agent.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Documentación de Google sobre encubrimiento.
Ponencia de Matt Cutts acerca del Cloaking. (Inglés)
Te falta mi máster. Accede a una formación avanzada que te permitirá aplicar e implementar SEO en cualquier tipo de WEB
¡Accede al Máster de SEO Técnico!Si te ha gustado esta publicación, siempre me lo puedes agradecer dándome like en esta publicación de LinkedIn sobre este mismo artículo.