Practica PHP Sesiones Sockets
Practica PHP Sesiones Sockets
Practica PHP Sesiones Sockets
Pgina 1 de 17
PHP superglobales
$GLOBALS Contiene una referencia a cada variable disponible en el espectro de las variables del script. Las llaves de esta matriz son los nombres de las variables globales. $GLOBALS existe desde PHP 3. $_SERVER Variables definidas por el servidor web directamente relacionadas con el entorno en don el script se esta ejecutando. Anloga a la antigua matriz $HTTP_SERVER_VARS (la cual est todava disponible, aunque no se use). $_GET Variables proporcionadas al script por medio de HTTP GET. Anloga a la antigua matriz $HTTP_GET_VARS (la cual est todava disponible, aunque no se use). $_POST Variables proporcionadas al script por medio de HTTP POST. Anloga a la antigua matriz $HTTP_POST_VARS (la cual est todava disponible, aunque no se use). $_REQUEST Variables proporcionadas al script por medio de cuaquier mecanismo de entrada del usuario y por lo tanto no se puede confiar en ellas. La presencia y el orden en que aparecen las variables en esta matriz es definido por la directiva de configuracin variables_order. Esta matriz no tiene un anlogo en versiones anteriores a PHP 4.1.0. Nota: Cuando se utiliza la linea de comandos, argv y argc no son incluidas aqu; estas variables se podrn encontrar en la matriz $_COOKIE Variables proporcionadas al script por medio de HTTP cookies. Anloga a la antigua matriz $HTTP_COOKIE_VARS (la cual est todava disponible, aunque no se use). $_FILES Variables proporcionadas al script por medio de la subida de ficheros via HTTP . Anloga a la antigua matriz $HTTP_POST_FILES (la cual est todava disponible, aunque no se use). $_ENV Variables proporcionadas al script por medio del entorno. Anloga a la antigua matriz $HTTP_ENV_VARS (la cual est todava disponible, aunque no se use). $_SESSION Variables registradas en la sesin del script. Anloga a la antigua matriz $HTTP_SESSION_VARS (la cual est todava disponible, aunque no se use).
Pgina 2 de 17
3. Manejo de Sesiones
El mecanismo de sesiones permite almacenar datos comunes entre diferentes accesos a nuestro servidor realizados por un usuario. Esto permite a las aplicaciones Web desarrolladas en PHP recordar lo que ha hecho el usuario en anteriores conexiones. La duracin de la sesion est predefinida en php.ini y por defecto es hasta que se cierre el navegador. Los datos de la session se almacenan en f rma de Cookies (datos almacenadas en el o ewquipo cliente) o bien como paso de parmetros CGI del tipo GET. Si nuestro navegador permite Cookies utilizar este mtodo que es el ms fiable, si no utilizar la propagacin a travs de parmetros CGI tipo GET (este ultimo mtodo puede interferir con el paso de parmetros normales de nuestra aplicacin realizados en Javascript) Vamos a utilizar el mecanismo de sesiones para que cuando un usuario se valide en nuestro sistema, sus datos sean almacendados y sean validos durante toda la sesin. Aprovechando lo que se estudi en prcticas anteriores, el proceso de validacin se basar en un formulario CGI y el chequeo con una base de datos del usuario y contrsea. Las funciones para el manejo de sesiones se han simplificado enormente a partir de la version 4.1 de PHP por lo que utilizaremos este nuevo esquema mucho ms fiable y seguro. La function bsica para el maenjo de sesiones es: session_start() que carga los datos de la sesin almacenados en el cliente. Nota: En veriones anterioes a la 4.1 de PHP las variables de la sesin estaban disponibles como variables globales y era preciso resgistrarlas como parte de la session para que los cambios fueran permanentes. Actualmente esto no es preciso y por seguridad no se registra ninguna variable de la session o de parmetros de CGI como variables globales (a no ser que lo configuremos expresamente en php.ini). Disponemos en su lugar de las variables llamadas superglobales que siempre son accesibles desde cuanquier function. El acceso a los datos de la session se realizan mediante la variable superglobal $_SESSION (tambin estn disponibles en la variable global normal $HTTP_SESSION_VARS). Se trata de un array asociativo que contiene los datos de la sesi n. Cualquier cambio en esta variable es permanente en las siguientes conexiones. Para comprobar si un dato de una session existe pordemos usar la function estndar isset(). Para eliminar una variable de una sesin podemos usar la function unset().
Pgina 3 de 17
Podemos probar un ejemplo sencillo que cuenta las visitas a nuestro servidor:
<?php session_start(); if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } else { $_SESSION['count']++; }
// primera conexin
echo "Esta es la visita nnero ", $_SESSION['count']; echo "<br><br><br>"; phpinfo(); ?>
En este ejemplo podemos ver las variables PHP (al final) con el identificador de sesin ($_COOKIE["PHPSESSID"] o $_REQUEST["PHPSESSID"]). Este identificador es comun para todos los accesos desde el mismo navegador o ventanas abiertas desde l, pero es difernete si abrimos un nuevo navegador. Por tanto el mecanismo de sesiones solo guarda los datos mientras accedamos desde la misma aplicacin (navegador). Si cerramos la ventana y abrimos una nueva los datos se pierden. Si realmente queremos conservas datos entre diferentes ejecuciones del navegador deberemos usar directamente las Cookies. Ejemplo2: borrar una variable de la session y mostrar el identificador de sesin.
<?php session_start(); if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; // primera conexin } else { $_SESSION['count']++; } echo "Esta es la visita nmero ", $_SESSION['count']; echo "<br>Identificador de Sesin: ", Session_ID(); // si alcanza el valor 5 borra la variable de la sesin para volver a empezar if($_SESSION['count'] >= 5) unset($_SESSION['count']); ?>
Pgina 4 de 17
Pgina 5 de 17
// Comprueba la variable volver if(!isset($_REQUEST["volver"])) $volver="/"; else $volver=$_REQUEST["volver"]; // Comprueba la variable cancelar if(!isset($_REQUEST["cancelar"])) $cancelar="/"; else $cancelar=$_REQUEST["cancelar"]; $texto_error=""; if (isset($_REQUEST["submit_val"])) { // Datos ya introducidos, comprueba el usuario y contrasea if ( ComprobarUsuarioBD($_REQUEST["nombre"], md5($_REQUEST["nombre"].$_REQUEST["clave"]), $usuario)) { $_SESSION[_CAMPO_USUARIO_]=$usuario["nombre"]; $_SESSION[_CAMPO_PASSWD_]=$usuario["clave"]; // la clave se guarda cifrada $_SESSION[_CAMPO_NIVEL_]=$usuario["nivel"]; GuardaDatosUsuarioLog($nombre, $volver); echo "<script type=\"text/javascript\">document.location.replace('$volver');</script>"; die(""); } else $texto_error="(Usuario o password incorrectos)"; } // formulario de entrada de datos ?> <html> <head> <title>Login </title> </head> <body> Control de Accceso de Usuarios <?php echo $texto_error; ?> <br><br><br> <form action="" method=POST> Nombre: <input name="nombre" value="" size=16> <br> Password: <input name="clave" type=password value="" size=16> <br> <br> <input type="submit" name="submit_val" value=" Login ">   <input type="reset" value=" Borrar "> <input type="button" name ="cancelar" value=" Cancelar " onclick="document.location.replace('<?php echo $cancelar; ?>')"> </form>
Pgina 6 de 17
Fichero: validar.inc
<?php // programa: validar.inc // Definicin de constantes define("_URL_PAGINA_VALIDAR_", "/validar.php"); define("_URL_PAGINA_CANCELAR_", "/"); define("_PATH_FICHERO_LOGS_", "c:\apache\data\logs.txt"); define("_SERVIDOR_BASE_DATOS_", "localhost"); define("_BASE_DATOS_", "mibase"); define("_USUARIO_BASE_DATOS_", "root"); define("_CAMPO_USUARIO_", "userid"); define("_CAMPO_PASSWD_", "passwd"); define("_CAMPO_NIVEL_", "level"); // inicia siempre la sesin session_start(); //*********************************************************************** // Comprueba que un usuario/passwd son correctos en la base de datos // $passwd: cifrado md5($usuario.$passwd) // $usuario :devuelve los datos del usuario validado //*********************************************************************** function ComprobarUsuarioBD($userid, $passwd, &$usuario) { // abre la base de datos $db = mysql_connect(_SERVIDOR_BASE_DATOS_, _USUARIO_BASE_DATOS_); if(!$db) return false; // el servidor MySQL no est activo $result=mysql_select_db(_BASE_DATOS_,$db); if(!$result) return false; // no existe la base de datos // busca el usuario $userid=addslashes($userid); // elimina caracteres maliciosos $sql = "SELECT * FROM alumno WHERE userid='$userid'"; $result = mysql_query($sql, $db); if (!$result) return false; $myrow = mysql_fetch_array($result); if(!$myrow) return false; // no existe el usuario // comprueba el password if(!isset($myrow[_CAMPO_PASSWD_]) || $myrow[_CAMPO_PASSWD_]!=$passwd) return false; // password incorrecto // copia los datos $usuario["nombre"]=$myrow[_CAMPO_USUARIO_]; $usuario["clave"]=$myrow[_CAMPO_PASSWD_]; $usuario["nivel"]=$myrow[_CAMPO_NIVEL_]; mysql_close($db)
Pgina 7 de 17
return true; } //*********************************************************************** // Comprueba que la sesin est validada. Chequeos: // 1. si est validado // 2. clave y nombre registrados vlidos // $usuario :devuelve los datos del usuario validado //*********************************************************************** function ComprobarSesion(&$usuario) { // comprueba que la sesin est validada if (!isset($_SESSION[_CAMPO_USUARIO_]) || !isset($_SESSION[_CAMPO_PASSWD_]) || !isset($_SESSION[_CAMPO_NIVEL_]) ) return false; // comprueba en la base de datos que el usuario y el password son correctos if(!ComprobarUsuarioBD($_SESSION[_CAMPO_USUARIO_], $_SESSION[_CAMPO_PASSWD_], $usuario)) return false; return true; } //*********************************************************************** // Comprueba que la sesin est validada.Si no solicita validacin. // $usuario :devuelve los datos del usuario validado //*********************************************************************** function ValidarSesion(&$usuario) { // comprueba que la sesin actual est correctamente validada if ( ComprobarSesion($usuario)) return true; // si no, fuerza la validacin echo "<script type=\"text/javascript\"> document.location='", _URL_PAGINA_VALIDAR_, "?volver=",$_SERVER["PHP_SELF"] , "&cancelar=", _URL_PAGINA_CANCELAR_ , "';</script>"; die(""); } //*********************************************************************** // Elimina los datos de la sesin validada //*********************************************************************** function BorrarSesion() { if (isset($_SESSION[_CAMPO_USUARIO_])) unset ($_SESSION[_CAMPO_USUARIO_]); if (isset($_SESSION[_CAMPO_PASSWD_])) unset ($_SESSION[_CAMPO_PASSWD_]); if (isset($_SESSION[_CAMPO_NIVEL_])) unset ($_SESSION[_CAMPO_NIVEL_]); }
Pgina 8 de 17
//*********************************************************************** // Lee los datos de la sesin actual // $usuario :devuelve los datos del usuario validado // //*********************************************************************** function LeerSesion(&$usuario) { // comprueba que la sesin est validada if (!isset($_SESSION[_CAMPO_USUARIO_]) || !isset($_SESSION[_CAMPO_PASSWD_]) || !isset($_SESSION[_CAMPO_NIVEL_]) ) return false; $usuario["nombre"]=$_SESSION[_CAMPO_USUARIO_]; $usuario["clave"]=$_SESSION[_CAMPO_PASSWD_]; $usuario["nivel"]=$_SESSION[_CAMPO_NIVEL_]; return true; }
//**************************************************************/ // Funcion que actualiza la tabla de accesos al sistema (log) //**************************************************************/ function GuardaDatosUsuarioLog($usuario, $pagina) { $ip=$_SERVER["REMOTE_ADDR"]; $ag=$_SERVER["HTTP_USER_AGENT"]; $pg=$pagina; $fecha=date ("M d Y H;i;s", time());
$fp=fopen(_PATH_FICHERO_LOGS_, "a"); $log= "USUARIO: $usuario :PAGINA: $pg :NAVEGADOR: $ag\n"; fwrite($fp, $log); fclose($fp); return; }
:FECHA: $fecha
:IP: $ip
?>
Pgina 9 de 17
Vamos a realizar una aplicacin PHP en la que nos conectaremos con un servidor de video para controlar una cmara motorizada y capturar una imagen. La aplicacin estar formada por dos ficheros: - Fichero camara.inc: contendr el cdigo PHP para realizar la connexion. Este fichero se ubicar en el directorio especificado en la directiva incude_path de php.ini - Fichero camara.php: contendr en CGI de toma de datos y ejecucin de la peticin Todas las constantes utilizadas se definirn en el fichero camara.inc para que puedan ser cambiadas con facilidad. Por simplicidad las pginas no incluyen el formato del texto que deber ser aadido mediante un editor HTML y el uso de hojas de estilos CSS.
Pgina 10 de 17
Fichero: camara.inc
<?php // programa: camara.inc // Definicin de constantes define("_SERVIDOR_VIDEO_", "videoisa.umh.es"); define("_DIRECTORIO_IMAGEN_", "c:/Apache/htdocs/imagenes/"); define("_PATHURL_IMAGEN_", "/imagenes/"); define("_CLAVE_ACCESO_VIDEOISA_", xxxxxxxxxxx\r\n\r\n"); define("_TIMEOUT_SOCK_", 10); apertura de un socket define("_TIMEOUT_READ_SOCK_", 5); la respuesta de un soket // variables $FICHERO_IMAGEN =""; $RESOLUCIONES= "Authorization: Basic
); $NIVELESCOLOR= array ( "100" => "Color RGB 24bits", "50" => "Color RGB 12bits", "0" => "Monocromo" array ( "0" => "Sin Perdida", "25" => "Media", "50" => "Alta"
); $COMPRESIONES=
);
// Mueve la cmara PTZ function MoverPTZ($camera, $pan, $tilt, $zoom) { $peticion_http = array( "GET /axiscgi/com/ptz.cgi?camera=$camera&pan=$pan&tilt=$tilt&zoom=$zoom&speed=75 HTTP/1.0\r\n", _CLAVE_ACCESO_VIDEOISA_ ); // abre una conexin $socket = fsockopen(_SERVIDOR_VIDEO_, 80, $errno, $errstr, _TIMEOUT_SOCK_); if(!$socket) return false; //enva la peticin for($i=0; $i< count($peticion_http); $i++) fwrite($socket, $peticion_http[$i]);
Pgina 11 de 17
// lee la respuesta $respuesta=array(); socket_set_timeout($socket, _TIMEOUT_READ_SOCK_); $i=0; while(!feof($socket)) { $respuesta[$i]=fread($socket,256); echo "$respuesta<br>"; $i++; } fclose($socket); return true; } // Lee el estado actual de la camara function LeerEstadoPTZ($camera, &$pan, &$tilt, &$zoom) { $peticion_http= array( "GET /axis-cgi/com/ptz.cgi?camera=$camera&query=position HTTP/1.0\r\n", _CLAVE_ACCESO_VIDEOISA_ ); // abre una conexin $socket = fsockopen(_SERVIDOR_VIDEO_, 80, $errno, $errstr, _TIMEOUT_SOCK_); if(!$socket) return false; //enva la peticin for($i=0; $i< count($peticion_http); $i++) fwrite($socket, $peticion_http[$i]); // lee la respuesta $respuesta=array(); $i=0; socket_set_timeout($socket, _TIMEOUT_READ_SOCK_); while(!feof($socket)) { $respuesta[$i]=fread($socket,256); //echo "$i- $respuesta[$i]<br>"; $i++; } fclose($socket);
// Extrae los parmetros $offset=0; $pos_pan_val=strpos($respuesta[0], "pan", $offset)+strlen("pan")+1; $pos_tilt_val=strpos($respuesta[0], "tilt", $offset)+strlen("tilt")+1; $pos_zoom_val=strpos($respuesta[0], "zoom", $offset)+strlen("zoom")+1; if($pos_pan_val==false || $pos_tilt_val==false || $pos_zoom_val==false )
Pgina 12 de 17
return false; $final=strlen($respuesta[0]); $pan=(int) substr($respuesta[0], $pos_pan_val, $final$pos_pan_val); $tilt=(int) substr($respuesta[0], $pos_tilt_val, $final$pos_tilt_val); $zoom=(int) substr($respuesta[0], $pos_zoom_val, $final$pos_zoom_val); return true; } //*********************************************** // Toma una imagen de la cmara //*********************************************** function TomarImagenCamara($camera, $resolution, $compression, $colorlevel) { global $FICHERO_IMAGEN, $ESTADO_TITERE;
// crea el directorio para las imgenes si no existe if (!is_dir(_DIRECTORIO_IMAGEN_)) mkdir(_DIRECTORIO_IMAGEN_, 0777); // aade el timestamp UNIX al nombre del fichero $FICHERO_IMAGEN = "snap" . time() . ".jpg";
$peticion_http = array("GET /axiscgi/jpg/image.cgi?camera=$camera&resolution=$resolution&compression=$comp ression&colorlevel=$colorlevel&clock=0&date=0&quad=0&text=0&rotation=0&sh owlenght=0 HTTP/1.0\r\n", _CLAVE_ACCESO_VIDEOISA_); // abre una conexin $socket = fsockopen(_SERVIDOR_VIDEO_, 80, $errno, $errstr, _TIMEOUT_SOCK_); if(!$socket) return false; //enva la peticin for($i=0; $i< count($peticion_http); $i++) fwrite($socket, $peticion_http[$i]); // lee la respuesta $respuesta=array(); $i=0; socket_set_timeout($socket, _TIMEOUT_READ_SOCK_); while(!feof($socket)) { $respuesta[$i]=fread($socket,350000); $i++; } fclose($socket);
Pgina 13 de 17
// Elimina la cabecera HTTP for($i=0, $offset=0; $i<5; $i++) { $pos=strpos($respuesta[0], "\r\n", $offset); $offset= $pos+2; } $entrada=substr($respuesta[0], $pos+2, strlen($respuesta[0])-$pos-2 ); $respuesta[0]=$entrada;
// Graba la imagen en el fichero $fp=fopen( _DIRECTORIO_IMAGEN_ . $FICHERO_IMAGEN, "wb"); if(!$fp) return false; for($i=0; $i< count($respuesta); $i++) fwrite($fp, $respuesta[$i], strlen($respuesta[$i])); fclose($fp); return true; } ?>
Pgina 14 de 17
Fichero: camara.php
<?php include("c.inc"); // // // // // // // // Variables del CGI: $ejecutar: indica una solicitud $resolution: $colorlevel: $compression: $pan: $tilt: $zoom:
if(isset($ejecutar)) { MoverPTZ(1, $pan, $tilt, $zoom); } else { // valores por defecto $resolution=key($RESOLUCIONES); $compression=key($COMPRESIONES); $colorlevel=key($NIVELESCOLOR); } LeerEstadoPTZ(1, $pan, $tilt, $zoom); TomarImagenCamara(1, $resolution, $compression, $colorlevel); ?> <html> <head> <title>Camara - </title> <script type="text/javascript"> <!-function ComprobarValores(selObj, num) { switch (num) {
Pgina 15 de 17
case 1: // Giro if(parseInt(selObj.pan.value)<-100) selObj.pan.value="-100"; else if(parseInt(selObj.pan.value)>100) selObj.pan.value="100"; break; case 2: // Elevacin if(parseInt(selObj.tilt.value)<-25) selObj.tilt.value="-25"; else if(parseInt(selObj.tilt.value)>25) selObj.tilt.value="25"; break; case 3: // Zoom if(parseInt(selObj.zoom.value)<0) selObj.zoom.value="0"; else if(parseInt(selObj.zoom.value)>9999) selObj.zoom.value="9999"; break; } } //--> </script> </head> <body> Cmara <form name="camara" method="post" action=""> Resolución: <select name="resolution"> <?php foreach ($RESOLUCIONES as $clave=> $valor) echo "<option value=\"$clave\" >$valor</option>"; ?> </select> Tipo de Imagen: <select name="colorlevel"> <?php foreach ($NIVELESCOLOR as $clave=> $valor) echo "<option value=\"$clave\" >$valor</option>"; ?> </select> Compresión: <select name="compression"> <?php foreach ($COMPRESIONES as $clave=> $valor) echo "<option value=\"$clave\" >$valor</option>"; ?> </select> <br><br>Giro [-100.0 : 100.0]: <input type="text" name="pan" size="4" maxlength="4" value="<?php echo $pan;?>" onChange="ComprobarValores(this.form, 1)"> Elevación [-25.0 : 25.0]: <input type="text" name="tilt" size="4" maxlength="4" value="<?php echo
Pgina 16 de 17
$tilt;?>" onChange="ComprobarValores(this.form, 2)"> Zoom [0 : 9999]: <input type="text" name="zoom" size="4" maxlength="4" value="<?php echo $zoom; ?>" onChange="ComprobarValores(this.form, 3)"> <br><br> <input type="submit" name="ejecutar" value="Ejecutar"> <input type="button" value="Actualizar" onclick="location.replace('<?echo $_SERVER["PHP_SELF"];?>');"> <br><br> <img name="Camara" src="<?php echo _PATHURL_IMAGEN_ , $FICHERO_IMAGEN;?>" > </form> </body> </html>
Pgina 17 de 17