• 10 consejos de seguridad que debes conocer antes de crear una web desde 0

    10 consejos de seguridad que debes conocer antes de crear una web desde 0
    Crear un sitio web desde cero es cosa difícil, y más por el tema de la seguridad. En este articulo mostraré los errores más comunes que solemos cometer al realizar una página web y mi consejo para no caer en ello; aunque claro, siempre habrá alguien mejor que igual encontrará un error, la finalidad de este post es saber corregir al menos la mayoría de ellos…y por supuesto, es una pequeña guía de experiencias que he tenido, para principiantes. Cualquier usuario con conocimiento intermedio en desarrollo de sitios web no cometería estos errores..


    Para los ejemplos usaré PDO, aunque la idea en si es la misma aún si usa MySQLi u otro.

    1. Uso incorrecto de las variables dentro de la consulta

    Un grave error, y la causa de muchas inyecciones SQL es el uso incorrecto de las variables al momento de enviar la consulta.
    //Uso incorrecto
    $variable = $_GET['valor'];
    $sql = $conn->prepare('INSERT INTO "tabla" ("columna") VALUES ('.$variable.')');
    $sql->execute();
    //Uso correcto
    $variable = $_GET['valor'];
    $sql = $conn->prepare('INSERT INTO "tabla" ("columna") VALUES (:variable)');
    $sql->execute(array(':variable' => $variable));

    2. No filtrar los registros

    Un error al registrar información mediante MySQL es permitir cualquier nombre de usuario o dato, y mostrarlo sin verificarlo previamente.
    //Se registra un usuario, y se registra bajo un nombre con XSS incluido (del lado del servidor, el usuario obviamente verá un formulario de registro bien colorido y bonito).
    $sql = $conn->prepare('INSERT INTO "usuarios" ("nombre") VALUES ("Desarrollo Geek<script>alert('XSS!!')</script>")');
    $sql->execute();

    Después, cuando obtengamos el usuario nuevamente con MySQL también se cargará el script XSS.
    //Usuario de ejemplo
    $usuario = 1;
    //Consulta
    $sql = $conn->prepare("SELECT * FROM `usuarios` WHERE `id` LIKE :usuario ORDER BY `id` DESC");
    $sql->bindParam(':usuario_id', $usuario_id, PDO::PARAM_INT);
    $sql->execute();
    //Mostramos el usuario, aunque el while sale sobrando ya que sólo es un usuario, igual lo incluiré.
    while ($datos = $sql->fetch(PDO::FETCH_ASSOC)) {
    //forma incorrecta
    echo $datos['nombre']; //mostrará Desarrollo Geek<script>alert('XSS!!')</script>
    //forma correcta
    echo htmlspecialchars($datos['nombre']); //mostrará lo mismo, pero como texto, sin ejecutar el script.
    }

    ¿Qué pasará entonces? pues, se mostrará el nombre como se tenía planeado, pero con un script de JavaScript incluido; yo agregué una alerta, alguien más podría incluso redirigir la web a otro sitio, a un pishing, hacerse publicidad, etc. Lo ideal es al momento de realizar el registro, permitir únicamente letras (y quizá números), con un limite de letras para evitar nombres excesivamente largos, etc (con JavaScript y también con PHP).

    3. Encriptar datos sensibles de los usuarios con un algoritmo anticuado

    Los datos sensibles de los usuarios, como la contraseña son cosas que no deben encriptarse usando un algoritmo sencillo…incluso si se le añade un salt, sigue siendo inseguro.
    ¿Por qué? simple, si la web llega a ser hackeada, tus usuarios estarán en peligro…hoy en día cualquiera puede desencriptar sha1 o md5, por lo que se ha vuelvo poco seguro usarlos para encriptar datos sensibles.
    Lo que yo recomiendo es usar password_hash() de PHP.
    echo password_hash('contraseña', PASSWORD_DEFAULT); //retorna la contraseña encriptada, con un salt aleatorio.
    De este modo, cada usuario tendría un salt diferente, y no se podrían obtener las contraseñas, o al menos, no fácilmente. Llevaría tiempo obtener la contraseña de un solo usuario, si es que llegan a lograrlo.

    4. Usar códigos obsoletos

    El flojo trabaja doble es una frase muy común, y a veces, muy acertada…¿para qué programar algo que alguien más ya hizo? es lógica básica, sin embargo, el problema está cuando usamos algo que se hizo en el año 2009 cuyo código se ha vuelto obsoleto y por ende, riesgoso de usar.

    5. Usar Cookies para almacenar datos sensibles

    Vamos, que a simple vista cualquiera pensaría que no hay nadie que llegara tan lejos como para hacerlo, sin embargo, el mundo jamás deja de sorprendernos y los hay. Almacenar información de carácter sensible en una cookie (que cualquiera que use document.cookie puede ver) es un fallo terrible en cuanto a seguridad.

    6. Los permisos

    Y sí, nuestro sitio web está almacenado "en un ordenador" con Linux (comúnmente). Un problema muy serio a la hora de crear un sitio web, es dar permisos de modificación a cualquier usuario….por ejemplo, el archivo donde se encuentra la información relacionada a la basa de datos.

    7. Archivos…

    Si por ejemplo, estamos creando un sito que permite subir archivos….debemos pensar en lo siguiente.

    ¿Qué tipo de archivos voy a permitir?

    Cualquier persona ventajosa tratará sin dudarlo de subir un archivo php y hacerse con web….o un archivo .html sólo para bromear un rato. Por ende, debemos elegir cuidadosamente el tipo de archivos que permitiremos.

    Tamaño de archivo

    Si tenemos un sitio que permite subir imágenes, sería muy raro que una imagen pesara 3 GB. Aunque esto, más que problema de seguridad, es algo en qué pensar….lo mismo con un tamaño anormalmente pequeño.

    8. Datos AJAX

    Los datos que se envían por medio de llamadas AJAX pueden llegar a ser un gran problema. Supongamos que, por medio de AJAX cambiamos la contraseña de un usuario utilizando su ID, pero no establecemos bien las condiciones que se deben cumplir….puede llegar cualquier persona con conocimiento, copiar la llamada AJAX y cambiar el ID por el del usuario que el quiera….por ende, vuelvo a repetir: hay que poner condiciones para que algo así, no pase.

    9. Navegación por directorios

    La navegación por los directorios, puede darle una idea a un atacante sobre cómo funciona tu sitio, cualquiera que navegue en tu sitio y vea el archivo "basededatos.php" sabrá que ahí no está nada relacionado a la base de datos, por supuesto. Por ende, bloquear la navegación en directorios con contenido sensible es esencial….quizá en lugares donde haya imágenes no habría problema, más, no hay que dejar todo libre.

    10. Lo relacionado a la base de datos..

    Yo no confiaría en la seguridad de un sitio que usara un código como el siguiente.
    mysql_query("SELECT * FROM agenda WHERE nombre LIKE '%$buscar%' ORDER BY". $orden);
    No es que sea malo, sin embargo, no es la mejor opción en pleno 2016….lo mejor es optar por algo más seguro, como PDO o MySQLi.

    11. No seguirnos en Facebook y Twitter

    Y sí, el mayor error que pueden cometer es no seguirnos en nuestras redes sociales…así que ¿qué esperas?