Categories
PHP PostgreSQL Software Libre Web

Hosting para PostgreSQL

Nota 1: Esta entrada en realidad no es patrocinada, pero por el contenido parece que si :D.

Los creadores de GNUPanel,

...un panel de control para servidores de hosting desarrollado en PHP y PostgreSQL, el cual provee tres interfaces web con acceso SSL a nivel de usuario, revendedor y administrador desde las cuales se puede agregar direcciones de correo, cuentas FTP, proteger directorios, redirigir subdominios, etc.

Han puesto un nuevo servicio de hosting GNUtransfer basado completamente en software libre, que a su vez hace uso del panel de control antes mencionado.

Si alguien anda buscando una alternativa más para las empresas que ofrecen PostgreSQL en sus planes de hosting, habrá que tenerlos en cuenta...

Nota 2: No he probado el servicio lo suficiente como para poner mi mano al fuego por ellos :).

Categories
PHP Quiz Seguridad

Ejercicio de la Semana: Login de usuarios y actualización de datos

A partir de ahora, cada semana haré el intento de poner los quiz los días lunes o martes, así tendremos más tiempo para comentar estos pequeños ejercicios.

Esta vez, se trata de dos páginas: la primera que se encarga de realizar el login de los usuarios y la segunda se encarga de mostrar y actualizar el perfil del usuario que accede a la página.

php:

<?php
session_start();

/*
 session.php:
  Se encarga de validar los datos del usuario y
  que exista una sesión válida para acceder a user.php
*/

include_once './config.php';
include_once './db.php';

if ( !empty($_REQUEST['action']) ) {
        switch ($_REQUEST['action']) {
                case 'login':
                        if ( !empty($_SESSION['user']) ) {
                                header('Location: http://sitio/user.php');
                                exit();
                        }
                       
                        $username = $db->escape($_POST['user']);
                        $pass = md5($secret_key . $_POST['password']);
                       
                        if ( $user = $db->get_row("SELECT * FROM users WHERE user='$username' AND password='$pass'") ) {
                                session_regenerate_id();
                                $_SESSION['user'] = $user;
                                header('Location: http://sitio/user.php');
                                exit();
                        }
                        die('Usuario no válido');
                case 'logout':
                        // ...
        }
}

?>

php:

<?php
/*
 user.php:
   Se encarga de mostrar y actualizar el perfil de un usuario
*/

include_once './session.php';

if ( empty($_SESSION['user']) ) {
        header('Location: http://sitio/session.php');
        exit();
}

if ( !empty($_REQUEST['action']) ) {
        switch ($_REQUEST['action']) {
                case 'update-profile':
                       
                        // Limpiar los datos
                        $_POST['name'] = htmlspecialchars(strip_tags($_POST['name']), ENT_QUOTES, 'utf-8');
                        $_POST['email'] = preg_replace('/[^a-z0-9.@-]/i', '', $_POST['email']);   

                        // Escapar los valores
                        $user = $db->escape($_SESSION['user']->user);
                        $name = $db->escape($_POST['name']);
                        $email = $db->escape($_POST['email']);
                        $password = md5($secret_key . $_POST['password']);
                       
                        $sql = "UPDATE users SET name = '%s', email = '%s', password = '%s' WHERE user = '%s'";
                       
                        $db->query(sprintf($sql, $name, $email, $password, $user));
                       
                        break;
                case 'recover-password':
                        // ...
        }
}

?>

¿Existe algún bug en el código mostrado?

Actualización:

  1. Cambio de $_POST['user'] por $_SESSION['user']->user en user.php
  2. Cambio de ubicación de la comprobación de la variable user en la sesión

¿Todavía queda algún problema de seguridad?

Categories
.NET ASP.NET PHP Seguridad XSS

Problema con los filtros genéricos

Hoy, acabo de encontrar en un foro la siguiente porción de código, que según su autor protege de ataques SQL Injection y XSS:

php:

# Función para evitar ataques SQL injection y XSS
function limpiar_sql($value){
    $value = trim(htmlentities($value)); // Evita introducción código HTML
    if (get_magic_quotes_gpc()) $value = stripslashes($value);
    $value = mysql_real_escape_string($value);
    return $value;
}

El problema con este tipo de funciones es que dan una falsa sensación de seguridad si éstas no son aplicadas en el lugar correcto, por ejemplo si intentamos usar esa función para el siguiente ejemplo:

php:

$url = limpiar_sql($_POST['url']);
// Guardar el valor...

// Mostrar la url
echo '<a href="' . $url . '">enlace</a>";

Veremos que la porción de código mostrada es vulnerable a XSS si el valor de url contiene algo como javascript:alert(document.cookie).

Si recordamos una entrada anterior, el bug en asp.net que permite realizar ataques XSS tiene un problema similar (uso de HttpUtility.HtmlEncode en lugar de HttpUtility.UrlEncode).

Como reflexión final, si queremos hacer uso de este tipo de funciones para validar/filtrar todos nuestros datos, debemos saber realmente que estamos haciendo.

Categories
PHP Utilidades WordPress

Plugin para eliminar partes del contenido de una entrada en los feeds

Preparé un pequeño plugin que elimina partes del contenido de una entrada en los feeds. Esta característica es útil cuando WordPress está configurado para mostrar las entradas completas y por alguna extraña razón se necesita ocultar parte del contenido a los lectores que siguen el blog a través de RSS o Atom.

Categories
Google PHP Recursos Seguridad

Stupid Google tricks

El título, es el nombre del tema que expuso Jose Nazario en UMEET 2006, trata sobre el uso de Google Code Search para encontrar las vulnerabilidades -típicas- en el código de aplicaciones que hayan sido indexadas por este buscador.

Pueden ver su presentación o las diapositivas en: