Daniel Segovia

Blog personal

Archive for febrero, 2012

Trabajar con sesiones

Hacer un comentario

Cómo hemos explicado anteriormente las sesiones nos guardarán información mientras pasemos de una página a la otra.

Las sesiones en PHP trabajan con un array llamando $_SESSION y cada key que generemos serán el contenedor de la información que deseemos guardar.
session_start() creará una nueva sesión o reanudará la sesión que ya fue creada. Esta función envía varias cabeceras HTTP por eso es importante que sea llamada antes de imprimir algún carácter en el navegador.

Nota: La configuración de PHP posee session.auto_start, por defecto en 0, por ende, deshabilitado. Sí es habilitado no se requerirá inicializar las sesiones con session_start()

Veamos un ejemplo, en el que con sesiones contaremos la cantidad de páginas que va visitando el usuario.

<?php
//header.php
session_start();
 
if(isset($_SESSION['contador'])){
    $_SESSION['contador']++;
}else{
    $_SESSION['contador'] = 1;
}
?>
<html>
<head>
    <title>Contador</title>
</head>
<body>
<div id="header"><a href="1.php">1</a> - <a href="2.php">2</a> - <a href="3.php">3</a></div>
<div id="contenido">
<?php
//footer.php
?>
</div><!--fin de div id contenido-->
<div id="footer">Usted ha visitado <?=$_SESSION['contador'];?></div>
</body>
</html>
<?php
//1,php
require_once 'header.php';
?>
Usted esta en la p&aacute;gina 1.php
<?php
require_once 'footer.php';
?>
<?php
//2.php
require_once 'header.php';
?>
Ahora estamos en 2.php
<?php
require_once 'footer.php';
?>
<?php
//3.php
require_once 'header.php';
?>
Esta es la &uacute;ltima 3.php
<?php
require_once 'footer.php';
?>

Written by Daniel Segovia

febrero 28th, 2012 at 5:27 pm

Introducción a sesiones

Hacer un comentario

Es habitual trabajar con sesiones en desarrollos PHP. El objetivo de las sesiones es almacenar información a través de los diferentes archivos mientras dure la navegación del usuario. Es decir, el usuario puede estar visitando las diferentes secciones de nuestra aplicación y nosotros podemos guardar determinados datos que creamos convenientes.

Cuando un usuario ingresa a nuestra aplicación una sesión única es generada, ésta será exclusiva de él y durará el tiempo que él este en nuestro sitio. Cualquier información puede ser almacenada en ellas, datos del usuario, páginas que visite o algunas preferencias que seleccione.

PHP posee un conjunto de sencillas funciones para trabajar con las sesiones que veremos a continuación en este capítulo.

Written by Daniel Segovia

febrero 28th, 2012 at 4:12 pm

Posted in 7.4 Sesiones

Tagged with , ,

Seguridad en aplicaciones Web

Hacer un comentario

Es verdad que un porcentaje muy alto de los usuarios que usen nuestras aplicaciones seguirán los pasos que nosotros pretendemos que hagan.
Luego tendremos un grupo reducido de usuarios que por medio de algún error hagan que la aplicación no se comporte como nosotros deseamos.
Por último tendremos un grupo de usuarios malintencionados que busquen errores en nuestra aplicación con fines varios, pueden buscar robar información, el hecho romper simplemente por maldad, instalar algo en el servidor donde corre nuestra aplicación o cualquier otro fin.
Sin importar que grupo de usuarios está accediendo a nuestra aplicación debemos tener un sistema seguro.
Existen muchos niveles que puede ser blanco de ataque, así que desde el lado que nos compete debemos tomar todos los recaudos para que su funcionamiento sea óptimo y seguro.

Como primera medida es fundamental no creerle al usuario, nosotros pretendemos que el usuario nos envíe un número y él nos termina enviando una cadena de texto, por error, negligencia o mal intención. Para evitarlo validaremos que lo que recibimos es lo que pretendemos recibir.

En el ejemplo anterior lo que se envía por el formulario ingresa directamente en la base de datos, ahora nosotros sabemos que queremos que llegue, entonces haremos un cast, esto significa forzar a que el dato se convierta en el tipo de dato que deseamos.

PHP ofrece estas posibilidades para forzar los tipos de datos.

  • (int), (integer) – forzado a integer
  • (bool), (boolean) – forzado a boolean
  • (float), (double), (real) – forzado a float
  • (string) – forzado a string
  • (array) – forzado a array
  • (object) – forzado a object
  • (unset) – forzado a NULL (PHP 5)

Le agregamos algunos campos al formulario para trabajar con más tipos de datos.

<html>
<head>
    <title>Registrarse</title>
</head>
<body>
<h1>Registraci&oacute;n</h1>
<form method="post" action="registrarse.php">
    <table width="400">
        <tr>
            <td width="150"><label>Nombre:</label></td>
            <td width="250"><input type="text" name="nombre" /></td>
        </tr>
        <tr>
            <td><label>Email:</label></td>
            <td><input type="text" name="email" /></td>
        </tr>
        <tr>
            <td><label>Edad:</label></td>
            <td><input type="text" name="edad" /></td>
        </tr>
        <tr>
            <td><label>Colores:</label></td>
            <td>
                Rojo - <input type="checkbox" name="colores[]" value="Rojo" /> <br />
                Celeste - <input type="checkbox" name="colores[]" value="Celeste" /> <br />
                Blanco - <input type="checkbox" name="colores[]" value="Blanco" /> <br />
                Negro - <input type="checkbox" name="colores[]" value="Negro" /> <br />
            </td>
        </tr>
        <tr>
            <td><label>Contrase&ntilde;a:</label></td>
            <td><input type="password" name="contrasena"/></td>
        </tr>
        <tr>
            <td colspan="2" align="right"><input type="submit" name="registrarse" value="Registrarse"/></td>
        </tr>
    </table>
</form>
</body>
</html>

Y aquí el procesamiento de lo que viene por el formulario tomando los recaudos de los que estamos hablando.

<?php
$mysqli = new mysqli("localhost", "usuario", "password", "nombre_base");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "INSERT INTO usuarios (nombre,email,edad,colores,contrasena) VALUES (?,?,?,?,?)";
 
$nombre = (string) $_POST['nombre'];
$email = (string) $_POST['email'];
$edad = (int) $_POST['edad'];
$colores = (array) $_POST['colores'];
$contrasena = (string) $_POST['contrasena'];
 
$colores = implode($colores, ",");
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
 
    /* Reemplazo las ? por las variable con bind_param */
    $stmt->bind_param('ssiss', $nombre, $email, $edad, $colores, $contrasena);
 
    /* ejecuto el  query */
    $stmt->execute();
 
    /* cierro stmt */
    $stmt->close();
}
?>
<html>
<head>
    <title>Registrarse</title>
</head>
<body>
<h1><?=$nombre;?>, usted se ha registrado exitosamente</h1>
</body>
</html>

Written by Daniel Segovia

febrero 22nd, 2012 at 3:40 pm

Posted in 7.8 Seguridad

Entradas de usuarios

Un comentario

Ahora que podemos mezclar el HTML y PHP necesitaremos que el usuario empiece a interactuar en nuestra plataforma.
Una registro de usuarios es un ejemplo de la interacción que estoy hablando, el usuario completará sus datos en un formulario, luego estos serán enviados a un archivo PHP para ser procesados, de esta manera comenzaremos a ver como el usuario nos enviará información, en este caso lo guardaremos en una base de datos, pero es a modo de ejemplo ya que el proceso a realizar es indiferente para nosotros por que cualquiera sea la acción que tomemos no es importante, lo importante aquí es que estaremos recibiendo información a través del formulario para realizar la acción que creamos conveniente.

Los formularios HTML podemos, a grandes rasgos, dividirlos en 4.

  • Apertura del formulario con el tag <form>
  • Los tags para que el usuario ingrese la información, por ejemplo <input>, <textarea> o <select> entre otros
  • El botón para enviar el formulario con el tag <input>
  • EL cierre del formulario con el tag </form>

Creamos un formulario que pida al usuario ingresar su nombre completo, su email y una contraseña, estos datos serán enviados a un archivo PHP y será el encargado de guardarlos en una base de datos MySQL

<html>
<head>
    <title>Registrarse</title>
</head>
<body>
<h1>Registraci&oacute;n</h1>
<form method="post" action="registrarse.php">
    <table width="400">
        <tr>
            <td width="150"><label>Nombre:</label></td>
            <td width="250"><input type="text" name="nombre" /></td>
        </tr>
        <tr>
            <td><label>Email:</label></td>
            <td><input type="text" name="email" /></td>
        </tr>
        <tr>
            <td><label>Contrase&ntilde;a:</label></td>
            <td><input type="password" name="contrasena"/></td>
        </tr>
        <tr>
            <td colspan="2" align="right"><input type="submit" name="registrarse" value="Registrarse"/></td>
        </tr>
    </table>
</form>
</body>
</html>

Como podemos observar muchos de los tags HTML que utilizamos tienen lo que se denominan atributos

El tag <form> posee 2 atributos, el primero es method y éste especificará el método HTTP que usará cuando envíe la información. El segundo es action y especifica donde será enviada la información cuando el formulario sea enviado.

Luego tenemos el tag <input> nuestro primero atributo es type y posee las siguientes variantes button, checkbox, file, hidden, image, password, radio, reset, submit, text, en este ejemplo usamos 3 de éstas, text que será un campo de texto libre, password que también será un campo de texto libre pero no serán mostrados los caracteres que iremos tipeando y por último submit que será un botón que al presionarlo enviará el formulario completo al action del form. También tenemos el atributo name que es un nombre que identificará al elemento y el último atributo usado aquí es value este será el valor predeterminado que tomará el elemento.

Ahora recibamos la información que nos provee el formulario y guardemos ésta en la base de datos.
Creamos un archivo registrarse.php (que es el action del formulario) e insertamos los datos.
La información nos llegará al archivo PHP en un array llamado $_POST los índices del array serán igual a los name que hemos definido en el formulario

<?php
$mysqli = new mysqli("localhost", "usuario", "password", "base");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "INSERT INTO usuarios (nombre,email,contrasena) VALUES (?,?,?)";
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
 
    /* Reemplazo las ? por las variable con bind_param */
    $stmt->bind_param('sss', $_POST['nombre'], $_POST['email'], $_POST['contrasena']);
 
    /* ejecuto el  query */
    $stmt->execute();
 
    /* cierro stmt */
    $stmt->close();
}
?>
<html>
<head>
    <title>Registrarse</title>
</head>
<body>
<h1><?=$_POST['nombre'];?>, usted se ha registrado exitosamente</h1>
</body>
</html>

Written by Daniel Segovia

febrero 7th, 2012 at 4:38 pm