jueves, 13 de agosto de 2015

Crear Juego Snake con HTML5 Canvas y jQuery



En este tutorial vamos aprender como hacer el clásico juego Snake, donde una Serpiente crecía cada vez que se comía una manzana (un punto negro), supongo que este juego lo conocemos todos.
Se utilizara el elemento Canvas que nos brinda HTML5 y jQuery.

Crear la estructura HTML y el Canvas

Esta será la estructura de nuestro HTML.
<!doctype html>
 <html>
  <head>
   <title>Juego Snake</title>
   <script src="jquery.js" type="text/javascript"></script>
   <script src="snake.js" type="text/javascript"></script>
  </head>
  <body>
   <canvas id="pantalla"></canvas>
  </body>
 </html>
Y para comenzar con el JavaScript quien será que hará toda la programación solo almacenaremos en una variable el canvas, su contexto que es donde dibujaremos y haremos toda la magia, y le daremos un tamaño de 400px de ancho, 400px de alto.
$(document).ready(function(){

    //elemento jQuery del canvas
    var $canvas = $('#pantalla');

    //elemento DOM del canvas
    var canvas = $canvas[0];

    //dar dimensiones al canvas
    $canvas.width(400);
    $canvas.height(400);

    //obtener el contexto
    var ctx = canvas.getContext('2d');

});
Probemos si el canvas funciona dandole un color de fondo, agregamos la siguientes lineas después devar ctx = canvas.getContext('2d'); solo para ver si hasta el momento vamos bien.
ctx.fillStyle = '#fea';
ctx.fillRect(0, 0, 400, 400);
Esto nos debería mostrar un fondo amarillento en un recuadro 400×400 pixeles.

Vamos hacer que se mueva la serpiente

ya que sabemos que funciona el canvas, vamos a crear el juego en si, comenzando por hace que se mueva.
Pero antes vamos a acomodar el código desde ahora en un objeto de esta manera.
var Snake = (function(){

    //propiedades
    var $canvas = undefined;
    var canvas = undefined;
    var ctx = undefined;

    function iniciar_canvas()
    {
        //elemento jQuery del canvas
        $canvas = $('#pantalla');

        //elemento DOM del canvas
        canvas = $canvas[0];

        //dar dimensiones al canvas
        $canvas.prop('width', '400');
        $canvas.prop('height', '400');

        //obtener el contexto
        ctx = canvas.getContext('2d');
    }

})();
Así tenemos el canvas y el contexto en nuestro propio objeto o área donde no interferirá con otras variables que podrían existir y la podemos acceder de cualquier otra funciona que pertenezca a Snakeque es el encargado de todo el juego.
Definamos 4 propiedades mas para saber la posición, el color y el ancho de nuestra serpiente.
var posicion_x = 0;
var posicion_y = 0;
var color_serpiente = '#000000'; //color negro en hexadecimal
var ancho_serpiente = 10;
Definamos un nuevo método llamado iniciar_juego, el que se encargara de iniciar todo para el juego, por el momento solo iniciara las propiedades de posición, Snake.posicion_x y Snake.posicion_y y finalmente llamara el método principal ciclo, este se ejecutara dentro de iniciar_canvas.
function iniciar_juego()
{
    //iniciar propiedades
    posicion_x = 50;
    posicion_x = 30;

    //iniciar juego
    ciclo();
}
Definamos otro método llamado ciclo será nuestro método principal el cual se encargara de dibujar y hacer que todo se mueva, aunque tal vez no directamente todo pase en este método.
function ciclo()
{
    ctx.fillStyle = color_serpiente;
    ctx.fillRect(posicion_x, posicion_y, ancho_serpiente, ancho_serpiente);

    posicion_y += ancho_serpiente;
    posicion_x += ancho_serpiente;

    setTimeout(ciclo, 200);
}
Cada 0.2segundos (200 milisegundos) (5 frame por segundos) volvemos a ejecutar la función ciclo y esto creara el movimiento de nuestra serpiente. Pero si hasta ahora han estado intentando solo nos mostrara una linea como la imagen que esta debajo en vez de moverse parece que esta dibujando una linea en diagonal.
classic_snake_screenshot_1
Hasta ahora para poder obtener lo que vemos en la imagen de arriba, tenemos el código siguiente
var Snake = (function(){

    //propiedades
    var $canvas = undefined;
    var canvas = undefined;
    var ctx = undefined;

    var posicion_x = 0;
    var posicion_y = 0;
    var color_serpiente = '#000000'; //color negro en hexadecimal
    var ancho_serpiente = 10;

    function iniciar_canvas()
    {
        //elemento jQuery del canvas
        $canvas = $('#pantalla');

        //elemento DOM del canvas
        canvas = $canvas[0];

        //dar dimensiones al canvas
        $canvas.prop('width', '400');
        $canvas.prop('height', '400');

        //obtener el contexto
        ctx = canvas.getContext('2d');

        iniciar_juego();
    }

    function ciclo()
    {
        ctx.fillStyle = color_serpiente;
        ctx.fillRect(posicion_x, posicion_y, ancho_serpiente, ancho_serpiente);

        posicion_y += ancho_serpiente;
        posicion_x += ancho_serpiente;

        setTimeout(ciclo, 200);
    }


    return {
        iniciar_canvas: iniciar_canvas
    };

})();

//cuando el documento este cargado completamente ejecutar iniciar_canvas
$(document).ready(Snake.iniciar_canvas);
Para esto debemos “limpiar” nuestro canvas antes de volver a dibujar y re-posicionar nuestra serpiente, pero definamos nuestro color de fondo en este momento, con el clásico verde o algo parecido a ese verde como propiedad.
var color_fondo = '#A9CB95';

function ciclo()
{
    //limpiar pantalla
    ctx.fillStyle = color_fondo;
    ctx.fillRect(0, 0, 400, 400);

    //dibujar serpiente
    ctx.fillStyle = color_serpiente;
    ctx.fillRect(posicion_x, posicion_y, ancho_serpiente, ancho_serpiente);

    posicion_y += ancho_serpiente;
    posicion_x += ancho_serpiente;

    setTimeout(ciclo, 200);
}

La Serpiente

Ahora si vemos ver nuestra serpiente moverse diagonalmente en vez de dibujar una linea diagonal.
Vamos a mantener todo relacionado a la serpiente en si en un objeto, asi que si a volver a modificar un poco el codigo.
Crearemos otra propiedad llamada serpiente
var serpiente;

serpiente = function()
{

}
Y movemos todas las propiedades y metodo relacionado a este “objeto”.
function serpiente()
{
    var posicion_x = 0;
    var posicion_y = 0;
    var color_serpiente = '#000000';  //color negro en hexadecimal
}
No movemos ancho_serpiente porque le vamos a cambiar el nombre a ancho_cuadro ya que sera el mismo ancho de la comida y para mantener el valor en una sola variable se cambiara el nombre.
Agregaremos dos propiedades mas a la serpiente:
var cuerpo = [];
var tamano_inicial = 3;
Este tamaño inicial indica el tamaño inicial de la serpiente, digamos fuera de codigo que es el largo de la serpiente, la cantidad de cuadrito que tendra y el cuerpo sera un array conteniendo cada “cuadrito” de su cuerpo.
Entonces ya que estamos moviendo todo lo relacionado a la serpiente, moveremos el codigo que dibujaba la serpiente y lo llamaremos dibujar.
this.dibujar = function()
{
    //dibujar serpiente
    ctx.fillStyle = color_serpiente;
    ctx.fillRect(posicion_x, posicion_y, ancho_cuadrado, ancho_cuadrado);
}
Crear otro metodo para colocar su posición
this.colocar = function(x, y)
{
    posicion_x = x;
    posicion_y = y;
}
Ahora crearemos nuestro objeto serpiente y asignarle la posición en el metodo iniciar_juego, ahora este metodo se vera de esta forma:
function iniciar_juego()
{
    serpiente = new serpiente();

    //iniciar posicion
    serpiente.colocar(50, 50);

    //iniciar juego
    ciclo();
}
Entonces para mover la serpiente debemos sumarle el ancho del cuadro como soliamos hacer anteriormente, pero ahora no podemos acceder a la propiedad posicion_y ni posicion_x, pero total olvidemos eso ya que debemos crear un método que se llame mover el cual se encargara de mover la serpiente, ya que de por si ella comienza a moverse sola y solo el jugador elige en que dirección, pero siempre se estará moviendo.
function ciclo()
{
    //limpiar pantalla
    ctx.fillStyle = color_fondo;
    ctx.fillRect(0, 0, 400, 400);

    serpiente.dibujar();
    serpiente.mover();

    setTimeout(ciclo, 200);
}
En la serpiente tendremos el método mover que por ahora simplemente tendremos una linea de código
this.mover = function()
{
    posicion_x += ancho_cuadro;
}
Ahora tenemos la serpiente moviendose sola hacia la derecha, así comenzara el juego con la serpiente moviendose a la derecha, pero el es un simple cuadrito y este juego empieza con una serpiente de 3 cuadritos de largo lo cual hemos definido 2 variables anteriormente la cual manejara esto.
var cuerpo = [];
var tamano_inicial = 3;
Modificaremos 3 método las cuales son movercolocar y dibujar, a continuación lo veremos como van a quedar cada uno.
this.colocar = function(x, y)
{
    posicion_x = x;
    posicion_y = y;

    for(i=0;i&lt;tamano_inicial;i++)
        cuerpo.push([x - ( i * ancho_cuadro ), y]);
}

this.dibujar = function()
{
    //dibujar serpiente
    ctx.fillStyle = color_serpiente;
    for(i=0;i&lt;cuerpo.length;i++)
        ctx.fillRect(cuerpo[i][0], cuerpo[i][1], ancho_cuadro, ancho_cuadro);
}

this.mover = function()
{
    for(i=0;i&lt;cuerpo.length;i++)
        cuerpo[i][0] += ancho_cuadro;
}
Cuando coloquemos por primera vez nuestra serpiente vamos agregarle a su cuerpo 3 cuadritos, en la variable cuerpo que es un array que almacenara las posiciones de cada “cuadritos” que forman el cuerpo, al dibujar pues recorremos el array cuerpo para dibujar uno por uno cada parte del cuerpo, al igual en mover movemos cada parte una por una.
Con jQuery vamos a manejar los eventos de cuanto se teclea arriba, abajo, delante o atrás de esta manera.
var Direccion = {
    '38': 'arriba',
    '39': 'derecha',
    '40': 'abajo',
    '37': 'izquierda'
};

$(document).keydown(function(e){
    var tecla = e.which;

    if ( Direccion[ tecla ] )
        serpiente.cambiarDireccion( Direccion[ tecla ] );
});
Direcciones contiene los valores en numero de la tecla arriba=38, derecha=39, etc. Cuando se presione una tecla, y esa tecla pertenece a una Dirección (si es una tecla permitida) pues la cambiamos con el método cambiarDireccion (aun no creado todavía).
El método cambiarDireccion se encargada como si nombre le dice de cambiar la dirección de la serpiente.
Al objeto serpiente le crearemos otra propiedad llamada direccion que almacenara en que dirección actualmente se dirige, por defecto será hacia la derecha.
var direccion = 'derecha';

this.cambiarDireccion = function(nuevaDireccion)
{
    direccion = nuevaDireccion;
}
Cambiaremos nuestro método mover ya que ahora no solo se moverá a la derecha si no que dependerá a que dirección lo este haciendo, por lo tanto nuestro método mover quedara de esta manera.
this.mover = function()
{
    var nuevaPosicion = cuerpo[0].slice();
    switch( direccion )
    {
        case 'arriba':
            nuevaPosicion[1] -= ancho_cuadro;
            break;
        case 'derecha':
            nuevaPosicion[0] += ancho_cuadro;
            break;
        case 'abajo':
            nuevaPosicion[1] += ancho_cuadro;
            break;
        case 'izquierda':
            nuevaPosicion[0] -= ancho_cuadro;
            break;
    }

    cuerpo.unshift(nuevaPosicion);
    cuerpo.pop();
}
La nueva posición la determinaremos dependiendo de la posición actual de la cabeza y según su la dirección es donde se moverá, si aumentaremos su posición en x o y, o la aumentaremos. Después la nueva posición la entramos en el cuerpo como cabeza y la cola la sacamos.
Ah! pero no nos olvidemos de prohibir cambiar la dirección de nuestra serpiente a la contraria a la que se dirige, por lo tanto cambiemos el método cambiarDireccion:
this.cambiarDireccion = function(nuevaDireccion)
{
    if ( direccion == 'arriba' || direccion == 'abajo' )
        var direccionesPermitidas = ['derecha', 'izquierda']
    else
        var direccionesPermitidas = ['arriba', 'abajo'];

    if ( direccionesPermitidas.indexOf(nuevaDireccion) &gt;= 0 )
        direccion = nuevaDireccion;
}

Colocar Comida

Tenemos que crear un objeto que maneje la comida que la serpiente tiene que comerse, el objeto será como esta continuación.
//objeto para la comida
function comida()
{
    var posicion_x = 0;
    var posicion_y = 0;
    var color_comida = '#000000';
    var posicionAleatoria = [];

    this.colocar = function()
    {
        posicionAleatoria = this.conseguirPosicion();

        while ( serpiente.obtenerCuerpo().some(this.posicionOcupada) )
        {
            posicionAleatoria = this.conseguirPosicion();
        }

        posicion_x = posicionAleatoria[0];
        posicion_y = posicionAleatoria[1];
    }

    this.mostrar = function()
    {
        ctx.fillStyle = color_comida;
        ctx.fillRect(posicion_x, posicion_y, ancho_cuadro, ancho_cuadro);
    }

    this.conseguirPosicion = function()
    {
        var X = Math.floor(Math.random()*($canvas.width()/ancho_cuadro))*ancho_cuadro;
        var Y = Math.floor(Math.random()*($canvas.height()/ancho_cuadro))*ancho_cuadro;

        return [X, Y];
    }

    this.posicionOcupada = function(element)
    {
        return ( element[0] == posicionAleatoria[0] &amp;&amp; element[1] == posicionAleatoria[1] );
    }
}
Recuerda que también tenemos que crear una variable llamada comida que almacenara este objeto.posicionAleatoria almacenaremos la posición que generaremos aleatoriamente, y el métodoconseguirPosicion es la encargada de generar esta posiciones aleatoria, mientras queposicionOcupada verifica si esta posición no colisiona con una posición de la serpiente.
Ya que tenemos el método para posicionar la comida debemos crear un método que verifique si la serpiente se ha comido (colisiona) con la comida.
this.colision = function(x, y)
{
    if ( posicion_x == x &amp;&amp; posicion_y == y )
        return true;
}
Modificaremos el método mover de la serpiente para verificar esta colisión.
this.mover = function()
{
    var nuevaPosicion = cuerpo[0].slice();

    switch( direccion )
    {
        case 'arriba':
            nuevaPosicion[1] -= ancho_cuadro;
            break;
        case 'derecha':
            nuevaPosicion[0] += ancho_cuadro;
            break;
        case 'abajo':
            nuevaPosicion[1] += ancho_cuadro;
            break;
        case 'izquierda':
            nuevaPosicion[0] -= ancho_cuadro;
            break;
    }

    cuerpo.unshift(nuevaPosicion);
    cuerpo.pop();

    if ( comida.colision(nuevaPosicion[0], nuevaPosicion[1]) )
    {
        comida.colocar();

        var cola = cuerpo[cuerpo.length-1].slice();
        cuerpo.push(cola);
    }
}
No podemos permitir que se coma así misma ni tampoco choque con los bordes, esto significa que el juego ha terminado. Estos métodos se utilizara para comprobar la colisión.
this.comprobarColisiones = function()
{
    var cabeza = cuerpo[0].slice();
    var resto = cuerpo.slice(1);
    var fueraHorizontalmente = cabeza[0] &gt; ($canvas.width() - ancho_cuadro) || cabeza[0] &lt; 0;
    var fueraVerticalmente = cabeza[1] &gt; ($canvas.height() - ancho_cuadro) || cabeza[1] &lt; 0;

    if ( fueraHorizontalmente || fueraVerticalmente )
        return true;


    if ( resto.some(this.seComioAsiMisma) )
        return true;

    return false;
}

this.seComioAsiMisma = function(element, index, array)
{
    var cabeza = cuerpo[0].slice();
    if ( element[0] == cabeza[0] &amp;&amp; element[1] == cabeza[1] )
        return true;

    return false;
}
Y Ya tenemos todo, un juego básico y simple, le di unos últimos toques y el código final es el siguiente.

Código Final

HTML

<!doctype html>
 <html>
  <head>
   <title>Juego Snake</title>
   <script src="jquery.js" type="text/javascript"></script>
   <script src="snake.js" type="text/javascript"></script>
  </head>
  <body>
   <canvas id="pantalla"></canvas>
  </body>
 </html>

JavaScript

var Snake = (function(){

    //propiedades
    var $canvas = undefined;
    var canvas = undefined;
    var ctx = undefined;

    var fps = 5;
    var intervalo;
    var es_fin_juego = false;

    var color_fondo = '#A9CB95';
    var ancho_cuadro = 10;

    var serpiente;
    var comida;

    //objeto para la comida
    function comida()
    {
        var posicion_x = 0;
        var posicion_y = 0;
        var color_comida = '#000000';
        var posicionAleatoria = [];

        this.colocar = function()
        {
            posicionAleatoria = this.conseguirPosicion();

            while ( serpiente.obtenerCuerpo().some(this.posicionOcupada) )
            {
                posicionAleatoria = this.conseguirPosicion();
            }

            posicion_x = posicionAleatoria[0];
            posicion_y = posicionAleatoria[1];
        }

        this.colision = function(x, y)
        {
            if ( posicion_x == x &amp;&amp; posicion_y == y )
                return true;
        }

        this.mostrar = function()
        {
            ctx.fillStyle = color_comida;
            ctx.fillRect(posicion_x, posicion_y, ancho_cuadro, ancho_cuadro);
        }

        this.conseguirPosicion = function()
        {
            var X = Math.floor(Math.random()*($canvas.width()/ancho_cuadro))*ancho_cuadro;
            var Y = Math.floor(Math.random()*($canvas.height()/ancho_cuadro))*ancho_cuadro;

            return [X, Y];
        }

        this.posicionOcupada = function(element)
        {
            return ( element[0] == posicionAleatoria[0] &amp;&amp; element[1] == posicionAleatoria[1] );
        }
    }

    //objeto para la serpiente
    function serpiente()
    {
        var posicion_x = 0;
        var posicion_y = 0;
        var color_serpiente = '#000000';  //color negro en hexadecimal
        var direccion = 'derecha';

        var cuerpo = [];
        var tamano_inicial = 3;

        this.obtenerCuerpo = function()
        {
            return cuerpo;
        }

        this.dibujar = function()
        {
            //dibujar serpiente
            ctx.fillStyle = color_serpiente;
            for(i=0;i&lt;cuerpo.length;i++)
                ctx.fillRect(cuerpo[i][0], cuerpo[i][1], ancho_cuadro, ancho_cuadro);
        }

        this.colocar = function(x, y)
        {
            posicion_x = x;
            posicion_y = y;

            cuerpo = [];
            direccion = 'derecha';

            for(i=0;i&lt;tamano_inicial;i++)
                cuerpo.push([x - ( i * ancho_cuadro ), y]);
        }

        this.mover = function()
        {
            if ( this.comprobarColisiones() )
                fin_juego();

            var nuevaPosicion = cuerpo[0].slice();

            switch( direccion )
            {
                case 'arriba':
                    nuevaPosicion[1] -= ancho_cuadro;
                    break;
                case 'derecha':
                    nuevaPosicion[0] += ancho_cuadro;
                    break;
                case 'abajo':
                    nuevaPosicion[1] += ancho_cuadro;
                    break;
                case 'izquierda':
                    nuevaPosicion[0] -= ancho_cuadro;
                    break;
            }

            cuerpo.unshift(nuevaPosicion);
            cuerpo.pop();

            if ( comida.colision(nuevaPosicion[0], nuevaPosicion[1]) )
            {
                comida.colocar();

                var cola = cuerpo[cuerpo.length-1].slice();
                cuerpo.push(cola);
            }
        }

        this.comprobarColisiones = function()
        {
            var cabeza = cuerpo[0].slice();
            var resto = cuerpo.slice(1);
            var fueraHorizontalmente = cabeza[0] &gt; ($canvas.width() - ancho_cuadro) || cabeza[0] &lt; 0;
            var fueraVerticalmente = cabeza[1] &gt; ($canvas.height() - ancho_cuadro) || cabeza[1] &lt; 0;

            if ( fueraHorizontalmente || fueraVerticalmente )
                return true;


            if ( resto.some(this.seComioAsiMisma) )
                return true;

            return false;
        }

        this.seComioAsiMisma = function(element, index, array)
        {
            var cabeza = cuerpo[0].slice();
            if ( element[0] == cabeza[0] &amp;&amp; element[1] == cabeza[1] )
                return true;

            return false;
        }

        this.cambiarDireccion = function(nuevaDireccion)
        {
            if ( direccion == 'arriba' || direccion == 'abajo' )
                var direccionesPermitidas = ['derecha', 'izquierda']
            else
                var direccionesPermitidas = ['arriba', 'abajo'];

            if ( direccionesPermitidas.indexOf(nuevaDireccion) &gt;= 0 )
                direccion = nuevaDireccion;
        }
    }


    function iniciar_canvas()
    {
        //elemento jQuery del canvas
        $canvas = $('#pantalla');

        //elemento DOM del canvas
        canvas = $canvas[0];

        //dar dimensiones al canvas
        $canvas.prop('width', '400');
        $canvas.prop('height', '400');

        //obtener el contexto
        ctx = canvas.getContext('2d');

        ctx.fillStyle = '#fea';
        ctx.fillRect(0, 0, 400, 400);

        iniciar_juego();
    }

    function iniciar_juego()
    {
        es_fin_juego = false;

        serpiente = new serpiente();
        comida = new comida();

        //iniciar propiedades
        serpiente.colocar(50, 50);

        comida.colocar();

        //iniciar juego
        ciclo();
    }

    function fin_juego()
    {
        es_fin_juego = true;
        clearTimeout(intervalo);

        var x = $canvas.width() / 2;
        var y = $canvas.height() / 2;

        ctx.font = '30px Georgia';
        ctx.textAlign = 'center';
        ctx.fillStyle = '#F00';
        ctx.fillText('Fin del Juego!', x, y);
        ctx.font = '20px Georgia';
        ctx.fillStyle = '#000';
        ctx.fillText('Presiona R, para reiniciar', x, y + 30);

    }

    function ciclo()
    {
        //limpiar pantalla
        ctx.fillStyle = color_fondo;
        ctx.fillRect(0, 0, 400, 400);

        serpiente.dibujar();
        comida.mostrar();

        serpiente.mover();

        if ( ! es_fin_juego )
            intervalo = setTimeout(ciclo, 1000 / fps);
    }

    function reiniciar()
    {
        es_fin_juego = false;

        //iniciar propiedades
        serpiente.colocar(50, 50);

        comida.colocar();

        //iniciar juego
        ciclo();
    }

    var Direccion = {
        '38': 'arriba',
        '39': 'derecha',
        '40': 'abajo',
        '37': 'izquierda'
    };

    $(document).keydown(function(e){
        var tecla = e.which;

        if ( Direccion[ tecla ] )
            serpiente.cambiarDireccion( Direccion[ tecla ] );

        if ( tecla == 82 )// tecla R
            reiniciar();
    });

    return {
        iniciar_canvas: iniciar_canvas
    };

})();


$(document).ready(Snake.iniciar_canvas);
Espero que le haya servido de ayuda es algo sencillo, pero de apoco se aprende.

El código lo pueden encontrar en Github también Snake-Classico-Tutorial-Fuente

miércoles, 12 de agosto de 2015

Cómo detectar y eliminar malware en tu web





Ya es conocido el uso de los virus, gusano, troyanos y el software espía que pueden dañar un equipo o una red, pero desde hace décadas que lo que se persigue es hackear y atacar páginas webs, así como los servidores, routers,etc..
Entre los últimos ataques están los que residen en comprometer la integridad de tu página web por diferentes motivos. Los 3 casos más comunes son (hay otros ataques más frecuentes como por ejemplo los de tipo DoS o denegación de servicio pero que atacan a un servidor entero, independientemente de las webs o servicios que aloje)
  • Ataques de php injection o de otro tipo para incluir código. Script maliciosos
  • Redirecciones .htaccess
  • Iframes ocultos
Script maliciosos
Éstos códigos se usan a menudo para redireccionar a tus visitantes o lectores a una web diferente y/o cargan malware desde otro código. Son injectados en el contenido de la página web o a veces en otros archivos del servidor, como imágenes o PDFs. Suelen ser código javascript que ejecuta la redirección. Puede ser que están ofuscados para que sea más difícil detectarlo para los scanner anti-virus/malware y para que al programador sea más difícil entenderte que hace el código malware.

A veces los códigos ejecutan archivos .js bajo nombres de dominio que pueden confundir aparentando ser web legítimas.

Redirecciones .htaccess
Hay que tener especial cuidado con este archivo de configuración del servidor de páginas web Apache, sobre todo porque es un archivo oculto.
Los atacantes pueden modificar el archivo o subir uno nuevo, si no se tiene cuidado con los permisos. Con esto conseguirán redireccionar a todos los usuarios que entren en la web a páginas de malware o lo que el atacante haya configurado.

La recomendado es que este archivo tenga permisos 644 para un usuario determinado.
Iframes ocultos
En ocasiones el ataque puede ser injectar un simple código iframe, que no puede resultar complicado llegar a dar con él dentro del todo el código HTML de nuestra web.

Ésto seguirían cargando en nuestra página contenido que no queremos, enlaces perjudiciales para nuestra página,etc..
¿Cómo detectar malware en tu web?
Si tu página ha sido hackeada o crees que puede contener código sospechoso puedes acceder a Webmaster Tool para obtener más información

o comprobando el status de web con la siguiente aplicación de Google http://www.google.com/safebrowsing/diagnostic?site=pedroventura.com poniendo el nombre de dominio que quieras. Los resultados para mi página son los que aparecen en la siguiente captura.

Sigue los consejos que te indican desde WebMaster Tool, pero básicamente tendrás que “limpiar” todo tu site del código malware. Una vez lo hayas hecho notifica a Google de que tu site ha sido limpiado.
Los problemas de mi página, vienen porque mi blog de WordPress fue atacado por una injección de código que redirigía a una página malintencionada causando graves daños al Posicionamiento y visitas en mi blog.
¿Cómo solucionar o eliminar el malware?
En primer lugar, decirte que si tienes un backup lo restaures porque puede ser complicado o minucioso llegar a “limpiar” todos los archivos.
Tendrás que comprobar todos los archivos donde los permisos no estén asignados correctamente, es decir que los pueda editar cualquier usuario y es casi seguro que el código injectado estará en todos ellos.
Busca al inicio o al final de los archivos por código que tu no has creado, cualquier código que te parezca sospechoso quítalo. En códigos basados en PHP suelen incluir una función eval() seguida de una base64_decode() y una cadena super larga de caracteres, que no es más que un código PHP codificado y que genera la creación de los iframes o el javascript que después redirecciona a otras páginas.
Puedes usar comandos de consola para buscar y reemplazar todo el código que hayas encontrado sospechoso.
También puedes leer este tutorial de Google: https://support.google.com/webmasters/bin/answer.py?hl=es&answer=163634
Consejos si tienes WordPress u otro Open Source
  • Tienes que tener en cuenta si estás usando WordPress, Joomla, Drupal, o cualquier otro Open Source, el código es abierto, tanto para los programadores que colaboran para mejorar la herramiento creando nuevos plugins y temas, así como para los hackers u otra gente que sólo quiere joder! hablando mal. Se dedican a hacer exploits, script para atacar archivos php que tengan algún bug de seguridad, atacar a los servidores de Wordpres, etc.. por lo que siempre nuestro código va a ser vulnerable, es muy importante de que siempre esté actualizado a la última versión.
  • No uses tantos plugins. Sólo instala y mantén los que vayas a usar y que también estén actualizados.
  • Cuida tu contraseña de acceso, actualizala de vez en cuando. 
Otros enlaces de interés:

Tags de búsquedas:
malware,como eliminar facebook hack tools de mi pc,pongo una web y sale otra malware,ok permiteme Eliminar mi pagina,eliminar virus facebook hack tools,imagenes de malware,detectar codigo malicioso en mi web,cómo quitar el código malware de pagina,como eliminar el facebook hack tools,Que antivirus puedo instalarle a una web para que no sea hackeada,joomla hackeado limpiar el malware,detectar inyeccion codigo joomla 2 5,Indica que es un vinculo y como detectarlo en una pagina web,como detectar scripts maliciosos,desinfectar pagina web

viernes, 7 de agosto de 2015

Comprobar si hay enlaces rotos en tu página Web

Los enlaces rotos son uno de los puntos que primero deberíamos tener en cuenta a la hora de optimizar un sitio para elposicionamiento en buscadores. Un enlace roto dificulta a los buscadores la indexación de la página, le dice al buscador que algo anda mal, que tiene poco mantenimiento o que no se actualiza. Tampoco deja muy buena impreisón a los usuarios. Es decir, los enlaces rotos perjudican nuestro posicionamiento web.
Por este motivo es imprescindible comprobar periódicamente todos los enlaces rotos de nuestra web. Existen multitud de herramientas para la comprobación de enlaces rotos, tanto herramientas online como pequeños programas para descargar. Algunos de los más interesantes son:
Herramientas online para comprobar enlaces rotos
  • W3C Link Checker – Probablemente el primer recurso que deberíamos utilizar. Además de comprobar si los enlaces están rotos nos recomienda, primero, validar nuestro código HTML. Nos indica el tipo de error y una posible solución para cada URL del sitio. También es muy útil que ponga el enlace directo de la página en donde está el error y la línea de código donde aparece.
  • Broken Link Checker – Otra herramienta más de las muchas que existen.
  • La Webera – Para revisar los enlaces rotos de cada página de tu web.
Software para comprobar enlaces rotos
  • Xenu – Pequeño programa de descarga libre que hace una lista de los enlaces que ha encontrado en tu web y marca en rojo los conflictivos. Se hecha de menos la URL directa a la página del enlace roto. Al acabar hace un informa que puedes guardar. Seguramente el programa más utilizado para comprobar enlaces rotos.
  • LinkChecker – Software open source con licencia GPL. Te da la opción de filtrar determinadas URL, añadir URL con clave de acceso, robots.txt… además de organizar los mensajes por colores y con una interfaz clara.
Seguro que hay muchas más herramientas para comprobar enlaces rotosinteresantes. Si tienes una web grande puede tardar su tiempo. Es recomendable que, por lo menos una vez al mes, hagas una comprobación y arregles el desastre. Es impresionante la cantidad de URL que vas a encontrar en mal estado por mucho cuidado que tengas.

Generar URLs amigables con htacces

Las URLs amigables son más fáciles de usar y de recordar por los usuarios y también son mejores para el posicionamiento en buscadores. Además describen mucho mejor los enlaces dentro de una página web y añade un mayor nivel de profesionalidad a nuestras webs.
De todas formas, cuando hemos creado una página dinámica en PHP lo normal es que tengamos URL no amigables. ¿Cómo las convertimos en amigables de manera automática? Una manera de hacerlo es con un archivo.htaccess y gracias a Apache y su mod_rewrite.
mod_rewrite es un módulo de Apache que permite manipular en el servidor las URLs solicitadas. Es decir, cuando llega al servidor la solicitud de una URL, esta se comprueba con respecto a una serie de reglas creadas con Expresiones Regulares creadas para detectar un patrón determinado. Si se encuentra ese patrón en el URL y se cumple la condición impuesta por la Expresión Regular se sustituye el patrón por una cadena de texto o por una acción determinada.
En el ejemplo que vamos a ilustrar vamos a tener una lista de usuarios con link a su perfil usando urls amigables.
Como urls no amigables tendremos:
http://www.yourdomain.com/users.php?id=1
Y como url amigable entenderíamos:

http://www.yourdomain.com/juan
Para conseguir este efecto, necesitaremos crear un archivo .htaccess y añadir el siguiente código:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.yourdomain.com
RewriteRule (.*) http://yourdomain.com/$1 [R=301,L]

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ users.php?user=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ users.php?user=$1

Y modificar los links hacia los perfiles de los usuarios añadiendo la url amigable en vez de la no amigable.

jueves, 6 de agosto de 2015

Crear manualmente un archivo robots.txt


Reglas para hacer manualmente un robots.txt, para que Google y otros buscadores indexen correctamente lo que publicamos y mejorar nuestro posicionamiento. Ventajas y beneficios de usarlo. User-agent de los distintos buscadores y reglas que podemos emplear. Ejemplos prácticos para descargar.
Cada sitio web debe tener un archivo robot.txt, ya sea si sirve paginas estáticas o dinámicas. Debe tenerlo cualquier sitio creado en WordPress o cualquier otra plataforma.

¿En que se usa el archivo robots.txt?

El archivo robots.txt es creado para los bots o arañas de los buscadores. De existir es lo primero que revisan al entrar en cualquier sitio. Indica la estructura del sitio, la ubicación del sitemap.xml y las páginas y directorios que no se deben revisar. No es obligatorio tener uno, solo es necesario si necesitamos restringir contenido de nuestro sitio a los robots de los buscadores. En él especificamos los archivos o directorios que no deben ser rastreados. No obstante puede ser muy importante por varias razones y está demostrado que usar correctamente un archivo robot.txt, contribuye a que mejore nuestro posicionamiento.

¿Para qué usar el archivo robot.txt?

Los principales motivos por los que necesitamos usar un robots.txt en nuestro sitio son los siguientes:
1- Mejorar el ranking del sitio aclarando y facilitándoles a los bots cuáles son los directorios que pueden ser indexados. 1- Impedir el consumo de banda innecesario rastreando archivos auxiliares del sitio. 3- Impedir que se indexen archivos personales o con contenido privado. Pueden ser documentos, imágenes, fotos u otros archivos que no deseamos que aparezcan accidentalmente en los resultados de las búsquedas. 4- Impedir que seamos perjudicados por los buscadores al indexar contenido duplicado (principalmente en WordPress). En WordPress se generan de forma automática muchas páginas que tienen el mismo contenido, como son las páginas de categorías.

Como crear manualmente un archivo robots.txt para un sitio web

Hay varios servicios de internet que permiten crear un archivo robots.txt. No obstante al ser tan fácil y elemental su creación, podemos hacerlo nosotros mismos manualmente y de esa forma evitar cualquiera equivocación que pueda ser funesta para el posicionamiento de nuestro sitio. Más adelante sí podemos comprobarlo en la web. Un archivo robots.txt es un sencillo archivo de texto plano que se puede crear con el Blog de notas o cualquier otro editor de texto. Solo crea en el escritorio un nuevo archivo de texto y renómbralo a: robots.txt (sin mayúsculas) Puede tener varias líneas, pero usa solo tres reglas:
User-agent: - Se indica que lo que va a continuación va dirigido a un robot en particular o a todos.
Disallow: - La dirección URL de una carpeta o archivo que necesitamos bloquear.
Allow: - La dirección URL de una carpeta o archivo que permitimos su rastreo, aunque se encuentre en el interior de un directorio bloqueado.
Se pueden incluir varias líneas Disallow y varios User-agents en un mismo archivo. Solo sigue las siguientes reglas:
- Para bloquear una carpeta y todo su contenido, inserta una barra inclinada después del nombre del mismo. - Para bloquear una página específica, insértala después de la línea Disallow. - Antes de cada User-agent nuevo deja una línea en blanco. - Entre las distintas reglas (Disallow) no debe existir ninguna línea en blanco.

Ejemplo 1

En este caso la directiva va dirigida a todos los robots y se indica que la carpeta de nombre archivos1 y todo su contenido no se debe rastrear.
User-agent: * Disallow: /archivos1/

Ejemplo 2

En este ejemplo el robot de Google no podrá rastrear el contenido de la carpeta "ventas", ni la página "servicios.html" donde anunciamos y vendemos productos de afiliados.
Google usa varios robots:
User-Agent: Googlebot Disallow: /ventas/
 Disallow: servicios.html

➔ Googlebot, rastrea páginas y contenido web.
➔ Googlebot-Image, rastrea imágenes y fotos para Imágenes de Google.
➔ Googlebot-Mobile, contenido para dispositivos móviles.
➔ Mediapartners-Google, es el robot del servicio de AdSense.

Ejemplo 3

De esta forma se impide que se indexen fotografías personales que están en la carpeta "fotos".
User-agent: Googlebot-Image
Disallow: /fotos/

Ejemplo 4

De esta forma se excluyen todos los archivos PDF, donde quiera que se encuentren.
User-agent: *
Disallow: /*.pdf$

Consejos al crear un robots.txt

1- Si usas el servicio de Google AdSense debes permitir el rastreo completo a su robot, comienza el archivo con las siguientes líneas:
2- Si usas diseño adaptable en tu sitio no debes bloquear el acceso al directorio que contiene los archivos de estilo CSS.
3- Siempre ten en cuenta que los robots de los buscadores son sensibles a las mayúsculas y minúsculas.
4- Al final del archivo robots.txt se debe indicar la dirección del archivo sitemap.xml del sitio o de los archivos si son varios.

Como probar el archivo robots.txt creado

Antes de subir el archivo creado al servidor puedes probar su contenido y estructura. Si tu objetivo es Google puedes probar el archivo usando la Herramientas para Webmasters de Google. Haz lo siguiente: • En la barra a la izquierda escoge Rastreo -> URL bloqueadas. • En el cuadro de Análisis de robots.txt pega el contenido del archivo creado. • En el inferior introduce la dirección URL de tu sitio. • Presiona el botón "Probar".

Puedes también emplear la opción de probar con robots o User-agents diferentes de Google. Si no se detectan errores ya puedes subir el archivo a tu servidor.

¿Dónde situar el archivo robots.txt?

El archivo robots.txt debe estar situado en la raíz del servidor web, allí será donde lo busquen los bots. Si se sitúa en otra ubicación no tiene efecto alguno. La carpeta raíz de un servidor se nombra: htdocs o public_html, dependiendo del sistema operativo del servidor. Finalmente la dirección URL del archivo creado debe tener el siguiente formato: http://sitio-web/robots.txt Introdúcela en un navegador y comprueba si se puede acceder correctamente.
Herramienta online para probar un archivo robots.txt Puedes también probar un archivo robots.txt online usando la siguiente herramienta, solo necesitas en el formulario indicar la dirección URL del archivo. Se indica cualquier error existente y se muestran advertencias. Robots.txt Checker

Crear un archivo robots.txt para WordPress

WordPress recomienda crear un archivo robots.txt que tenga la siguiente estructura:
User-agent: *
Disallow: /cgi-bin/
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/plugins/
Disallow: /wp-content/cache/
Disallow: /wp-content/themes/
Disallow: /trackback/
Disallow: /feed/
Disallow: /comments/
Disallow: /category/*/*
Disallow: */trackback/
Disallow: */feed/
Disallow: */comments/
Disallow: /*?
Allow: /wp-content/uploads/
Como se puede comprobar de esa forma se excluyen muchos directorios con archivos del servidor que no es necesario indexar y muchos archivos como las páginas de categorías, que se pueden considerar como contenido duplicado y afectar nuestro posicionamiento. La última línea se usa para que las imágenes puedan ser indexadas correctamente y se muestren en las consultas de las búsquedas. Si en tu caso no lo deseas, solo elimínala.

Otras formas de bloquear páginas o archivos en un sitio web

La cabecera HTTP "X-Robots-Tag" resulta especialmente útil para limitar la indexación de archivos que no sean HTML, como archivos gráficos y otro tipo de documentos. Se puede usar en los sitios que usan Apache incluyendo la directiva en un archivo .htaccess que puede situarse en la raíz del sitio o en un directorio. De esa forma se puede aplicar de forma global el atributo NoFollow a un grupo de páginas o a todo un sitio. Lee como hacerlo: Bloquear páginas o archivos en un sitio web con el .htaccess Lee más información avanzada en Google de otras reglas que se pueden emplear en el archivo robots.txt: Cómo bloquear o eliminar páginas con un archivo robots.txt

miércoles, 5 de agosto de 2015

Especificar la expiración de imágenes en caché

Desde que Google incluyó en su algoritmo la velocidad de carga de la web, activar la caché del navegador sirve para mejorar la velocidad de carga, sobre todo si tus visitantes son recurrentes y, en todo caso, el posicionamiento de tu web.

La caché de imágenes del navegador sirve, como vimos anteriormente, para mejorar el rendimiento de las páginas web, reduciendo el tiempo de carga, el ancho de banda y los costes de alojamiento.

En servidores Apache es muy fácil determinar el tiempo que los archivos deben permanecer en la caché. Tienes que editar el archivo .htaccess del directorio de imágenes y añadir el siguiente código:

<ifmodule mod_expires.c>
 <filesmatch "\.(jpg|JPG|gif|GIF|png|css|ico)$">
 ExpiresActive on
 ExpiresDefault "access plus 7 day"
 </filesmatch>
 </ifmodule>

Este código indica que los archivos de imagen y los archivos css deben caducar a los 7 días. Como las imágenes que utilizamos en el diseño de un sitio web no se cambian a menudo, podemos usar un vencimiento de 30 días o más.

Copyright © CodeLab