Posts Tagged ‘php’

Almacenar objetos en una sesión

Saturday, June 21st, 2008

Voy
explicar a través de un simple ejemplo como guardar un objeto en una
sesión de php y luego recuperarlo. El ejemplo está basado en PHP 5 y
está formado por 3 archivos php:

a.php
Archivo que contiene la definición de la clase
b.php
Archivo que crea la sesión e instancia un objeto de la clase. Luego lo guarda en la variable SESSION
clase.php
Recupera el objeto de SESSION y lo muestra por pantalla
PHP:

  1. //Archivo clase.php
  2. class Clase {
  3.   private $precio;
  4.   private $cantidad;
  5.  
  6.   public function __construct($p, $c){
  7.     $this->cantidad = $c;
  8.     $this->precio = $p;
  9.   }
  10.   public function getTotal(){
  11.     return $this->precio*$this->cantidad;
  12.   }
  13.   public function __toString(){
  14.     return ‘Hay ‘.$this->cantidad.‘ de articulos, que cuestan ‘.$this->precio;
  15.   }
  16. }
PHP:

  1. //Archivo a.php
  2. include(‘./clase.php’);
  3. $obj = new Clase(3, 3.14);
  4. $_SESSION['o'] = serialize($obj);
  5. header (‘Location: ./b.php);
PHP:

  1. //Archivo b.php
  2. include(‘./clase.php’);
  3. $obj = unserialize($_SESSION['o']);
  4. echo $obj.\n;
  5. echo $obj->getTotal();
  6. unset($_SESSION['o']);

La salida de b.php sería

Hay 3 de articulos, que cuestan 3.14
9.42

Básicamente lo que hacemos es utilizar la función serialize para representar el objeto como un string y de esta manera guardarlo en SESSION. Luego con unserialize transformamos la cadena en objeto.

Es importante notar que en el lugar donde transformemos la cadena en
objeto debemos incluir el archivo que contenga la definición de la
clase, para que de esta manera PHP sepa como crear el objeto.

Aquí les dejo como luce el objeto cuando lo serializamos

O:5:"Clase":2:{s:15:" Clase cantidad";i:3;s:13:" Clase precio";d:3.140000000000000124344978758017532527446746826171875;}

Instalación y configuración de Doxygen en Debian

Saturday, June 21st, 2008

Doxygen
es un sistema de generación de documentación. Aquí voy a mostrar como
instalarlo y una mínima configuración. Además dejo un ejemplo de la
salida generada en html.

Para instalar Doxygen sólo es necesario el siguiente paquete


$ aptitude install doxygen

Para mostrar cómo configurar doxygen nos valdremos del siguiente ejemplo. Por ejemplo mi proyecto lo tengo dentro de /var/www/proyecto1

Antes de configurarlo, tenemos que crear el archivo de
configuración. Para esto nos situamos en la raíz de nuestro proyecto (o
dónde les parezca que debería ser creado el archivo de configuración) y
hacemos


:/var/www/proyecto1# doxygen -g proyect1.cfg

Este archivo, nos permite modificar los parámetros del proceso de generación de documentación para ajustarse a nuestro proyecto.

Aquí dejo algunos de los puntos más importantes de la configuración:


# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.

OUTPUT_DIRECTORY       = /var/www/proyecto1/doc

# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# The default language is English, other supported languages are:
# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.

OUTPUT_LANGUAGE        = Spanish

# The INPUT tag can be used to specify the files and/or directories that contain
# documented source files. You may enter file names like "myfile.cpp" or
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.

INPUT                  = /var/www/proyecto1

# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
# and *.h) to filter out the source-files in the directories. If left
# blank the following patterns are tested:
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py

FILE_PATTERNS          = *.php

# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
# comment as the brief description. If set to NO, the JavaDoc
# comments will behave just like the Qt-style comments (thus requiring an
# explicit @brief command for a brief description.

JAVADOC_AUTOBRIEF      = YES

En este enlace hay más ejemplos para la configuración. En sí el archivo está bastante documentado (:-P) y es suficiente por sí mismo.

Una vez terminado lo anterior nos situamos en la carpeta donde creamos el archivo de configuración, en este ejemplo en /var/www/proyecto1 y hacemos


# doxygen proyecto1.cfg

Esto generará la documentación en el directorio especificado en OUTPUT_DIRECTORY.

Dejo un pequeño ejemplo de cómo documentar una pequeña clase php.

PHP:

  1. require_once($_SERVER[DOCUMENT_ROOT].‘/proyecto1/confi.php’);
  2. /**
  3. @brief Esta clase es una estructura básica de una página html
  4. @author Leandro Redea
  5. **/
  6. class Algo{
  7.     /** Titulo de la página web que aparece en el browser*/
  8.     private $titulo = “Dinamic Web”;
  9.     /** Palabras claves para que los motores de búsqueda indexen esta página*/
  10.     private $keywords=“PHP, MySQL, GNU/Linux, *BSD”;
  11.     /* Pequeña descripción de la página*/
  12.     private $descripcion=“una simple prueba”;
  13.     /*Link de estilos*/
  14.         private $linkStyle=“http://localhost/tempo/estilo.css”;
  15.     /*Link de feed*/
  16.         private $linkFeed=“http://myhomemdz.dyndns.org/tempo/feed.php”
  17.     /**
  18.     *Esta funcion es la cabecera
  19.     */
  20.     public function getXhtml(){
  21.         echo (‘<title>’.$this->titulo.“</title>\n);
  22.     }
  23.     /** Esta funcion genera los link que se encuentran dentro de las etiquetas HEAD de una pagina web
  24.     */ 
  25.     private function getLink(){
  26.         echo “<link rel=\”StyleSheet\” href=\”.$this->linkStyle.\” type=\”text/css\” media=\”screen\”>”;
  27.         echo ‘<link rel=”alternate” type=”text/xml” title=”prueba” href=”‘.$this->linkFeed.‘” />’;       
  28.     }
  29.         /** Genera una parte de la página dinámica
  30.         @param a Es la etiqueta inferior
  31.         @return Devuelve el footer dentro de body */
  32.         public function getFooter($a){
  33.                 //Hace muchas cosas y retorna algo
  34.         }
  35. }

Nota: Para que los comentarios sean generados en la salida, tiene que estar dentro de las etiquetas <?php ?>

La salida se genera dentro de /var/www/proyecto1/doc. Se
crean en este caso dos carpetas una html y la otra latex. Para ver la
documentación a través de la web, bastaría escribir la siguiente url en
su browser

http://localhost/proyecto1/doc/html

Dejo una imagen de como quedaría la clase anterior generada en html.

imagen que muestra en ejemplo generado con doxygen

Ocultando PHP

Friday, January 4th, 2008

En un anterior post expliqué cómo ocultar los detalles de versión que suministraba Apache en las cabeceras de solicitud HTTP. Ahora si tenemos PHP instalado, hay información de éste dentro de la cabecera, que puede resultar de ayuda a un cracker.

Una cabecera sin la firma del servidor web pero con información de PHP luce así


HTTP/1.0 200 OK
Date: Fri, 04 Jan 2008 14:25:36 GMT
Server: Apache
X-Powered-By: PHP/5.2.1
X-Pingback: http://localhost
Connection: close
Content-Type: text/html; charset=UTF-8

Para deshabilitar esa información hay que ir a /etc/php5/apache2 y editamos el archivo php.ini


#nano php.ini

Ahora debemos cambiar el valor de la opción expose_php de On a Off


; Misc
;
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
expose_php = Off

Guardamos la nueva configuración y reiniciamos el servidor


#etc/init.d/apache2 restart

Y listo, ahora podríamos hacer una prueba para ver si no es suministrada la información de PHP.


#telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HTTP/1.0 200 OK
Date: Fri, 04 Jan 2008 14:29:24 GMT
Server: Apache
X-Pingback: http://localhost
Connection: close
Content-Type: text/html; charset=UTF-8

A desaparecido el campo X-Powered-By, el cuál informaba sobre PHP.

Páginas web dinámicas

Sunday, December 9th, 2007

Acá les dejo una explicación de las dos formas en que se puede generar contenido dinámico en documentos web. Ya que he notado que varias personas no comprenden bien la diferencias de las dos formas. Ninguna forma es “superior” a la otra, sino que se complementan. Hay varias ocasiones donde es necesario usar ambas formas para poder solucionar un determinado problema.

Contenido dinámico del lado del servidor:

Por ejemplo imaginen el siguiente escenario, se está llenando un formulario para ser un usuario de un determinado sitio web. Al enviar el formulario, se envía un mensaje al servidor, pero no para solicitar un archivo de regreso. Sino, se debe pasar los valores del formulario a alguna aplicación del servidor para que lo procese. Por ejemplo se podría disparar una consulta a una base de datos, para verificar que el nombre de usuario indicado en el formulario no está asignado. Entonces aquí tenemos una generación de contenido dinámica, porque según los datos del formulario se generará distintos contenidos, por ejemplo si el nombre de usuario ya está registrado se podría mostrar una página indicando que dicho nombre ya está usado, o en cambio si los datos fueron correctos generar una página felicitando al nuevo usuario. Hay varios lenguajes para escribir estos programas: Perl, PHP, JSP, ASP.

Contenido dinámico del lado del cliente:

Hoy en día está muy de moda colocar “efectos” en las páginas. Uno que es muy usado es que cuando se presiona un botón (o se pasa por arriba de este) ocurre algo, por ejemplo, cambia de color o se abre una etiqueta que nos indica a que hace referencia ese botón, etc. Como se puede ver todo ese contenido dinámico es en respuesta a la interacción con el usuario y no es necesario para nada el servidor de donde se solicitó la página. Para generar esos efectos es necesario tener comandos incrustados dentro de la página y que actúen en función de lo que hace el usuario. Un lenguaje muy popular para esto es Javascript.

 

Como se puede ver la diferencia entre ambas es muy rígida, pero a través de la tecnología AJAX, es posible unir las otras dos y que interaccionen de una manera más flexible ofreciendo una mayor calidad al usuario, un mayor grado de interactividad.

Algo que hay que destacar es que AJAX en sí no es una tecnología ni un lenguaje de programación, es más bien la unión de varias tecnologías. AJAX es una técnica de desarrollo web.

Una explicación sómera de como se utiliza AJAX (sin entrar en detalles técnicos) podría ser el caso en que se busca una palabra en la barra de Google, al colocar la primera letra, el servidor despliega una lista de sugerencias de palabras que empiezan con esa letra. Al colocar una segunda letra se vuelve a mostrar otra lista de sugerencias.

Efecto AJAX


Efecto AJAX, después de interacción con usuario

Aquí se puede ver que para obtener la lista se necesita información del servidor y la lista está en función de la interacción que tiene el usuario con la página. De aquí que unimos las dos tecnologías y damos una apariencia de mayor fluidez al usuario, primero por que la página no se refresca completa, sino, la lista de sugerencias y segundo una comunicación más rápida con el servidor, porque no tiene que traer toda una página, sino una pequeña lista.