Archivo

Archive for the ‘PHP’ Category

Curso PHP. Capítulo 4: Funciones

8 junio, 2010 1 comentario

Las funciones son grupos de instrucciones independientes que tienen un propósito determinado. Así, podemos tener una función que calcule la raíz cuadrada, o otra que calcule el número de caracteres ‘a’ que tiene una cadena.

La sintaxis básica de una función es la siguiente:

nombre_función (parámetrol, parámetro2 , parámetro3…parámetro_n);

Las funciones pueden ser llamadas con varios parámetros o con ninguno, dependiendo de su definición. Cuando PHP encuentra en el código la llamada a una función, primero, evalúa cada argumento y los utiliza como parámetro de entrada. Después, ejecuta la función y devuelve el valor solicitado o realiza alguna acción sin enviar ningún valor de salida.

Funciones de PHP

PHP cuenta con un gran número de funciones que podeis utilizar directamente en vuestras aplicaciones. Podéis estudiar la documentación en línea a través de la página oficial de PHP cuando no sepáis como utilizar una función. En ella encontrareis ejemplos básicos, y toda la documentación referente a cada una de las funciones predefinidas en PHP. Teneis funciones de todo tipo, para manejar bases de datos, para manejar ficheros, para manipular imágenes, para crear documentos pdfs, para interactuar con diferentes protocolos mediante sockets, etc. La cuestión es no reinventar la rueda, si PHP cuenta con una función que necesiteis es mejor utilizarla ya que estará programada eficazmente por un amplio grupo de desarrolladores con mucha más experiencia que nosotros.

Funciones de usuario

Además de todas las funciones predefinidas en PHP, nosotros podremos crear nuestras propias funciones. Así nuestro código será menos extenso y más legible. Antes de invocar uan función tenemos que definirla. El formato para definir una función es el siguiente:

function nombre_función($argumentol, $argumento2, ..)
{
instrucciónl;
instrucción2;
instrucción3;

return $variable;
}

Comenzamos con la palabra reservada function seguida del nombre de la función que utilizaremos para invocarla. A continuación entre paréntesis el número de argumentos que le pasaremos a la función. Y encerrados entre llaves todas las instrucciones referentes a nuestra función.

Las funciones pueden retornar un valor mediante la palabra reservada return, o no devolver ninguno.

Ejemplo de función:

<?php
function factorial($numero)
{
   $resultado = 1;
   for ($i = $numero; $i > 0; $i--) {
       $resultado = $resultado * $i;
   }
   return $resultado;
}

echo "El factorial de 3 es ".factorial(3)."<br>";
echo "El factorial de 4 es ".factorial(4)."<br>" ;
echo "El factorial de 5 es ".factorial(5). "<br>";
?>

En este ejemplo hemos definido la función factorial, que calcula el factorial del número pasado como parámetro. Despúes hacemos uso de ella invocándola para calcular el factorial de 3, de 4 y de 5.

Ámbito de las variables

Las variables definidas  permanecen declaradas en todo el fichero, menos en las funciones. Las funciones crean un entorno de ejecución donde sólo pueden ver las variables que están dentro de las mismas. Vamos a observar el comportamiento de las variables con un ejemplo.

<?php

$cadena="Adios";

//Imprime Adios
echo $cadena;

function mostrar()
{
   $cadena="Hola";
   echo($cadena);
}

//Imprime Hola
mostrar();

//Imprime Adios
echo $cadena;
?>

En este ejemplo podemos observar el comportamiento de la variable $cadena. La variable $cadena dentro de la función sustituye a la variable $cadena de fuera, pero no reemplaza el valor. Para la función, la variable $cadena de fuera no tiene nada que ver con la variable $cadena de dentro. Así en el último echo podemos observar que imprime Adios ya que la función no reemplaza el valor de la variable $cadena de fuera.

Aún así hay un mecanismo que permite utilizar las variables de fuera dentro de las funciones siempre que se declare como variable global mediante la palabra reservada global.

Resumiendo, las variables pueden ser locales a la función, o globales a todo el archivo.

Variables estáticas

Por defecto, las funciones que creamos en PHP  no retienen en memoria el valor de las variables que se utilizan. Cada llamada a una función implica la nueva creación de las variables locales con su valor inicial. La declaración static añadida a una variable causa que la función retenga en memoria el valor de esa variable en cada llamada.

<?php

//Cada vez que se llame a esta función, aumentará en
// uno la variable contador, no se inicializará a cero.
function contador() {
   static $contador = 0;
   $contador = $contador + 1;
   return $contador;
}

?>

include() y require()

Estas dos funciones incluyen archivos en nuestros documentos. Así podemos organizar todas las funciones en archivos separados e incluirlas en los documentos donde tengamos que hacer uso de ellas. Es una manera de estructurar el código de nuestras aplicaciones.

Otra versión de estas dos funciones son include_once() y require_once() que comprueba si el archivo ya está incluido para no hacer dobles inclusiones.

Estas dos funciones en PHP pueden ser peligrosas si no se utilizan bien. Podeis ver el artículo dedicado a ataques RFI que hacen uso de la mala programación de esta función para incluir scripts maliciosos remotos.

Introducción a los ataques RFI

Funciones recursivas

No voy a entrar en la explicación de funciones recursivas.

Funciones con parámetros variables

Para invocar funciones con un número variable de parámetro podemos utilizar las siguientes técnicas:

-Definir la función con argumentos por defecto, de esta forma podemos hacer llamadas a la función con un número menor de parámetros sin que ocurra un error.

-Usando un array como parámetro para pasar las variables.

-Usando las funciones de argumentos variables de PHP, func_num_args(), func_get_arg() y func_get_args().

Para mí la mejor forma es la segunda, pasar los argumentos en un array, ya que la última tiene una serie de limitaciones que no me gustan.

NOTA: Los parámetros se pasan por valor, esto quiere decir que las funciones se ejecutan con copias de las variables pasadas como argumentos, así que no modifican ninguna variable. Antiguamente se podían pasar parámetros por referencia utilizando el aspersand &, pero está obsoleto en las nuevas versiones de PHP. Los objetos en PHP se pasan por referencia, pero ya entraremos en detalle en el capítulo dedicado a la POO en PHP.

RESUMEN

Ya hemos aprendido como definir nuestras propias funciones en archivos por separado e inclurilas en nuestros documentos mediante las funciones include() y require(). También hemos aprendido como definir funciones con parámetros variables. En el siguiente capítulo estudiaremos las cadenas y las funciones que dispone el API de PHP para manipularlas. Trataremos también un poco el tema de las expresiones regulares.

Hasta la próxima.

Categorías:PHP Etiquetas:

Curso PHP. Capítulo 3: Estructuras de control

8 junio, 2010 Deja un comentario

Los scripts son un conjunto de instrucciones que se ejecutan una detrás de otra. Si queremos cambiar el rumbo de nuestros scripts debemos utilizar estructuras de control.

Las estructuras de control nos permiten elegir diferentes caminos en función de los datos que evaluamos en cada momento. En este capítulo trataremos dos tipos de estructuras de control:

-Estructuras de control condicionales.

-Estructuras de control repetitivas.

Las estructuras condicionales permiten evaluar una condición o varias y elegir el camino correcto. Las estructuras repetitivas repiten un número determinado de veces un conjunto de instrucciones.

Estructuras de control condicionales

-if

La sintaxis de esta estructura es:

if (condición) instrucción;

Si se cumple la condición se ejecuta la instrucción que le sigue.  Si quiere que se ejecuten varias instrucciones, debe encerrar el conjunto de instrucciones entre llaves (   { … } ).

if (condición) {
instruccionl;
instruccion2;
instruccion3;
}

-if…else

La estructura if puede ampliarse para que se pueda elegir entre condición verdadera y falsa.
if (condición) {
instruccionl;
instrucción2;
instruccion3;
} else {
instruccionl ;
instrucción2;
instruccion3;
}

Si la condición es verdadera se ejecutan las instrucciones inmediatamente después del if y si la condición es falsa se ejecutan las instrucciones dispuestas después de la palabra else.

Ejemplo de if…else:

<?php

$valor = 50;
$valor2 = 100;

//Comprobamos mediante un operador de condición. En este caso como
//$valor es menor que $valor2 se imprimirá la cadena:
// "La variable valor es menor que valor2".
if ($valor < $valor2) {
   echo "La variable valor es menor que valor2";
} else {
   echo "La variable valor es mayor que valor2";
}

?>
-switch

La construcción switch comprueba el valor de una expresión y permite elegir entre un conjunto de instrucciones. El formato es el siguiente:

switch (expresión) {

case valor1 :
instruccionl;
instruccion2;
instruccion3;
break;


case valor2:
instruccionl;
instruccion2;
instruccion3;
break;


default:
instruccionl;
instruccion2;
instruccion3;
}

La expresión puede ser de cualquier tipo, siempre que devuelva un valor de tipo entero, de coma flotante o de cadena de caracteres. Una vez evaluada la expresión, se busca el valor en la instrucción case y, si coincide, se ejecutan todas las instrucciones hasta la palabra reservada break. Si no coincide ningún valor, se ejecutan las instrucciones por defecto.

Ejemplo de switch:

<?php
$dia = 4 ;

switch ($dia) {
case 1:
echo "El día es Lunes";
break;
case 2 :
echo "El día es Martes";
break;
case 3 :
echo "El día es Miércoles";
break;
case 4 :
echo "El día es Jueves";
break;
case 5:
echo "El día es Viernes";
break;
case 6 :
echo "El día es Sábado";
break;
case 7:
echo "El día es Domingo" ;
break;
default:
echo "El día de la semana es incorrecto";
}
?>

En nuestro ejemplo se imprimirá la cadena: “El día es Jueves”.

Estructuras de control repetitivas

-while

El bucle while es el más básico de todos. La construcción básica es la siguiente:
while (condición) {
instrucciónl;
instrucción2;
instrucción3;
}

La condición se evalúa al principio. Si es verdadera, se ejecutan las instrucciones que están dentro del bucle y se vuelve a evaluar la condición. Si la condición es falsa no se ejecutan las instrucciones y se continúa con el desarrollo del programa. Puesto que la condición se evalúa antes de ejecutar las instrucciones, es posible que algunos bucles no se ejecuten ninguna vez.

Ejemplo de while:

<?php

$variable = false;
while ($variable) {
    echo "Esta linea no se ejecuta nunca";
}

$variable = true;
while ($variable) {
    echo "Esta linea se ejecuta siempre ya que el bucle es infinito";
}

?>

Hay que tener especial cuidado con los bucles infinitos. Normalmente la condición utilizada como guarda deberá cambiar en algún momento a false para asegurar que el bucle no se ejecute infinitamente.

-do…while

Este bucle es igual que el anterior, pero la condición se evalúa al final de las instrucciones. Por lo tanto, el código que está entre las llaves se ejecuta al menos una vez. El formato básico es el siguiente:

do {
instrucciónl;
instrucción2;
instrucción3;

}
while (condición);

Ejemplo de do while:

<?php

$anterior = 1;
$posterior = 1;

$serie = 1;
$fin = 5000;
echo "Serie de Fibonacci:";

do {
echo $serie.", " ;
$serie = $anterior + posterior;
$anterior = $posterior;
$posterior = $serie;
}
while ($serie < $fin);

?>

En el ejemplo hemos programado un algoritmo que calcule la serie de Fibonnaci comenzando por el número 1 hasta llegar a un número menor de 5000. No hay mucho que explicar ya que el algortimo se entiende perfectamente. No es que esté muy optimizado pero sirve perfectamente como un ejemplo básico del bucle do…while.

-for

La construcción de bucle más complicada es la del for. Tiene la siguiente sintaxis:

for (expresión inicial; condición de fin; expresión de fin) {

instrucciónl;

instrucción2;

instrucción3;

}

El funcionamiento es muy sencillo. La expresión inicial se ejecuta una sola vez al principio del bucle. La condición de fin se evalúa cada vez que se ejecuta el bucle. Si es verdadera se continúa la ejecución y si es falsa se sale del bucle. Al final de cada interacción se ejecuta la expresión de fin.

Ejemplo de for:

<?php
 
for ($x = l;$x <= 10; $x++ ) {
   echo '2 * '.$x.' = '.(2*$x);
   echo '<br />'
}
 
?>

En este ejemplo sencillo calculamos la tabla de multiplicar del dos, esa que aprendemos en primero de primaria.

-foreach

Me reservo esta estructura de control para el capítulo dedicado a arrays.

-continue, break, exit

Estas tres palabras reservadas no son estructuras de control. Se utilizan en el interior de bucles de esta manera:

- break:  Sale del bucle actual y continúa el programa.

- continue:  Salta hasta el final de la iteracción y continúa la ejecución desde el principio del bucle.

- exit:  Finaliza la interpretación del código PHP. También puede utilizarse la función die().

RESUMEN

En tres capítulos ya hemos aprendido a utilizar variables, operadores y estructuras de control. Ya estamos casi a punto de empezar a crear aplicaciones dinámicas totalmente funcionales, claro está si tenemos cierto conocimiento avanzado de las tecnologías XHTML, CSS y JavaScript.

En el siguiente capítulo estudiaremos las funciones y como podemos cerarnos nuestras propias funciones para reutilizar código.

Hasta la próxima.

Categorías:PHP Etiquetas:

Curso PHP. Capítulo 2: Operadores.

8 junio, 2010 1 comentario

Los operadores sirven para realizar operaciones entre variables.

Operador de asignación:

El más básico es el operador de asignación (=), utilizado para dar valores a las variables que usamos en nuestro código.

<?php

$variable = 5;
$variable2 = "Asignación de valores";

?>
Operador unario:

Este operador (-) tiene la propiedad de hacer a los números, negativos o positivos, dependiendo del signo actual.

<?php

$entero = 100;

$entero_negativo = -$entero; // El valor ahora es -100

$entero_positivo = -$entero__negativo; // El valorahora es 100

?>
Operadores aritméticos:

Este tipo de operadores forman parte de la aritmética básica. Nos resultará familiar porque son símbolos muy utilizados en el aprendizaje de las matemáticas.

Operador Operación Descripción Ejemplo Resultado
+ Suma Suma entre valores $x=2+2 4
- Resta Resta entre valores $x=5-2 3
* Multiplicación Multiplica distintos valores $x=5*5 25
/ División Divide entre valores $x=10/2 5
% Módulo Devuelve el resto de una división $x=10%2 0
++ Incremento Suma una unidad a determinado valor $x=5; $x=++; 6
Decremento Resta una unidad a determinado valor $x=5; $x=–; 4
Operadores condicionales:

Los operadores condicionales se utilizan para comparar valores. Devuelven true o false.

Operador Descripción Ejemplo Resultado
== Igual: Compara dos valores (no compara el tipo de variable) $a == $b Verdadero si $a es igual a $b
=== Igual: Compara los dos valores si son iguales y del mismo tipo $a === $b Verdadero si $a es igual a $b y son el mismo tipo de variable
!= Distinto: Compara si las variables son diferentes $a != $b Verdadero si $a es diferente de $b
<> Distinto: Compara si las variables son diferentes $a <> $b Verdadero si $a es diferente de $b
!== Distinto: Compara que las dos variables sean diferentes y de diferentes tipos $a !== $b Verdadero si $a y $b son diferentes y son diferentes tipos
< Menor: Compara que la primera variable sea más pequeña que la segunda $a < $b Verdadero si $a es menor que $b
> Mayor: Compara que la primera variable sea mayor que la segunda $a > $b Verdadero si $a es mayor a $b
<= Menor o igual: Compara que la primera variable sea menor o igual que la segunda $a <= $b Verdadero si $a es menor o igual a $b
>= Mayor o igual: Compara que la primera variable sea mayor o igual que la segunda $a >= $b Verdadero si $a es mayor o igual a $b
Operadores lógicos:

Durante el desarrollo de las aplicaciones podemos encontrar situaciones en las que necesite hacer varias comparaciones seguidas para que se cumpla una determinada condición. Para esto sirven los operadores lógicos.

Operador Descripción Ejemplo Resultado
And Compara que las dos variables sean verdaderas $a && $b Verdadero si $a y $b son verdaderos
Or Compara que alguna de las dos variables sean verdaderas $a || $b Verdadero si $a o $b son verdaderos
Xor Compara que $a o $b sean verdaderos pero no ambos $a Xor $b Verdadero si $a o $b son verdaderos pero no ambos
Not Niega una condición !$a Verdadero si $a es falso
Operador ternario:

Los operadores que hemos visto hasta ahora son capaces de manejar un operando (unarios) o dos operandos (binarios). El operador ternario, o de comparación, evalúa un operando y, dependiendo de si es falso o verdadero, evalúa el segundo operando o el tercero.

<?php

$valor = false;

$valor == true ? $resultado = "OK" : $resultado = "FALLO";

// Si $value es true $resultado será OK
// Si es false $re sultado será FALLO
echo $resultado;

?>
Operadores de bit a bit:

Este tipo de operadores no vamos a verlos porque no suelen utilizarse mucho en las aplicaciones webs.

Operador de ejecución:

Mediante el operador de ejecución podemos ejecutar comandos del sistema en nuestras aplicaciones PHP. El operador es las comillas invertidas (` `)

<?php

$listado_archivos = `ls-la`; 

echo $listado_archivos;

?>
Operador de supresión de errores:

Cuando algo falla en nuestras aplicaciones PHP el navegador informa de una serie de errores. Esta no es una buena práctica porque un atacante podría aprovecharse de los códigos de error para recabar información de como esta diseñado el interior de nuestras aplicaciones. Para suprimir los errores se utiliza el símbolo (@).

Hace tiempo leí en un artículo de mejora de rendimiento de las aplicaciones, que este operador consumía bastantes recursos del servidor. Así que es bueno no utilizarlo muy a menudo. Si lo que queremos es no mostrar errores, podemos configfurar PHP para que no muestre ninguno mediante error_reporting(0).

<?php
 
/*En este ejemplo abrimos un fichero en modo lectura.
   Si el fichero no existe, el navegador emitiría un error de acceso.
   Mediante el operador @ no lo mostramos en el navegador. */
$fichero = @fopen("prueba.txt","r") ;
 
?>

Resumen

Ya sabemos como utilizar los diferentes tipos de operadores en PHP.  La preferencia de operadores es la utilizada en las matemáticas. No voy a entrar mucho en detalle.

En el próximo capítulo aprenderemos a utilizar las estructuras de control condicionales y posiblemente las estructuras de control repetitivas.

Hasta la próxima.

Categorías:PHP Etiquetas:

Curso PHP. Capítulo 1: Variables y tipos de datos.

8 junio, 2010 Deja un comentario

Las variables son almacenes de información. Su finalidad es guardar datos e información que podrás utilizar a lo largo del script.

Las variables comienzan por el símbolo del dólar ($) y no necesitan ser declaradas con algún tipo de datos como en otros lenguajes de programación.

Un nombre de variable válido será aquel que empiece por un caracter alfabético [a-z] o de subrayado [_], seguido de caracteres alfanuméricos [a-z y 0-9] y de subrayado [_]. En otras palabras, una variable NO puede empezar con caracteres numéricos, ni puede contener caracteres especiales (signos de puntuación, letras especiales como ñ, acentos, etc.). Sólo letras, números y caracteres de subrayado (_).

Además, el nombre de variable es case sensitive, es sensible a mayúsculas y minúsculas; por lo tanto, no es lo mismo una variable con nombre $edad que $Edad.

Tipos de variables

PHP es un lenguaje con un control de tipos muy bajo, permitiendo almacenar en una variable distintos tipos de datos durante la vida de la variable. Existen varios tipos de datos:

-Entero (Integer): Representa números enteros, positivos o negativos. Puede utilizarse el sistema decimal, octal o hexadecimal.

-Coma flotante (Float o Double): Representa números decimales, postivios o negativos.

-Booleanos (Boolean): Tipo de datos que representa dos valores, true(verdadero) o false (falso) utilizados para realizar operaciones de lógica.

-Cadenas de carácteres (String): Representan cádenas de carácteres que pueden incluir carácteres alfanuméricos, signos, espacios, etc. Su finalidad es transmitir información textual. Van encerrados entre comillas simples o dobles, pero también su puede utilizar la sintaxis HEREDOC y NOWDOC. Lo veremos en más profundidad cuando estudiamos el capítulo dedicado a la manipulación de strings, así como el uso de los carácteres de escape.

-Vectores (Array): Conjunto de datos organizados. Los arrays pueden ser arrays númericos cuyo índice es numérico, o arrays asociativos, cuyo indice es una clave que puede ser alfanumérica. Los arrays en PHP no tienen un tipo incluido, esto permite almacenar distintos tipos de datos en su interior, ya sean números o cadenas. Los veremos en más profundidad cuando estudiemos el capítulo dedicado a arrays.

-Objetos (Object): Los objetos son un tipo especial de datos que veremos más adelante en el capítulo dedicado a la programación orientada a objetos en PHP. Seguramente si ya habeis utilizado un lenguaje de programación como Java o algunos de la plataforma .NET ya tengais experiencia manipulando objetos y utilizando la metodología de la programación orientada a objetos.

-Recursos (Resources): Es un tipo de datos especial que devuelven algunas funciones y sirve para identificar un tipo de recurso, como por ejemplo, un puntero a una base de datos, o uno hacia un fichero abierto en modo lectura.

-Null: Es un tipo de datos especial utilizado para indicar que no está inicializado.

Ejemplo de tipos de datos:

<?php

   $numero_entero = 12343; //Integer

   $numero_flotante = 12343.123; //Float o Double

   $cadena = "Hola Mundo, soy el robot Nº13"; //String

   $booleano = true; //Boolean

   $vacio = null; //Null

   $objeto= new Persona("Juan");

?>

Constantes

Las constantes son tipos de datos que no varían en el desarrollo de un programa. En la vida real existen muchos tipos de constantes, el número pi, la temperatura de congelación del agua, el nombre de la Empresa, etcétera. Para crear una constante tiene que usar la función define () de la siguiente forma:

<?php

   define("CURSO","Introduccion a PHP");
   define("AUTOR","Francisco Belmonte Ruiz");

?>

Para mostrar el valor de las constantes únicamente hay que invocar su nombre, esta vez sin utilizar el símbolo de $.

<?php

   echo AUTOR;
   echo CURSO;

?>

Variables de tipo variable

Las variables permiten almacenar nombres de variables. Esto en un principio puede ser extraño.

<?php

   $variable="Hola"
   $$variable="Mundo"

   echo $variable.$Hola; //Imprime HolaMundo

?>

Funciones relacionadas con variables

Aún no hemos hablado de que son las funciones y ya vamos a utilizarlas. Las funciones tienen el mismo significado en PHP que en cualquier otro lenguaje de programación. Son trozos de código destinadas a realizar alguna función. Se utilizan para reutilizar código y no tener que reescribir siempre lo mismo cuando se necesite la misma función a lo largo del código. Ya lo veremos con más profundidad en el capítulo dedicado a funciones.

-isset():

Con esta función podemos averiguar si una función existe dentro de nuestro programa. Si existe devuelve true y si no existe false.

<?php

   $nombre = "Francisco";
   if (isset($nombre))
      echo ("La variable nombre existe.");

?>
-unset():

Libera la memoria ocupada por una variable, destruyendo su nombre y su contenido. Después de usar unset(), la variable destruida aparecerá como false al utilizar la función isset() .

<?php

   //Inicializamos la variable nombre con la cadena Francisco.
   $nombre = "Francisco";

   //Como la variable existe imprime por pantalla la cadena pasada a echo.
   if (isset($nombre))
      echo ("La variable nombre existe.");

   //Destruimos la variable y su contenido.
   unset($nombre);

   //Comprobamos si la variable existe. Como no existe imprime la cadena pasada a echo.
   if(!isset($nombre))
      echo("La variable nombre no existe");

?>
-gettype():

Con esta función podemos averiguar el tipo de dato almacenado en la variable. Nos puede devolver uno de los siguientes valores:

• integer
• double
• string
• array
• object

<?php

   //Inicializamos la variable nombre con la cadena Francisco.
   $nombre = "Francisco";

   //Imprimimos el tipo de la variable $nombre: string.
   echo ( gettype($nombre) );

?>
-settype():

Convierte el tipo de la variable al especificado en la función. El tipo debe especificarse eligiendo uno de los siguientes: array, double, integer, object o string. Si la función no es capaz de convertir el tipo de la variable devuelve el valor false. También podemos realizar castings en vez de utilizar la función settype() si queremos tratar una variable como otro tipo de datos.

<?php
 
   //Inicializamos la variable nombre con la cadena Francisco.
   $cadena_numerica = "1234";
 
   //Seteamos el tipo de variable string a integer.
   settype($cadena_numerica, 'integer');
 
   //Sumamos 1234 a la variable cadena_numerica
   $suma=$cadena_numerica+1234;
 
   //Imprimimos el resultado: 2468
   echo( $suma );
?>

Resumen

Hay más funciones relacionadas con el uso de variables que no vamos a dedicar en este capítulo. Podeis dirigiros a la documentación oficial de PHP para ver su uso, algunas de ellas son empty(), is_double(), is_integer(), is_string(), is_numeric(), etc…

La base de nuestras aplicaciones reside en la creación y manipulación de variables. Ya hemos aprendido a declarar variables, inicializarlas, hemos estudiado los diferentes tipos de datos yel uso de algunas funciones, así como declarar constantes.

En el siguiente capítulo aprenderemos a utilizar los diferentes operadores y estructuras de control típicas de todos los lenguajes de programación. En algunos ejemplos de este capítulo ya hemos utilizado algunas, como el operador de igualdad, o de suma, o la estructura de control condicional if.

Hasta la próxima.

Categorías:PHP Etiquetas:

Curso PHP. Introducción

8 junio, 2010 Deja un comentario

Iniciamos un nuevo curso, esta vez dedicado al lenguaje PHP para el desarrollo de aplicaciones webs dinámicas. Va a ser un curso acelerado donde veremos las principales características. Voy a estructurarlo en una serie de artículos donde poco a poco nos iremos introduciendo en el mundo de PHP. Aprenderemos a utilizar variables, estructuras de control, arrays y cadenas. Nos introduciremos en el mundo de la programación orientada a objetos de PHP y en su uso para acceder a bases de de datos como MySQL. También aprenderemos a proteger nuestras aplicaciones de las principales vulnerabilidades como ataques de XSS, ataques RFI y inyecciones SQL.

¿Qué es PHP?

PHP es un lenguaje de programación interpretado, diseñado originalmente para la creación de páginas web dinámicas. Es usado principalmente en interpretación del lado del servidor (server-side scripting) pero actualmente puede ser utilizado desde una interfaz de línea de comandos o en la creación de otros tipos de programas incluyendo aplicaciones con interfaz gráfica usando las bibliotecas Qt o GTK+. En este curso nos dedicaremos esencialmente a la construcción de aplicaciones dinámicas.

Es un acrónimo de “PHP: Hypertext Preprocessor“, la mayor parte de su sintaxis es similar a C, Java y Perl y fue creado originalmente por Rasmus Lerdorf en 1994.

Al ser un lenguaje interpretado en el lado del servidor para empezar a desarrollar nuestras primeras aplicaciones necesitamos disponer de una serie de herramientas básicas.

-Un servidor WEB, como APACHE o IIS. (Recomiendo APACHE encarecidamente, no porque la única tecnología que me guste de Microsoft sea .NET, sino porque es un producto open source, disponible en múltiples plataformas y totalmente gratuito).

-El intérprete PHP.

-Un sistema gestor de bases de datos, como MySQL.

-Un editor de texto plano o un IDE avanzado. Para inciarse recomiendo el NotePad++, luego ya más adelante algún IDE completo como PHPUnit o Zend Studio.

Para los iniciados, un buen método es instalar un paquete en el que te venga todo junto y no dejarse los sesos intentando configurar todo para que funcione perfectamente. Así que buscar un XAMP (Linux, Apache, MySQL y PHP) si utilizais Linux como S.O, o un WAMP(Windows, Apache, MySQL, PHP) si utilizais Windows.

Uno disponible es Easy PHP.

No voy a entrar en detalles de como funciona porque es muy intutitivo, con decir que nuestras aplicaciones irán en el directorio accesible, que suele ser el directorio \www es suficiente.

Ahora que ya disponemos de todo lo necesario para comenzar, es hora de ponerse manos a la obra.

Sintaxis de PHP

La sintaxis se refiere a las normas y a la estructura que deben seguir nuestros códigos para su correcta interpretación. Está formado por un conjunto de reglas básicas que debemos tener en cuenta a la hora de escribirlo.

-Incrustar PHP en HTML:

Cuando iniciamos la ejecución de nuestros scripts, debemos indicarle al motor  PHP que secuencias de comandos debe interpretar. Esto se hace incrustando el código PHP entre estos diferentes tipos de etiquetas:

<?php ... ?>
<script language="php"> ... </script>
<? ... ?>
<% ... %>

Los puntos suspensivos indican donde incrustaríamos el código PHP.

Las dos primeras están siempre disponibles pero las últimos deben ser habilitadas en la configuración de php. El tercer estilo se activa mediante la directiva short_open_tag y no es muy recomendable porque interfiere con las declaraciones xml. El cuarto estilo (el llamado estilo asp) se habilita mediante la directiva asp_tags. Durante lo largo de este curso voy a utilizar el primer estilo para incrustar PHP en los documentos HTML.

-Instrucciones:

Un script PHP es una serie de instrucciones que se ejecutan una detrás de otra. Para separa cada instrucción se utiliza el carácter punto y coma (;). PHP ignora los espacios en blanco, como tabulaciones y saltos de línea. De esta forma podemos ordenar el código insertando saltos de línea y tabulaciones.

-Comentarios:

Cómo en la mayoría de lenguajes de programación PHP admite el uso de comentarios para documentar los diferentes scripts. Podemos utilizar comentarios de una sola línea interponiendo dos contrabarras (//) o comentarios de múltiples líneas mediante el uso de las etiquetas (/* … */).

Ejemplo de nuestro primer script PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sin t&#237;tulo</title>
</head>
<body>
<?php
   //Comentario de una línea.
   /* Comentario
      de varias líneas.
      El intérprete PHP ignora
      los comentarios. */
   echo "Hola mundo." ;
?>
</body>
</html>

Este ejemplo tan sencillo muestra una página web con la cadena Hola mundo. , probad a guardarlo en un archivo con extensión .php, lo colocais en la carpeta /www del paquete preinstaldo y accedeis a él desde el navegador.

Hasta aquí la primera parte del curso introductorio a PHP.

Hemos aprendido a:

-Crear un marco de trabajo para iniciar a desarrollar aplicaciones webs con PHP mediante un paquete preinstalador.

-Empotrar código PHP en los documentos HTML utilizando los diferentes estilos de etiqueta.

-Comentar los códigos.

-Mostrar cadenas mediante la función echo.

En el siguiente artículo aprenderemos a utilizar las variables en PHP, veremos como crearlas, modificarlas y eliminarlas, y estudiaremos los diferentes tipos de variables disponibles en PHP.

PD: Este curso es muy básico e introductorio, no especifico detalladamente como acceder a los scripts desde el navegador, como instalar EasyPHP, y no entro en muchos detalles. En Internet disponeis de cursos más detallados, y de numerosos libros dedicados a PHP, tanto en vuestro idioma natal como en inglés.

Hasta la próxima.

Categorías:PHP Etiquetas:

Introducción a los ataques XSS

5 mayo, 2010 1 comentario

Los ataques XSS, Cross-Site Scripting están basados en la explotación de una vulnerabilidad del sistema de validación HTML. Consisten en inyectar código JavaScript en el interior de un documento HTML, por esto a veces se le conoce con el nombre de HTML Injection.

Esto es posible debido a que no se filtran correctamente los datos de entrada que se pasan a la aplicación. Como dije en el anterior artículo dedicado a los ataques RFI, la principal medida de seguridad a tener en cuenta cuando desarrollamos una aplicación web es nunca confiar en los datos que puedan modificar los usuarios, aquellos que se pasan por la URL, e incluso los que se pasan mediante formularios.

Tipos de XSS

-XSS indirecto (se le conoce como reflejado): Este tipo de XSS es más frecuente encontrarlo en las aplicaciones web. El código JavaScript que se incrusta en el documento HTML no es persistente en el tiempo, es decir, solo afecta al usuario que utiliza el navegador.

Hace unos meses salió en la prensa un posible ataque a la web de la Presidencia Europea de España en la que aparecía la imagen de Mr.Bean simulando que la página había sufrido un deface.

Pero realmente había sufrido un ataque de XSS indirecto, en la que el autor se aprovechaba del buscador de la página para incrustar un script de JavaScript que cargara la imagen en la respuesta de la búsqueda.

Veamos un ejemplo más sencillo de una aplicación vulnerable a estos ataques. La siguiente mini-aplicación web contiene un formulario que simula a un buscador. Aunque realmente lo único que hace es imprimir en el navegador el texto que has introducido. Un ejemplo más sencillo es imposible.

<html>
<head>
  <title>Buscador vulnerable</title>
</head>
<body>
  <form method="get" action="buscador.php">
    <input type="text" name="buscar">
    <input type="submit" value="Buscar">
  </form>
</body>
</html>

Archivo index.php

<html>
<head>
  <title>Buscador vulnerable</title>
</head>
<body>
  echo 'Estas buscando:'.$_GET['buscar'];
</body>
</html>

Archivo buscador.php


Los diferentes cambios de coloreado de sintaxis se debe a que uso un coloreador de código del lenguaje de programación. En el primer caso estoy coloreando HTML puro, y en el segundo PHP.

Cuando el usuario introduce una cadena de texto y pincha en el botón de búsqueda se llama a buscador.php pasando una variable por la URL de nombre buscar. Así que puede pasar dos cosas.

1. Que el usuario busque una cadena de texto normal y todo funcione correctamente. Por ejemplo, el usuario introduce coches de segunda mano y pincha en el botón de búsqueda. La página cargada contendrá el siguiente código HTML:

http://www.servidorvulnerable.com/buscador.php?buscar=coches%20de%20segunda%20mano

<html>
<head>
  <title>Buscador vulnerable</title>
</head>
<body>
  Estas buscando:coches de segunda mano
</body>
</html>

Des esta forma el usuario sin darse cuenta ha incrustado código HTML en la página cargada. Claro esta que en este ejemplo el código es una simple cadena de texto inofensiva.

2. Que el usuario manipule los datos de entrada para introducir un script en JavaScript. Por ejemplo el usuario introduce <script>alert(XSS)</script>. La página cargada contendrá el siguiente código HTML:

http://www.servidorvulnerable.com/buscador.php?buscar=<script>alert(XSS)<%2Fscript>

<html>
<head>
  <title>Buscador vulnerable</title>
</head>
<body>
  Estas buscando:<script>alert(XSS)</script>
</body>
</html>

De esta forma incrustamos un script JavaScript con la finalidad de mostrar una alerta en el navegador con la cadena XSS. Nos hemos aprovechado de la falta de control de los campos de entrada para introducir un pequeño script. De esta forma podemos ejecutar un simple script como una alerta, o un script malicioso para robar las cookies del usuario, o incluso podemos redireccionar a una página web con scripts ocultos que se ejecuten al visitarla.

Este tipo de ataque solo se ejecuta en el navegador de la víctima. Lo primero es crear el enlace manipulado y mediante engaños hacer que la víctima lo siga, ya sea publicando el enlace manipulado en redes sociales, como en el caso de Mr.Bean o mediante correo electronico. Aquí entra en juego la llamada ingeniería social para motivar a la víctima a que siga el enlace confiando en ti.

-XSS directo (se le conoce como persistente): Este tipo de XSS es persistente a la aplicación ya que el código a ejecutar se queda en el repositorio de datos, ya sea base de datos, o ficheros. En este caso no hace falta enviar a la víctima un enlace manipulado ya que todos los usuarios de la aplicación se convierten en víctima afectadas.

Suele encontrarse en aplicaciones donde se permitan subir datos, por ejemplo, en un libro de visitas, en forma de comentarios.

Ya sea en uno de los dos tipos diferentes de ataques XSS se pueden ejecutar scripts entre las etiquetas <script> </script>, aunque también puede ejecutarse código JavaScript dentro de otras etiquetas HTML.

Ejemplo:

<a href=”javascript:[código]”>
<div onmouseover=”javascript:[código]”>
<img src=”javascript:[código]”>
<img dynsrc=”javascript:[código]”>
<input type=”image” dynsrc=”javascript:[código]”>

En resumen, no solo es posible ejecutar código a traves de la etiqueta <script> sino también a través de los eventos que se pueden producir en los elementos HTML, así como en el destino de etiquetas como <a> y <img>.

¿Cómo podemos proteger nuestras aplicaciones de este tipo de ataques?

En un primer momento, podemos pensar en filtrar las etiquetas <script>, pero no serviría de nada porque hemos visto que se pueden ejecutar scripts a traves de otras etiquetas.

En segundo lugar podríamos pensar en filtrar los carácteres < y > con alguna función como str_replace o utilizar htmlentities para transformar las entidades HTML:

str_replace(array('<', '>'), '', $_GET['buscar']);
htmlentities($_GET['buscar']);

La solución usando str_replace no es una buena solución ya que el usuario puede modificar esos caracteres por sus equivalentes en código ASCII anteponiendo el símbolo % y su carácter hexadecimal.

La solución utilizando htmlentities empieza a ser una buena solución, ya que convirte todos los caracteres HTML en entidades. Pero esta función por defecto no filtra las comillas simples, que también pueden utilizarse para ataques XSS.

Así que la mejor solución es utilizar la función htmlspecialchars, una función muy parecida a htmlentities pero que sí filtra las comillas simples, siempre que se pasa como segundo argumento ENT_QUOTES.

htmlspecialchars($_GET['buscar'], ENT_QUOTES);

Recomendando libros: Programación WEB

28 abril, 2010 3 comentarios

En el anterior artículo recomendé varios libros para aprender a diseñar páginas web, ahora viene la parte que más me gusta. La parte donde dotamos a las páginas de dinamismo para que interactúen con el usuario. Hasta ahora nuestra curva de aprendizaje ha sido en un primer nivel, HTML, o mejor dicho xHTML. En un segundo nivel, dotamos a los documentos de una presentación mediante las hojas de estilo en cascada, CSS. Ahora teneis tres opciones. Decantaros por empezar con JavaScript, o empezar con algún lenguaje del lado del cliente, como PHP, o aprender PHP y JavaScript a la vez. Así, en un futuro podréis empezar a desarrollar aplicaciones con AJAX y ver el uso de diferentes librerías como Prototype o JQuery, mi favorita.

Empezando con JavaScript. Podeis descargaros, o estudiar el libro online de Javier Eguíluz Pérez en su página www.librosweb.es. El curso que estoy publicando en este blog es un resumen de ese libro y otros manuales que podeis encontrar perfectamente en Internet.

Con JavaScript se pueden hacer miles de cosas, desde dotar de efectos visuales a las aplicaciones, hasta desarrollar aplicaciones que no tengan que recargarse completamente, mediante AJAX. Una vez leído el texto, recomiendo buscar scripts desarrollados en JavaScript y estudiarlos un poco, para ver hasta donde llega el potencial de este lenguaje del lado del cliente. Para los iniciados, Microsoft utiliza en su navegador Internet Explorer, JScript, que no es más que la adaptación que hizo del lenguaje ECMA-Script. En realidad, practicamente son iguales, con pequeñas diferencias que os volverán locos cuando empezeis a practicar.

Antes de adentraros a estudiar los demás libros que podeis encontrar ahí, el libro dedicado a AJAX, o los libros dedicados al framework symfony de PHP, recomiendo la lectura de libros dedicados a este lenguaje del lado del servidor.

Con PHP podemos realizar páginas web dinámicas que interactúen con el usuario, desde sistemas de noticias, blogs y redes sociales. Hay muchos libros dedicados a PHP, pero lo mejor es empezar con uno muy básico e ir avanzado poco a poco de dificultad.

Yo empezé con el libro PHP y MySQL para Dummies. Uno de esos libros para tontos tan famosos hoy en día.

Es un libro muy básico que te introduce en el mundo de PHP y el uso del gestor de base de datos MySQL para almacenar toda la información. Tiene un capítulo dedicado a crear una aplicación desde cero, en concreto, un catálogo de mascotas online con registro de usuarios. Cabe destacar la parte dedicada al uso de cookies y sesiones.

Lo único que no me gusta de este libro y de la mayoría de libros que enseñan PHP es que suelen utilizar tablas HTML para organizar la estructura del documento web. Supongo que esta hecho así para no liar tanto la perdiz, pero puede liar más al lector si se acostumbra a utilizar tablas en vez de hojas de estilo para estructurar el layout de una página web. Otra parte importante que no toca este libro es la seguridad de las aplicaciones, para eso estoy creando ciertos artículos donde explico los principales tipos de ataques a aplicaciones web, desde RFI, pasando por XSS hasta llegar a SQLI.

Despúes de estudiaros ese, podeis pasar a uno un poco más técnico, Desarrollo Web con PHP y MySQL de la editorial Anaya.

En mi opinión es uno de los libros perfectos para aprender PHP. Tiene una sección dedicada a PHP orientado a objetos y muchas practicas de programación, como el desarrollo de un foro y de un carrito de la compra. Por último tiene un tema dedicado a los servicios web con XML y SOAP bastante interesante. Es un libro más denso, no recomiendo empezar estudiando esté. Empezar con el de PHP para tontos y cuando os veais con suficiente fuerza echarle el guante a esta maravilla. Tampoco toca muchos temas de seguridad, parece que es un tema tabú en muchos libros, pero…¿Cómo vamos a proteger nuestras aplicaciones si ni siquiera sabemos como se atacan?

Categorías:JavaScript, Libros, MySQL, PHP
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 127 seguidores