WebService (WS)

Introducción

Concepto

Tecnología para el intercambio de información entre diferentes aplicaciones (clientes, consumidores) ejecutadas en cualquier plataforma.

Servidor

Un servidor que implementa un WS debe proveer un WSDL para que los clientes puedan obtener información de dónde y cómo conectarse.
Generalmente los lenguajes de programación permiten generar fácilmente un servidor de WS y generar automáticamente el WSDL.

Cliente

La conexión a un WS generalmente se realiza mediante el protocolo SOAP – Simple Object Access Protocol (que es una abstracción de HTTP) o directamente con HTTP, por ejemplo, a través de formularios web.
Generalmente los lenguajes de programación permiten codificar y decodificar mensajes a través del protocolo SOAP fácilmente sin la necesidad de conocer en detalle su estructura.

WebService Description Language: WSDL

Documento XML que especifica la ubicación del WS y sus métodos

Estructura del WSDL (EN CONSTRUCCIÓN)

Estructura básica

Para facilitar la visualización del árbol XML del WSDL y sus relaciones, podemos organizarlo en un diagrama correspondiente al siguiente ejemplo: http://www.w3schools.com/webservices/tempconvert.asmx?WSDL

Ver ejemplo en wsdl.xml (se recomienda abrirlo mediante un navegador porque facilita la visualización). El ejemplo se puede ver en la siguiente URL:
Descripción de los elementos principales
types: data type definitions. For maximum platform neutrality, WSDL uses XML Schema syntax to define data types.
message: Definition of the data being communicated. Each message can consist of one or more parts. The parts can be compared to the parameters of a function call in a traditional programming language.
portType: Description of a web service, the operations that can be performed, and the messages that are involved. It can be compared to a function library (or a module, or a class) in a traditional programming language.
binding: Data format and protocol for each port type.
service: Descripción del servicio y el acceso principal del webservice

Seguridad en PHP

Diccionario de datos

Usuario: Datos de usuario

nombre nombre del usuario
clave clave del usuario
intentos cantidad de intentos de acceso erroneos
bloqueado flag para indicar si esta bloqueado el usuario
activo flag para indicar si esta activo el usuario
alta fecha de alta de usuario

Ip: Datos de las ip de acceso

numero numero de ip
intentos cantidad de intentos de una determinada ip
bloqueada flag para indicar si esta bloqueada la ip
alta fecha de alta de ip

Sessión

Variables principales de identificacion de sesion
$_SESSION["userid"] //identificacion de usuario
$_SESSION["loggedin"] //flag para identificar si el usuario se encuentra logeado
Asignación de tiempos de sesión
//***** Asignar tiempo de expiracion *****
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (5 * 60);

//***** Controlar tiempo de expiracion *****
$now = time();
if($now > $_SESSION['expire']) session_destroy();

Información adicional

Protección de la base de datos

* mecanismo de autorización de Apache
* modelos de acceso de diseño propio usando LDAP, archivos .htaccess, etc.

open_basedir

Mediante el uso de open_basedir se puede controlar y restringir qué directorios pueden ser usados por PHP. También se pueden definir áreas solo-Apache, para restringir todas las actividades basadas en web a archivos que no son de usuarios o del sistema.

Escapar caracteres al acceder a la base de datos
$username = mysqli_real_escape_string($db,$_POST['username']);
$password = mysqli_real_escape_string($db,$_POST['password']);  

$username = pg_escape_string($db,$_POST['username']);
$password = pg_escape_string($db,$_POST['password']);  
Registrar la cantidad de intentos de acceso
//en construcción
Bloquear ip
//**** Funcion para obtener la ip ******
function ip() {
    if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED')) return  getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR')) return getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED')) return getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR')) return getenv('REMOTE_ADDR');
    else return null;
}

//**** Funcion alternativa para obtener la ip ******
// Function to get the client IP address
function ip() {
    if (isset($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED'])) return $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR'])) return $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED'])) return $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR'])) return $_SERVER['REMOTE_ADDR'];
    else return null;
}