Cómo mejorar la seguridad en WordPress

Base de datos

Antes de iniciar la instalación de WordPress debes crear un usuario único para él, puede sonar obvio para algunos y en realidad lo es: Nunca uses el usuario root de MySQL para conectarlo con tu sitio web. El nuevo usuario no debe necesariamente tener todos los privilegios (ALL PRIVILEGES), con los permisos Create, Delete, Drop, Update, Select, Alter y Execute debería ser suficiente para funcionar, verifica que así lo sea o agrega los que necesites.

crear_usuario_wordpress

Estableciendo permisos para el nuevo usuario en PHPMyAdmin

En el proceso de instalación cambia el prefijo de tabla “wp_” por el que tú quieras.

Directorios

Renombrar directorios

WordPress usa directorios con nombres específicos que pueden ser renombrados, incluso existen como plugins como Better WP SecurityHide My WP para cambiar toda la estructura por defecto y así “ocultar” cuál es el CMS que estamos usando, un poco exagerado pero puede ser útil dependiendo del caso. Para renombrar las carpetas manualmente deberemos agregar lo siguiente al archivo wp-config.php:

// Cambiando el directorio wp-content por "file"
define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/files' );
// Se define la nueva URL con el directorio
define( 'WP_CONTENT_URL', 'http://miweb.trin/files' );
// Cambiando el directorio plugins por "scriptsquemlan"
define( 'WP_PLUGIN_DIR', dirname(__FILE__) . '/files/scriptsquemolan' );
// Definiendo URL de la carpeta plugins
define( 'WP_PLUGIN_URL', 'http://miweb.trin/files/scriptsquemolan' );
// Cambiando el directorio uploads
define( 'UPLOADS', '/files/misfoticos' );

Directorios sin index

Otro asunto importante son los directorios que no tienen index y se listan todos los archivos que contienen, para que no suceda esto en el archivo donde creaste el VirtualHost de Apache para tu sitio debes agregar:

Options -Indexes FollowSymLinks MultiViews

Si no entiendes lo que digo más arriba o tienes un hosting compartido simplemente agrégalo al archivo .htaccess de la raíz. Esto lo que hará es devolver un error 403 en las carpetas sin index, no olvides también agregar un ErrorDocument 403 /index.php para que WP se encargue de “estilizar” el error cuando se muestre, también podríamos mostrar un mensaje personalizado amenazando al visitante… pero somos gente adulta ¿verdad?

Permisos de directorios y archivos

Los archivos utilizados por WordPress deben tener los permisos 644 y los directorios 755, para este punto sólo es poner un poco de lógica de qué permisos poner a X o Y directorio. Básicamente la carpeta wp-content (uploads y plugins) debe tener permisos para poder ser escrita en ella. Por ejemplo si el archivo wp-settings.php no tiene los permisos correctos y además la visualización de errores de PHP está activa verás algo horrible como esto:

errores_wp-settings

Temas y pluginsmeta_version_wordpress

También si eres uno de esos tacaños de mierda que sólo usa themes nulled lo mejor es que sí o sí revises el código, puede que haya alguna sorpresa por ahí.

Cuando se activa un theme es recomendado hurgar un poco en su código en busca de vulnerabilidades o de malas prácticas, es posible que el desarrollador se haya equivocado a la hora de utilizar una función y nos esté provocando un full path disclosure… me sucedió en una ocasión.

Algunos desarrolladores aman estar poniendo versiones y nombres para que sean mostrados en el HTML del sitio, en tal caso de que existiera una vulnerabilidad para la versión especifica que tenemos del theme o plugin los script kiddies nos encontrarían rápido. Para evitar esto algunas personas borran cualquier rastro del theme, por ejemplo eliminando la información que se encuentra en style.css.

theme_info_styleDeberías también agregar lo siguiente al functions.php del tema para que elimine la etiqueta meta con la versión de WordPress y otras cosas más:

if (!is_admin()) {
remove_action( 'wp_head', 'feed_links_extra');
remove_action( 'wp_head', 'feed_links');
remove_action( 'wp_head', 'rsd_link');
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'parent_post_rel_link', 10);
remove_action( 'wp_head', 'start_post_rel_link', 10);
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10);
remove_action( 'wp_head', 'wp_generator');
}

Formulario de acceso y usuarios

evitar_brute_force_wordpress

En cuanto al formulario de acceso si quieres y crees conveniente cambia el directorio wp-admin. Instala el plugin Login LockDown para evitar un ataque por fuerza bruta. Instala WordPress HTTPS (SSL) si tu paranoia te lo dicta.

Usuarios

Por una parte si tienes un sitio con un sólo usuario (o más de uno pero tienen poca actividad los otros) se recomienda por SEO ocultar la página de autor, porque aparecería exactamente lo mismo que en el home, es innecesario. Hablando directamente de seguridad también nos provee un problema enlazar los autores, normalmente la página del autor se generá así: sitio.trin/author/usuario, estaríamos dando fácilmente el usuario y si no tenemos el formulario de acceso protegido… ya te imaginarás.

Sitios con Buddypress o similares

Si usas tu WordPress con registro de usuarios, con un foro y demás cosas que provee Buddypress por ejemplo, entonces deberías agregar lo siguiente a tu functions.php:

add_action('init','restringir_acceso');

function restringir_acceso(){
if (strpos(strtolower($_SERVER['REQUEST_URI']),'/wp-admin/') !== false) {
    if ( !is_super_admin() &&!ajax_request() ) {
      wp_redirect( get_option('siteurl'), 302 );
    }
  }

}
function ajax_request(){
  if (defined('DOING_AJAX') && DOING_AJAX) return true;
    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
        return true;
    return false;
}

El código de arriba lo que hace es que cualquier usuario que no tenga los privilegios suficientes y que intente acceder al panel de administración sea redirigido al inicio del sitio, así nos evitamos fisgones. Por otra parte algunos plugins que hacen peticiones por medio de Ajax necesitan tener acceso, para ello se utiliza la función ajax_request().

Utilizar caché

Sí, es más una recomendación de optimización de lo que puede ser de seguridad. Pero podrás hacerle la vida un poco infeliz a alguien que te quiera tumbar el sitio con algún script que se descargó de Internet, además de eso si activas la minificación de HTML, CSS y Javascript te ahorrarás el trabajo de estar borrando los comentarios de plugins y themes ya que eso se hará automáticamente. Yo utilizo W3 Total Cache (puedes combinarlo con CludFlare por ejemplo), pero puedes encontrar otros más.

Recomendaciones obvias

Ya deberías saberlo, pero aquí van:

  • Realizar backups periodicamente
  • Mantén actualizado los plugins y el WordPress
  • Si es que usas un usuario llamado “admin” con ID 1, renómbralo
  • Elimina los archivos readme.html, license.txt…
  • Cambia el prefijo “wp_” en caso de que lo estés usando
  • Utiliza Akismet para evitar spam y captcha para formulario de contacto o similares
  • ¿Cuál se me escapa?

Artículo en actualización…

PHP en la consola: Lo que necesitas saber para hacer scripts

PHP es unos de los lenguajes de programación más utilizados en el mundo, el más utilizado hasta el momento en el ámbito web del lado del servidor. Para scripts CLI (línea de comandos) es más bien poco conocido, aunque cuenta con todas las posibilidades para hacerlo sus homólogos Python, Perl, Ruby y naturalmente Bash tienen una mayor popularidad. En este artículo veremos algunas características que deberías conocer si ya usas PHP en la web y quieres adentrarte en el mundo “juackeroso” de los scripts sin necesidad de aprender un nuevo lenguaje de programación.

También puedes hacer aplicaciones gráficas para escritorio con PHP-GTK y PHP-QT, pero siendo sincero no los recomiendo.

¿Qué puedo hacer con PHP desde la consola?

Todo lo que puedes hacer con PHP para la web lo puedes hacer en la consola, con algunas excepciones claro está, no deberías esperar que cosas hechas exclusivamente para la web funcionen en la consola, lo que sí puedes esperar es un mejor rendimiento, ejecutar scripts pesados en el navegador ocasionalmente los puede hacer malfuncionar y no me hables del tiempo limite de ejecución y recursos, cosas que no “molan”.

Empezando con PHP para la consola

Si usas Linux y similares ya deberías tener PHP funcionando en la terminal. Para Windows debes descargarlo y como recomendación agregarlo al PATH para usarlo de forma más fácil.

Consola interactiva

Eso que tanto gusta de Python, PHP incluye una consola interactiva para escribir código directamente desde ella:

php -a
Interactive shell
php > echo 5+5;
10
php > echo 10*10;
100
php > echo "Cualquier cosa";
Cualquier cosa

También es posible ejecutar código PHP pasándolo como argumento, usando -r:

php -r "echo base64_encode('hola');"
aG9sYQ==

Útil para usarlo junto a scripts de Bash por poner un ejemplo y usar alguna que otra función que nos provee PHP.

Pasar argumentos

Se le pueden pasar argumentos a un archivo PHP, la variable $argv se encargará de almacenarlos en un array y junto a $argc se puede conocer el número de parámetros pasados al script. Es importante no enviar argumentos con un guión (-) porque PHP los usa para sus propios parámetros de consola, para estos casos se debe usar doble guión.

<!--?php echo $argc; print_r($argv); ?-->

 

php pruebas.php un argumento que pasa por aqui
7 Array
(
[0] => pruebas.php
[1] => un
[2] => argumento
[3] => que
[4] => pasa
[5] => por
[6] => aqui
)

Leer datos de entrada

Como no es posible leer datos enviados por Post o Get hay una forma de leer datos de entrada en tiempo de ejecución (diferente a los parámetros):

<!--?php echo "Escribe tu nombre: "; $nombre = trim(fgets(STDIN)); echo "Hola " .$nombre; ?-->

 

<!--?php pruebas.php<br ?-->Escribe tu nombre: Urban
Hola Urban

Colorear consola

Es habitual poner un poco de color a nuestros scripts, en PHP es posible de una forma un tanto engorrosa, se debe usar secuencias de escape para ello:

<!--?php echo "\033[31mHola\033[37m"; echo "\033[32m desde RedInfoCol\033[37m"; ?-->

color-consola-php

Utilidades

  • Podemos encontrar más cosas interesantes, por ejemplo cuando un script va creciendo y creciendo van apareciendo nuevos ficheros, PHP nos provee para ello una solución, empaquetar estos archivos en uno solo con extensión .phar.
  • Podemos crear un servidor web para ejecutar los archivos PHP sin depender de Apache o similares, simplemente usando:
    php -S localhost:puerto
  • Usando un if (defined(‘STDIN’)) podemos comprobar si el script se está ejecutando desde la consola y en caso de que no mostrarle un mensaje al usuario para que lo haga.
  • Existen librerías para añadir a nuestro PHP y sacarle un mayor provecho a la hora de crear scripts.

Dar estilo a aplicaciones de Facebook con Fbootstrapp

Una parte importante de una aplicación es su diseño y estructura del contenido, en mi caso por ejemplo se me dificulta más idear esta parte que el mismo desarrollo, pero gracias a Fbootstrapp ahora me puedo olvidar del CSS y lo que ello conlleva. Fbootstrapp es un framework que incluye todo lo necesario para que nuestra aplicación de Facebook se vea bien: Botones, tablas, tipografías, formularios y demás componentes estilizados y no se limita sólo a eso, también trae consigo una librería Javascript (que usa jQuery) que nos permite hacer alertas, tabs, barras de navegación, etc. Este framework se basa en Bootstrap por lo que trae consigo algunas ventajas como poder usar Less o el Scaffolding adaptado para funcionar de maravilla en aplicaciones iFrame (canvas) o pestañas de fanpages.

Sitio web de Fbootstrapp

Publicar una foto con el PHP SDK en Facebook

Continuando el trabajo con el PHP SDK de Facebook veremos cómo publicar una foto en el muro de una persona. En este caso se debe hacer lo de siempre, autentificar al usuario con nuestra aplicación y pedir permiso de publicación (publish_stream) como lo vimos anteriormente, la única novedad es el uso del método setFileUploadSupport que le indica al SDK que permita la carga de archivos. Después de tener la foto guardada en el servidor, sea cual sea la forma en que tu aplicación la genere se publica la foto de la siguiente forma:

/*Se habilita la carga de archivos 
con setFileUploadSupport.*/
$facebook->setFileUploadSupport(true);
// Se indica la ruta de la imagen en el servidor.
$img = 'ruta_de_la_imagen.png';
// Haciendo uso de POST se envía la foto usando el método llamado api
$photo = $facebook->api('/me/photos', 'POST',
array( 'source' => '@' . $img,
'message' => 'Mensaje a ser publicado con la foto'
));

Facebook automáticamente crea un album con el nombre de la aplicación, en caso de querer crear un album con otro nombre:

$album=array('name'=>'BrianUR.info', 'description'=>'Tutoriales para crear aplicacion
en Facebook');
$facebook->api('/me/albums','post',$album);

Crear un sistema de login con Google+ (OAuth)

Con este articulo quiero dar el inicio a una serie de tutoriales sobre la API de varias redes sociales como Google+, Twitter, Youtube y todas las demás que se pueda en el proceso. Para crear un sistema de login en nuestra web con Google+ debemos conocer sobre OAuth, que por definirlo de una forma muy general y rápida es un protocolo creado para interactuar fácilmente con los datos de usuario de un sitio como lo puede ser Facebook, Google, Twitter y muchos más servicios reconocidos hacen uso de OAuth.

Lo primero que debemos hacer es registrar nuestro sitio:

Posteriormente en manejar dominios se debe verificar la propiedad del dominio siguiendo los pasos:


Continuar leyendo…

Crear un sistema de pago con tweets o publicaciones en Facebook

Es hora de hacer una aplicación real con lo aprendido en anteriores tutoriales, en este caso lo que haremos será una aplicación para loguear al usuario en nuestra web (no una aplicación dentro de Facebook) con el objetivo de que se le publique en el muro lo que queramos a cambio de poder descargar por ejemplo un libro o un tutorial, por decirlo de una mejor forma cambiar una descarga por un tweet o una publicación en Facebook. Es algo sencillo de hacer y bastante útil para hacer conocer tu sitio o producto en redes sociales.

Primero debes editar tu aplicación en el área de desarrolladores, buscas donde diga Selecciona como tu aplicación se intrega con Facebook y en Sitio web escribes la URL del sitio. Posteriormente debemos crear un directorio, en mi caso lo he llamado descargas. Este directorio debe estar protegido para que nadie con solo obtener la URL del archivo pueda descargarlo directamente, posteriormente usando PHP se llama al archivo para que pueda ser descargado solo por usuarios que hagan el “pago”. En la carpeta mencionada anteriormente creamos un archivo .htaccess que debe tener lo siguiente:

AuthUserFile  /home/miweb/descargas/.htpasswd
AuthName "Que coño intentas hacer?"
AuthType Basic

Options All
<Limit GET POST PUT>
require valid-user
</Limit>

Continuar leyendo…

Publicar en el muro con el PHP SDK

Una de las cosas más habituales en una aplicación es publicar contenido del usuario en su muro o en el de un amigo, así que para continuar trabajando con los métodos que nos provee el PHP SDK veremos como hacerlo. Para el caso de querer publicar en el muro de un amigo se debe reemplazar /me/feed por /IDAmigo/feed, no olvides que para que el código funcione tienes que autenticar el usuario y pedir el permiso extendido publish_stream.

<?php
$parametros=array('message' => 'Aprendiendo a desarrollar aplicaciones en Facebook',
				  'name' => 'BrianUR.info',
				  'caption' => 'Mi primer aplicacion en Facebook',
				  'link' => 'https://www.brianur.info',
				  'description' => 'Es genial',
				  'picture' => 'https://brianur.info/brianur.png',
				  'actions' => array(array('name' => 'Entra ya!',
                                      'link' => 'https://www.brianur.info')));
$facebook->api('/me/feed','post',$parametros);
?>

Conociendo el PHP SDK de Facebook

Facebook provee a los desarrolladores un kit de desarrollo para poder trabajar con su API de una manera más sencilla, dentro de estas herramientas se encuentran el JavaScript SDK, PHP SDK, iOS SDK (iPhone & iPad) y el Android SDK. Para este caso veremos el funcionamiento del PHP SDK de Facebook, trabajaremos algunos de sus métodos más usados, eso si, es primordial haber leído antes el funcionamiento de la Graph API de Facebook para entender lo que se hace en el código.

Puedes descargar el archivo facebook.php que necesitamos desde github. La versión actual es la 3.1.1, muy importante en tener en cuenta esto para las personas que ya habían desarrollado aplicaciones antes, ya que algunos métodos no funcionan en las nuevas versiones del SDK, como es el caso de getSession() que hacía parte de la Rest API, así que si ven un Fatal error: Call to undefined method Facebook::getSession() ya saben la razón.

Autenticación

El siguiente código siempre será necesario usarlo para poder autenticar el usuario con una aplicación (obtener un token, pedir permisos), si buscas por la red te podrás encontrar con múltiples formas para hacer este paso, hay personas que hacen varios tipos de validaciones (recomiendo que tu también lo hagas) para evitar errores; en este caso para ahorrar código y para que se entienda mejor he puesto lo estrictamente necesario:

< ?php
/*
	Código de ejemplo para obtener datos del usuario en Facebook
	www.BrianUR.info
*/
// URL de la aplicación
$urlApp = "http://apps.facebook.com/brianur/";
// ID y Secret ID de la aplicación
$appId = "0000000000000";
$secret = "00000000000000000000000000000000";
//Llamada al Facebook SDK
include_once "facebook.php";
// Instanciamos el objeto Facebook
$facebook = new Facebook(array('appId' => $appId,
							   'secret' => $secret,
							   'cookie' => true));
// Obtenemos una session
$user = $facebook->getUser();
if (!$user){
// Si el usuario no está autentificado crea una URL para hacerlo.
// Se usa 'scope' para pedir permisos separados por coma.
// Se usa 'redirect_uri' para redireccionar a esa URL despues de la acción del usuario
$loginUrl = $facebook->getLoginUrl(
            array(
                'scope' => 'user_about_me',
                'redirect_uri' => $urlApp
            )
    );
echo "<script type=\"text/javascript\">top.location.href = '$loginUrl';</script>";
} else {
	// Hasta aquí el usuario tendría que estar autentificado con la aplicación.
	$yo = $facebook->api('/me');
	print_r($yo);
}
?>

El anterior código retorna varios datos del usuario, para ver datos ocultos se requiere el uso de permisos extendidos.
Continuar leyendo…

La nueva plataforma para desarrolladores en Facebook: Creando una aplicación

En los últimos meses la plataforma para desarrolladores de aplicaciones para Facebook ha cambiado bastante, con solo mencionar que ya no se utiliza FBML el cual usé para casi todos los tutoriales anteriores y por lo tanto ya son obsoletos. De esta manera iniciaré otra serie de tutoriales hablando del “nuevo Facebook” y de cómo hacer aplicaciones en específico. Iniciemos por lo más básico, crear una aplicación. Este será el único tutorial en el que mostraré el proceso paso por paso para ayudar a los nuevos, en los próximos prometo ir al grano 😉

Creando una aplicación en Facebook Developers

Antes que nada para poder crear una aplicación debes tener tu cuenta verificada, para eso puedes agregar tu número de móvil y luego esperar a que te llegue un SMS con un código que debes usar para la verificación, he podido ver que a algunas personas no les llega el código y eso se debe al operador móvil que usan (Comcel), en mi caso usando Tigo funcionó perfectamente.

Para crear y editar aplicaciones se usa Facebook Developers, si es la primera vez que accedes a el te pedirá permisos y si ya habías creado una aplicación te darás cuenta que la interfaz cambió. Ahí veremos un botón llamado Crear una nueva aplicación:

Continuar leyendo…

Ingeniería inversa básica en Android

Los siguientes documentos son una introducción a la ingeniería inversa de aplicaciones hechas para Android (ejecutables con extensión .APK) escritos por mi amigo Ghost, en los que se describe el funcionamiento del Android SDK y también se explica como decompilar dichos ejecutables para modificarlos y luego volver a “recompilarlos” con algunas herramientas  existentes. Por el momento solo son dos papers, estaré informando la publicación de los próximos.

TOMO I

Aplicaciones necesarias:

Dex2Jar: Es la aplicación que vamos a usar para convertir nuestro fichero .dex a .Jar, es posible usarlo individualmente o podemos configurarlo en eclipse, que es lo que se explica en la guía.
JD-GUI: Una belleza de aplicación que nos deja “ver” el código fuente de los ficheros .class.

Descargar PDF “ingeniería inversa básica en Android [TOMO I]”

Descargar CrackME para pruebas

TOMO II

Las herramientas utilizadas son:
– Smali/Baksmali (Ensamblador/desensamblador).
– APKTool (Contiene las anteriores herramientas más opciones para modificiar APKs).
– Testsign.jar (para firmar aplicaciones Android.).
– zipalign (optimizar aplicaciones aptas para Android).
– Notepad++ o cualquier editor de texto avanzado.

Descargar PDF “Ingeniería inversa básica en Android [TOMO II]”