¿Cómo ocultar que un sitio está usando WordPress?
Tengo un sitio web para el cual estamos tratando de ser discretos sobre el hecho de que estamos usando WordPress. ¿Qué pasos podemos tomar para hacerlo menos evidente?
EDICIÓN- Nota importante de seguridad:
Por favor, ten en cuenta que hacer esto perfectamente es imposible como se menciona en la respuesta de Mark, así que no dependas de esto como una medida de seguridad.

Los mayores indicios de WordPress se encuentran entre las etiquetas <head> </head>
.
Ejemplo de contenido en el head de WordPress generado por el Tema Twentyten y cómo eliminarlo:
<link rel="profile" href="http://gmpg.org/xfn/11" />
Eliminar directamente desde header.php
<link rel="stylesheet" type="text/css" media="all" href="http://ejemplo.com/wp-content/themes/twentyten/style.css" />
Ocultar WordPress llamando a tu hoja de estilos desde otra ubicación y cambiando el directorio wp-content. WordPress requiere que tu tema incluya cierta información básica en la parte superior de style.css (style.css debe estar en el directorio raíz del tema). Necesitarás crear un CSS alternativo y llamarlo desde tu head. WordPress no te obliga a usar el style.css del tema, solo requiere que esté en el directorio del tema.
Eliminar directamente desde header.php
<link rel="alternate" type="application/rss+xml" title="Blog de Ejemplo » Feed" href="http://ejemplo.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Blog de Ejemplo » Feed de Comentarios" href="http://ejemplo.com/comments/feed/" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://ejemplo.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://ejemplo.com/wp-includes/wlwmanifest.xml" />
<link rel='index' title='Blog de Ejemplo' href='http://ejemplo.com/' />
<meta name="generator" content="WordPress 3.1-alpha" />
Para eliminar estos enlaces adicionales puedes agregar un filtro a functions.php
// eliminar elementos innecesarios del head
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'parent_post_rel_link', 10, 0);
remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0);
Puedes cambiar tu directorio de plugins y tu directorio wp-content en tu archivo wp-config.php pero podrías tener algunos problemas si tu tema o algún plugin no usa el método adecuado para llamar a los archivos.
define( 'WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] . '/nuevo-wp-content' );
Establece WP_CONTENT_URL con la URI completa de este directorio (sin barra al final), ej.
define( 'WP_CONTENT_URL', 'http://ejemplo/nuevo-wp-content');
Opcional Establece WP_PLUGIN_DIR con la ruta local completa de este directorio (sin barra al final), ej.
define( 'WP_PLUGIN_DIR', $_SERVER['DOCUMENT_ROOT'] . '/nuevo-wp-content/nuevos-plugins' );
Establece WP_PLUGIN_URL con la URI completa de este directorio (sin barra al final), ej.
define( 'WP_PLUGIN_URL', 'http://ejemplo/nuevo-wp-content/nuevos-plugins');
PLUGINS
Ten en cuenta que algunos plugins como Akismet, All in One SEO, W3-Total-Cache, Super Cache y muchos otros agregan comentarios al HTML de salida. La mayoría son fáciles de modificar para eliminar los comentarios, pero tus cambios se sobrescribirán cada vez que los plugins se actualicen.
wp-includes
El directorio wp-includes contiene jQuery y varios otros archivos js que los temas o plugins llaman usando wp_enqueue_script(). Para cambiar esto necesitarás desregistrar los scripts predeterminados de WordPress y registrar la nueva ubicación. Agrega a functions.php:
function my_init() {
if (!is_admin()) {
// comenta las siguientes dos líneas para cargar la copia local de jQuery
wp_deregister_script('jquery');
wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', false, '1.3.2');
wp_enqueue_script('jquery');
}
}
add_action('init', 'my_init');
Esto deberá hacerse con cada script usado por tu tema o plugins.

Chris_O: ¡Excelente respuesta! Probablemente también deberías añadir que si usan plugins o temas, muchos de estos son fácilmente identificables; es decir, si alguien está usando el plugin akismet o all-in-one-seo, sigue siendo un indicio bastante claro para alguien que sabe lo que está buscando.

@MikeSchinkel Cierto, pero al mismo tiempo, lo mismo ocurre con wp-includes y wp-admin; con la excepción de que no puedes cambiar ninguno de esos, ni puedes ocultarlos sin limitar la funcionalidad del sitio.

@John P Bloch: Definitivamente, sin embargo no habría dicho pero, habría dicho y. :)

@MikeSchinkel: para wp-admin y wp-includes puedes hacer algunas cosas mediante el control de acceso de apache, para que esas rutas no existan para otros usuarios que no sean el administrador, por ejemplo, llevándolos a un 404 estándar.

@Chris_O: Revisa register_theme_directory()
, creo que es genial ocultar el directorio de temas fuera del directorio "wp-content".

@Chris_O ¿Son estos específicos de WordPress?
<link rel="alternate" type="application/rss+xml" title="Example Blog » Feed" href="http://example.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Example Blog » Comments Feed" href="http://example.com/comments/feed/" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://example.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://example.com/wp-includes/wlwmanifest.xml" />
<link rel='index' title='Example Blog' href='http://example.com/' />

@Chris_O Lo intentaré. Pero no entiendo esto: "Ocultar WordPress llamando a tu hoja de estilos desde otra ubicación..." Me confundió cómo llamarlo. Soy nuevo en WordPress y no sé cómo hacerlo. ¿Podrías decirme el código que debo ingresar?

También este...
define( 'WP_CONTENT_URL', 'http://example/new-wp-content');
¿Necesito copiar (¿o mover?) todos los archivos y carpetas en wp_content a la nueva carpeta?
¡Gracias!

@hakre: Esa es una solución mucho más sencilla. ¿Cuál es la mejor manera de hacerlo? ¿Puedes agregar una nueva respuesta sobre eso? Gracias

Un detalle que a menudo se pasa por alto: eliminar el archivo readme.html
en la raíz de WordPress. No solo identifica la instalación como WordPress, sino que también contiene la versión exacta. Y no olvides repetir este paso después de las actualizaciones.
Pregunta relacionada: Cómo prevenir el acceso o eliminar automáticamente readme.html, license.txt y wp-config-sample.php

Buen punto - también, puedes usar tu archivo .htaccess para denegar siempre el acceso al readme.html y así no tener que preocuparte por eliminarlo de nuevo.

...también puedes ver http://wordpress.stackexchange.com/a/201805/13561

La única respuesta válida: IMPOSIBLE
Tantas respuestas con muchos votos... es hora de aclarar las cosas. La verdad es que es virtualmente imposible y, incluso si lo fuera, la vida probablemente es demasiado corta para invertir esfuerzo en ello. Cualquier respuesta que prometa pasos para ocultar WordPress es solo una pérdida de tu tiempo y te hará pensar erróneamente que estás ocultando tu WP (lo cual es absurdo).
1) El problema no son las URLs obvias como wp-*
, el meta generador, etc. Los problemas difíciles son los patrones asociados con WordPress que un sistema personalizado no se molestaría en implementar, como páginas de autor, páginas de año/mes/día, usar p=nnn como parámetro válido, tener formularios de comentarios con la clase, estructura y nombres de enlaces típicos de WordPress. Además, está la autopromoción de plugins de caché y Yoast SEO, y probablemente muchos otros plugins que solo ves al inspeccionar el HTML.
2) Hay otros métodos incontables que muestran la existencia de WP (y no puedes evitarlo):
Incluso las cabeceras de respuesta PHP (como señaló Dan Gayle en los comentarios) devuelven la cabecera específica de WP.
Cualquiera puede consultar cualquiera de los archivos .php raíz:
site.com/wp-cron.php
osite.com/xmlrpc.php
(u otros, que no puedes ocultar) y la respuesta será200
en lugar de404 not found
.Cualquiera puede verificar los endpoints JSON para obtener respuestas específicas de WP.
Dentro del HTML de la página, muchos archivos
.css
o.js
contienen frases específicas que claramente hacen referencia a WP.Dentro del HTML de la página, es fácil encontrar elementos/clases CSS como
<div class="entry-content post-14"...
(lo cual es una pista directa de que se usa la estructura de WP).Dentro del HTML de la página, verás fácilmente la carpeta
uploads
, o incluso si la renombras manualmente, la parte de la fecha comouploads/2018/05/imagen.jpg
(o inclusoimagen-315x225.jpg
) muestra la típica estructura de WP.Como muchos sitios ahora usan Multisite, emplean enlaces como
/site/2
...Consultar cualquier readme de plugins/temas (todos lo tienen), como
plugin-name/readme.txt
, devuelve estado200
.Y muchas, muchas, muchas otras cosas que tú (o incluso profesionales) no podrán ocultar y solo te harán perder días.
Conclusión
Incluso si te esfuerzas en limpiar todo lo que indique que es WordPress, probablemente necesitarás rehacer o revisar después de cada actualización de plugins o del núcleo. La vida es demasiado corta para eso.
Puedes engañar a algunos aficionados, pero no puedes esconderte de un buen inspector. Si esto es una medida de seguridad, entonces es seguridad por oscuridad, lo cual siempre está mal. Y si te avergüenzas de usar WordPress, déjame decirte algo: a nadie le importa, y los pocos que sí, probablemente no sabrán cómo descubrirlo por sí mismos.
Lo único que debería importarte es proteger WordPress lo mejor posible y monitorear sus actualizaciones periódicas.

la única respuesta correcta, quería publicar eso. He votado negativamente todas las demás respuestas, ya que solo son intentos engañosos y que hacen perder el tiempo para lograr un objetivo imposible y sin sentido. Si me lo permites, agregaré mis 2 centavos dentro de tu respuesta.

Siempre he utilizado el método del Tema Roots.
Pero aplicarlo a esos ThemeJungle que hay por ahí suele ser un gran dolor de cabeza.
Así que empecé a experimentar con las constantes WP_CONTENT_*
. Creo que es un método mucho menos propenso a errores y esto es lo que tengo funcionando actualmente:
/m
es la carpeta uploads
, /t
es la carpeta themes
y /t/t
es la carpeta del tema activo. El sitio no es complejo, así que se cargan pocos recursos...
WP_CONTENTLESS
wp-config.php
Configurando wp-content
en la raíz (/public_html/
) del sitio.
/**
Dentro de WP_CONTENT, deben existir las siguientes carpetas:
/languages , /mu-plugins , /plugins , /themes , /upgrade , /uploads
Las definiciones WP_CONTENT_* a continuación ELIMINAN la existencia de la carpeta /wp-content
y hacen que su contenido resida en la RAÍZ de tu sitio
Se necesita EXTREMA atención al realizar actividades de mantenimiento de archivos en el servidor (ej: actualizaciones de WP, nuevo Webmaster...),
ya que las carpetas de Temas y Plugins están destinadas a renombrarse como /t y /p (serios candidatos a eliminación por descuido)
POR FAVOR ten en cuenta:
- cambiamos la carpeta de Plugins en las definiciones WP_PLUGIN_*
- la carpeta de Temas se cambia mediante un Plugin MustUse
(/mu-plugins/set-extra-themes-folder.php)
- la carpeta de Uploads se cambia en la página de configuraciones de WordPress
(http://example.com/wp-admin/options-media.php)
- la ruta hardcode a usar en WP_CONTENT_DIR y WP_PLUGIN_DIR se puede verificar usando una acción dentro del Plugin set-extra-themes-folder (revisa los comentarios en este archivo)
*/
define( 'WP_CONTENT_DIR', '/www/htdocs/username/public_html' );
define( 'WP_CONTENT_URL', 'http://www.example.com' );
define( 'WP_PLUGIN_DIR', '/www/htdocs/username/public_html/p' );
define( 'WP_PLUGIN_URL', 'http://www.example.com/p' );
Pregunté sobre esto en [wp-hackers] - ¿Algún inconveniente al configurar WP_CONTENT_DIR (y URL) a DOCUMENT_ROOT?, donde John Blackbourn1, Mike Little2 y Otto3 tuvieron la amabilidad de aconsejar:
1
He tenido esta estructura activa en un sitio durante los últimos 18 meses y no he visto ningún problema. Como con cualquier cambio en la ubicación del directorio de contenido, deberás verificar que cualquier plugin que añadas al sitio no asuma que el directorio de contenido está enwp-content
.2
Hay discusiones en la red de que$_SERVER['DOCUMENT_ROOT']
puede ser susceptible a hacking. En cuyo caso esto es extremadamente peligroso porque hay muchos lugares querequire()
oinclude()
WP_CONTENT_DIR
. 'algo';3
Hay casos donde el contenido en$_SERVER
puede ser perfectamente seguro, pero por motivos de seguridad, es mejor siempre tratarlo como datos no confiables. Para este caso específico, usa la ruta hardcodeada.
Una Nueva Carpeta de Temas
/mu-plugins/set-extra-themes-folder.php
Como no existen constantes WP_THEMES_*
, necesitamos la función register_theme_directory() para "Registrar un directorio que contenga temas."
Intenté configurar el directorio adicional en la raíz pero los resultados son divertidos (ej: no funciona).
<?php
/*
Plugin Name: Set Extra Themes Folder
Version: 1.0
Description: Permite que el directorio - http://example.com/t - sea utilizado como un directorio adicional de temas
Plugin URI: http://wordpress.stackexchange.com/questions/1507
Author: brasofilo
Author URI: http://rodbuaiz.com
*/
/**
* Elimina el comentario de la siguiente línea para conocer la ruta correcta para poner en register_theme_diretory()
*/
//add_action( 'admin_head', 'brsfl_alert_directory_path' );
function brsfl_alert_directory_path()
{
echo '<script type="text/javascript">
alert("Directorio: '.$_SERVER['DOCUMENT_ROOT'].'");
</script>';
}
/**
* Lo siguiente habilitará el directorio "t" para ser utilizado como un directorio EXTRA de Temas
*/
register_theme_directory( '/www/htdocs/username/public_html/t' );
/**
* Desregistrando scripts predeterminados en wp-includes para usar CDN
*/
add_action('init', 'brsfl_init_scripts');
function brsfl_init_scripts()
{
if ( !is_admin() )
{
wp_deregister_script( 'jquery' );
wp_deregister_script( 'swfobject' );
wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', false, '1.7.1' );
wp_register_script( 'swfobject', 'https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js', false, null, true );
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'swfobject' );
}
}
Carpeta de Uploads
/wp-admin/options-media.php
En lugar de http://example.com/uploads
, será http://example.com/m
.
Desmarcando Organizar mis subidas en...
dará una apariencia más WPless a las URLs de recursos.
Si el sitio está en vivo, se debe hacer un buscar/reemplazar en la base de datos y mover los archivos.
Plugins y Contenido Head
Consulta la respuesta de Cris_O
en este Q&A.
Readme.html
Consulta la respuesta de Rarst
en este Q&A.
Otros Pasos
Como es habitual, los temas ThemeJungle pueden requerir hacks específicos en el tema.
Como... TimThumb no funcionando (!!!lol!!!).

Lo siento, ThemeForest, parece que has tomado medidas para abordar este asunto. ¡Y con algunas buenas manos amigas!

Puedes tener WordPress en un servidor y extraer tu contenido desde otro, incluyendo solo el contenido que necesitas.
Si necesitas RSS, tendrías que hacer lo mismo con ese feed.
En efecto, sería como servir páginas estáticas desde un proxy o CDN, pero solo las partes que quieres mostrar. Luego también podrías usar un sistema de comentarios basado en JavaScript como Disqus.
Uso de recursos muy bajo, porque no hay bases de datos en el servidor que sirve el contenido.

@AndyBeard - Es una idea muy interesante, pero requeriría mucho tiempo de desarrollo para conseguir algo funcional. ¿O conoces algún proyecto de código abierto donde alguien ya haya hecho esto?

Aquí tienes una solución http://wordpress.org/extend/plugins/really-static/ - hay algunas otras alternativas

Puedes crear una dirección personalizada para iniciar sesión en tu blog. Al no utilizar la ruta clásica "miweb.com/wp-admin" para acceder a tu panel de control, esta página te ayudará a crear inicios de sesión ocultos, lo que también es bueno para medidas de seguridad.
Así las personas que intenten acceder añadiendo wp-admin a tu blog, no podrán adivinarlo :)

@kaiser : la Máquina de Wayback de Internet Archive lo tiene (e increíblemente, incluso el zip) ;)

@brasofilo Solo para que quede mejor cubierto - aquí hay un pastebin "que no expira". :)

Además de lo anterior, necesitas restringir el acceso a los diversos archivos y directorios wp*
. Si alguien quisiera ver si estás ejecutando WP, podría adivinar para ver si tienes wp-settings.php
o si pueden acceder a algún directorio. Devolver un 403 no es suficiente porque le indica al usuario que el recurso existe; simplemente no tienen acceso a él.
No soy un experto en Apache, así que hice esta pregunta en serverfault.

No olvides que mucha de la información del encabezado HTTP que se envía junto con tu solicitud puede identificar que tu sitio está ejecutándose en WordPress. Por ejemplo, si revisas los encabezados en los siguientes sitios, es evidente:
$ curl -I http://www.rollingstones.com/
Server: WP Engine/5.0
$ curl -I http://www.mattcutts.com
X-Powered-By: W3 Total Cache/0.9.1.3
$ curl -I http://blogs.reuters.com/us/
WP-Super-Cache: Served supercache file from PHP
Algunos de estos son configurados por el servidor, otros por plugins, así que no hay una única forma de decir cómo eliminarlos al 100%, pero si estás usando PHP 5.3 puedes utilizar
header_remove("X-Foo");
(http://www.php.net/manual/en/function.header-remove.php)
para eliminar un encabezado PHP conocido antes de que tu contenido sea enviado. No puedo decir con certeza dónde colocarlo (tal vez alguien más pueda aportar esa información), pero probablemente sea seguro colocarlo al inicio de tu archivo index.php ANTES de cualquier contenido que se envíe al navegador.

Esto puede ser difícil de lograr si eres nuevo en PHP y mod_rewrite. Te sugiero que revises la sección de mi respuesta. O inténtalo tú mismo, puedes usar algo como esto para ocultar la estructura de la ruta wp-content/plugins:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^modules/(.*) /wp-content/plugins/$1 [L,QSA]
</IfModule>
Esto cambiará la ruta a /modules. Usa algo similar para otras estructuras, quizás necesites algunos reescritos avanzados, mira http://httpd.apache.org/docs/current/mod/mod_rewrite.html para obtener información adicional sobre mod_rewrite.
Si prefieres algo listo para usar, hay algunos plugins interesantes, algunos comerciales y otros gratuitos en el repositorio de WordPress, te sugiero probar WP Hide & Security Enhancer. Esto incluye muchas cosas y ayuda a cambiar casi todo para hacer que tu WordPress sea irreconocible. Aquí hay algunas características del código:
- URL de administración personalizada
- URL de administración personalizada
- Bloquear URL de administración predeterminada
- Bloquear cualquier acceso directo a carpetas para ocultar completamente la estructura
- Nombre de archivo personalizado para wp-login.php
- Bloquear wp-login.php predeterminado
- Bloquear wp-signup.php predeterminado
- Bloquear API XML-RPC
- Nueva ruta para XML-RPC
- URL de tema ajustable
- Nueva URL de tema hijo
- Cambiar nombre del archivo de estilo del tema
- wp-include personalizado
- Bloquear rutas predeterminadas de wp-include
- Bloquear wp-content predeterminado
- URLs de plugins personalizadas
- Cambio de URL individual para plugins
- Bloquear rutas predeterminadas de plugins
- Nueva URL de carga
- Bloquear URLs de carga predeterminadas
- Eliminar versión de WordPress
- Bloquear Meta Generator
- Deshabilitar el código javascript de emoji y requerido
- Eliminar etiqueta pingback
- Eliminar Meta wlwmanifest
- Eliminar Meta rsd_link
- Eliminar wpemoji
y mucho más...

La mayoría de las respuestas se concentran en ocultar WordPress en el código fuente de una página, pero incluso antes de eso, WP ya se delata en la cabecera HTTP de una instalación estándar. Solo prueba tu propio sitio en una página como web-sniffer (simula ser IE 6 y solicita una cabecera HTTP 1.0) y verás que entre los resultados está:
<http://www.example.com/wp-json/>; rel="https://api.w.org/"
Este último es un enlace a la API de Wordpress.org. Está ahí desde que la API REST se incluyó en WP 4.4. Puedes eliminarlo con esta línea al principio de tu functions.php
:
remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
Muchos plugins, como Jetpack para sus shortlinks, también pueden insertar enlaces en la cabecera HTTP. Pueden hacerlo porque WP tiene una API HTTP, que te permite manipular cabeceras. Podrías usar esta interfaz para eliminar todas las configuraciones de cabecera de los plugins si añades tu acción suficientemente tarde en el proceso.
Finalmente, puedes usar la interfaz de cabeceras de .htaccess para interceptar cualquier cosa que WP esté haciendo. Por ejemplo, puedes evitar que se envíen cabeceras Link incluyendo esta línea:
<IfModule mod_headers.c>
Header unset Link
</IfModule>

Puedes usar el plugin WPS Hide Login.
Inicias sesión en tu WordPress usando wp-admin
. Pero puedes cambiar wp-admin
por un texto personalizado usando este plugin.
Ejemplo:
Antes: http://example.com/wp-admin
Después: http://example.com/texto-personalizado-para-acceso
