Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas

OWASP ESAPI PHP: Autentificación y control de sesiones

En esta última entrega vamos a ver como gestionar la autentificación de usuarios y las sesiones. Empecemos por enumerar las características que vamos a implementar en nuestra clase User:

  • Mejorar la gestión de sesiones
  • Implementar tokens CSRF
  • Generar hashes de las claves
  • Leer propiedades de los objetos desde la base de datos
  • Limitar el tiempo de las sesiones (expire time)
  • Establecer qué guardamos en las variables de sesión


OWASP ESAPI PHP: Accesos a la base de datos

En esta entrega vamos a tratar cómo defendernos de ataques SQL injection. Hay varias maneras de intentar protegerse ante ataques de este tipo, una de ellas es con el Encoder de ESAPI, pero si vemos la documentación encontraremos la siguiente advertencia:

No se recomienda este método. La aproximación adecuada es usar la interface PreparedStatement. Si, por alguna razón, su uso no es posible, entonces este método es una solución menos mala.

Así pues vamos a olvidarnos temporalmente de ESAPI para centrarnos en los PreparedStatement (parte de la librería mysqli de PHP). Su uso nos permite separar totalmente los datos de las sentencias SQL con lo que las consultas se vuelven mucho más seguras. Su implementación no es nada difícil, sólo requiere pensar de manera ligeramente distinta.

OWASP ESAPI PHP: Asegurando las entradas

Si probamos la aplicación desarrollada en la entrada anterior observamos que es vulnerable a un simple ataque SQL Injection como "1' AND 1='1" para logearnos o XSS como "<script>javascript:alert(1);</script>" tanto en los posts como en los comentarios. En esta entrega vamos pues a esterilizar (sanitize) las entradas del usuario.

Usaremos las clases de referencia de ESAPI (/src/reference) siempre que podamos ya que son sencillas implementaciones de las interfaces definidas en /src y suficientes para nuestros propósitos con pequeños cambios. Empezamos modificando ligeramente la clase  DefaultSecurityConfiguration ( /src/reference/DefaultSecurityConfiguration.php) para arreglar un pequeño bug que el equipo de OWASP no ha considerado necesario arreglar desde que se escribió el artículo original. Abrimos el archivo y ejecutamos un buscar + sustituir cambiando todos los $this->logSpecial por $this->_logSpecial. La función _logSpecial imprime un mensaje de error en pantalla y nos interesa que lo haga en un log así que la cambiamos por:
private function _logSpecial($msg)
{
     ESAPI::getAuditor('DefaultSecurityConfiguration')->warning(Auditor::SECURITY, false, $msg);
}

OWASP ESAPI PHP: Introducción

Hace tiempo estuve trasteando con la librería de seguridad OWASP ESAPI para PHP pero lo dejé por falta de tiempo y por la dificultad que tuve en encontrar información para usarla. Retomo ahora el tema adaptando un artículo elaborado en 2010 por Jack Kowalsky en el que hace una introducción al uso de la librería. He actualizado el código original a PHP 5.4.3.
OWASP ESAPI (Enterprise Security API) es una librería de seguridad implementada en varios formatos para desarrollar aplicaciones de bajo riesgo con la que se dispone de varios módulos que podemos utilizar y/o modificar adaptándolos a nuestras necesidades. Aparte de para PHP, existen versiones para Java (quizás la más documentada), .NET, ASP, Codlfusion, Python y Javascript.

Asegurar un File Upload comprobando la firma de los archivos

Tenemos un simple formulario para elegir un fichero y subirlo al servidor y una pequeña rutina en PHP para verificar que el fichero es del tipo correcto (una imagen gif, jpeg o png) comprobando el Content-type enviado en la cabecera:

<?php
$valid_mime_types = array(
 "image/gif",
 "image/png",
 "image/jpeg",
 "image/pjpeg",
);

if(isset($_POST['upload']))
{
 $destination = 'uploads/' . $_FILES['userfile']['name'];
 if (in_array($_FILES['userfile']['type'], $valid_mime_types))
    {
  move_uploaded_file($_FILES['userfile']['tmp_name'], $destination);
  echo "<div>Upload succesful: <a href='$destination'>here</a><a href=\"\">×</a></div>";
    }
 else
 {
  echo "<div>>Upload failed.<a href=\"\">×</a></div>";
 }
}
?>

<form enctype="multipart/form-data" action="index.php" method="POST">
<fieldset>
 <legend>Upload</legend>
 <input name="userfile" class="small button" type="file" />
 <input type="submit" class="small button" name="upload" id="upload" value="Upload" />
</fieldset>
</form>

Una sencilla protección antiXSS para PHP

Buscando por la red un esquema simple de protección contra ataques XSS encontré PHP Input Filter que ofrece lo justo para impedir este tipo de ataques: un filtrado de los campos que nos interesen sin más complicaciones. Para los que tengan curiosidad, el ataque Cross Site Scripting (XSS) consiste en tratar de inyectar código ejecutable en una página web, normalmente Javascript, con lo que se puede lograr acceso a una base de datos o redirigir al usuario. Veamos un ejemplo, un sencillo formulario para autentificación:

Generador de formularios HTML en PHP

He desarrollado un par de clases en PHP para generar formularios HTML automáticamente suministrando los campos con los que vamos a trabajar (htmlForms) o a partir de una tabla MySQL (htmlFormsDB). Las características principales son:
  • Visualización de formularios en vertical u horizontal
  • Con o sin títulos
  • Multilínea (para gestionar varias filas de datos)
  • Formateo automático de campos de fecha y hora
  • Gestión de la longitud de cada campo según el tipo de dato (no de la longitud del componente visible)
  • Reordenación de campos para visualizar
  • Generación automática de hoja de estilo CSS
  • Facilidad para añadir eventos
  • Posibilidad de enviar directivas SQL a la base de datos

Detectar navegación desde dispositivo móvil con PHP

La tarea de detectar las características del dispositivo desde el que un usuario accede a nuestra web puede ser un gran quebradero de cabeza. Una sencilla función en PHP que se limite simplemente a detectar si el usuario está usando un dispositivo móvil podría ser

function detectmov() { 
 if( navigator.userAgent.match(/Android/i)
 || navigator.userAgent.match(/webOS/i)
 || navigator.userAgent.match(/iPhone/i)
 || navigator.userAgent.match(/iPad/i)
 || navigator.userAgent.match(/iPod/i)
 || navigator.userAgent.match(/BlackBerry/i)
 || navigator.userAgent.match(/Windows Phone/i)
 ){
    return true;
  }
 else {
    return false;
  }
}