lunes, 8 de junio de 2015

TECNOLOGIAS EMERGENTES

TECNOLOGÍAS EMERGENTES.

Las tecnologías emergentes son definidas como innovaciones científicas que pueden crear una nueva industria o transformar una existente. Cada una de estas tecnologías ofrece un amplio campo de oportunidades lo que proporciona la motivación para hacer inversiones de  riesgo,, el problema que plantean estas nuevas tecnologías a las empresas o directivos de las mismas es que puede dar o no resultado.

Las tecnologías emergentes surgen a que debido las herramientas de gestión tradicionales no son capaces de resolver con éxito los nuevos desafíos.

HERRAMIENTAS DE DESARROLLO WEB

Las fases de un desarrollo web, así como los lenguajes de programación usados, son muy extensos y variados, y por ello se necesitan herramientas específicas para cada una de ellas.

En el desarrollo web existen herramientas para el diseño, otras para la maquetación, otras para la programación, y para la depuración. Todas las herramientas son muy importantes, desde el Sistema Operativo hasta el comando más insignificante, y por ello se debe elegir la más adecuada según las necesidades y capacidades.

 Frameworks de desarrollo 


Framework: Estructura conceptual y tecnológica de soporte definido, normalmente con artefactos o módulos de software concretos, con base a la cual otro proyecto de software puede ser más fácilmente organizado y desarrollado, puede incluir soporte de programas, bibliotecas y un lenguaje interpretado.

Objetivos:

  • Desarrollo rápido
  • Desarrollo estructurado
  • Reutilización de código
  • Disminución del esfuerzo en el desarrollo
Frameworks para HTML

  • HTML5 Boilerplate

Nos proporcionan una serie de código que hace que los sitios web construidos con HTML5 Boilerplate se vean bien incluso en navegadores que aún no dan soporte a HTML5.

En su sitio web existe una amplia documentación, incluso un par de vídeos (en inglés) con unas explicaciones excelentes.

  • YAML

YAML son las iniciales de “Yet Another Multicolumn Layout”. YAML es un framework de HTML/CSS para crear layouts flexibles y flotantes. 

  • Inuit

Inuit es un framework CSS relativamente nuevo que se orienta a dispositivos móviles tal y como smartphones y tablets.

Frameworks para Java

  • Spring

Es un Framework que nos ayuda en nuestras aplicaciones java, de forma que podamos desarrollar más rápido, de forma más organizada y más eficientemente.

Está organizado por capas que pueden utilizarse conjuntamente o por separado:

DAO: Capa por encima de JDBC que facilita su uso.
ORM: Permite el uso de APIs conocidas de mapeo con base de datos, como iBatis, Hibernate,
AOP: Permite el uso de programación orientada a aspectos.
JEE: Integración con las APIs típicas de JEE
WEB: Integración con presentación de datos, como Struct, JSF, PDF, JasperReports, etc
Core: Un contenedor de beans.

  • Struts

Es una herramienta de soporte para el desarrollo de aplicaciones Web bajo el patrón MVC bajo la plataforma Java EE (Java Enterprise Edition).
Struts permite reducir el tiempo de desarrollo. Su carácter de "software libre" y su compatibilidad con todas las plataformas en las que Java Enterprise esté disponible lo convierten en una herramienta altamente disponible.

  • Java Server Faces

Es una tecnología y framework para aplicaciones Java basadas en web que simplifica el desarrollo de interfaces de usuario en aplicaciones Java EE. JSF usa JavaServer Pages (JSP) como la tecnología que permite hacer el despliegue de las páginas, pero también se puede acomodar a otras tecnologías como XUL.

Frameworks para ASP.Net

ASP.NET es un framework para aplicaciones web desarrollado y comercializado por Microsoft. Es usado por programadores para construir sitios web dinámicos, aplicaciones web y servicios webXML. Apareció en enero de 2002 con la versión 1.0 del .NET Framework, y es la tecnología sucesora de la tecnología Active Server Pages (ASP). ASP.NET esta construido sobre el Common Language Runtime, permitiendo a los programadores escribir código ASP.NET usando cualquier lenguaje admitido por el .NET Framework.

Tecnología AJAX

Acronimo de Asynchronous Java Script and XML es una técnica de desarrollo web para crear aplicaciones interactivas.

Éstas aplicaciones se ejecutan en el cliente, es decir, en el navegador de los usuarios mientras se mantiene la comunicación asíncrona con el servidor en el segundo plano.
Ajax es una tecnología asíncrona, en el sentido de que los datos adicionales se solicitan al servidor y se cargan en un segundo plano sin interferir con la visualización y el comportamiento de la página.

Ajax es una combinación de 4 tecnologías ya existentes: 

  • XHTML y hojas de estilo en cascada (CSS).
  • Documento Object Model.
  • XML Http Request
  • XML


SAJAX

SAJAX (que significa “Simple Ajax Toolkit”) es un desarrollador de código abierto para acelerar la creación de aplicaciones Ajax. Soporta los principales tecnologías como ASP, Cold Fusion, PHP, Perl, Python y Ruby.
SAJAX tiene una gran comunidad de más de 39000 usuarios registrados en sus foros – por si llegas a tener problemas mientras trabajas en cualquier parte del desarrollo de una aplicación basada SAJAX o si desea mostrar tu trabajo.

 Utilización de librerías

      Prototype

 Facilita el desarrollo de aplicaciones web con Java Script, su autor original Sam   Stephenson y las últimas versiones incorporan códigos e ideas de muchos programadores, es la base de muchos frameworks.

     Scriptaculous

Es una de las muchas librerías que han surgido para facilitar el desarrollo de   aplicaciones, su autor Tomas Fuch se encuentra dividida en varios módulos que son:

Efectos, permite añadir efectos a cada uno de los componentes de la página web.Controles, los tres controles que forman este método son: arrastrar y soltar,    autocompletar, editor de contenidos. 

Utilidades, la utilidad principal se llama builder que se utiliza para crear nodos y fragmentos complejos de doom.

JQuery

Su autor original es John Resign, recibe contribuciones de decenas de programadores. Su diseño interno tiene diferencias tránsicas respecto a prototype.



9.jpg


JavaScript Code Improver

JavaScript Code Improver es una simple aplicación que permite rápidamente que puedas ordenar tu formato de JavaScript. Es una gran ayuda para un equipo de desarrolladores que deben normalizar el formato de código JavaScript para facilitar su legibilidad y colaboración.


JSUnit

JSUnit es una unidad de pruebas para JavaScript. La prueba de código JavaScript en forma manual es lento y propenso a errores, pero JSUnit proporciona al desarrollador una simple y automatizada forma de hacer las pruebas para garantizar un código eficiente.

JSUnit permite la ejecución automática de pruebas para varios navegadores y sistemas operativos aunque tu no lo creas.


JavaScriptMVC


El Test plugin para JavaScriptMVC es otra excelente ayuda para crear JavaScript y ayudar a que el desarrollo sea más rápido. El Test Plugin es un completo conjunto de utilidades que te permite hacer una gran variedad de pruebas así como simular la interacción del usuario en una página web.


Venkman

Venkman es un entorno de depuración de JavaScript para Firefox 2, Netscape y Seamonkey. Tiene una interfaz gráfica para el refuerzo a través de código JavaScript y la posición de puntos de ruptura.

Venkman es una extensión que se puede instalar fácilmente y descargar a través del Firefox Add-ons de Mozilla.org.

Firebug

Firebug es una popular extensión de Mozilla Firefox que te da una gran cantidad de herramientas de desarrollo web y características. Firebug ha incorporado un depurador de JavaScript que te permite moverte por su código así como permitir realizar puntos de referencia para ver por qué el script es lento o débil.
Se puede capturar rápidamente CSS, HTML, JavaScript, XML y los errores a través de Firebug, incluso te permite filtrar y buscar errores específicos. Es una herramienta impresionante aunque a veces se debe desactivar Firebug para acelerar la navegación normal.

Web Developer extensión para Firefox

Web Developer es una extensión muy útil y que ahorra bastante tiempo si trabajas en Firefox. La he recomendado a muchos colegas por ser la extensión que más utilizo a diario y que me da los mejores resultados.
Tu podrás validar rápidamente tu XHTML, encontrar JavaScript / errores CSS, visualizar la estructura de una página web, vaciar la caché con una tecla de acceso, cambiar XHTML sobre la marcha, inspeccionar la información de cabeceras HTTP , entre muchas otras cosas.


jueves, 28 de mayo de 2015

SEGURIDAD EN LA WEB

MÉTODOS DE SEGURIDAD EN LA WEB

Introducción a la Seguridad en Sistemas Web
Un efecto secundario del crecimiento exponencial que ha tenido el Internet es la privacidad de información tanto personal como profesional. En Internet encontramos funcionando a tiendas en línea, negocios que mueven grandes cantidades de dinero, redes de los servicios que habilitan el comercio a nivel internacional así como sitios de redes sociales que contienen información muy delicada de la vida privada de sus miembros.
Mientras más se conecta el mundo, la necesidad de seguridad en los procedimientos usados para compartir la información se vuelve más importante. Desde muchos puntos de vista, podemos creer sin dudar que el punto más crítico de la seguridad del Internet, lo tienen las piezas que intervienen de forma directa con las masas de usuarios, los servidores web.
Respecto a los servidores web, es común escuchar sobre fallas en los sistemas de protección de los servidores más frecuentemente utilizados (Apache, IIS, etc.), o en los lenguajes de programación en los que son escritas las aplicaciones que son ejecutadas por estos servidores. Pero es un hecho, que la mayoría de los problemas detectados en servicios web no son provocados por fallas intrínsecas de ninguna de estas partes, ya que una gran cantidad de los problemas se generan por malos usos por parte de los programadores.


Problemas principales en la Programación de Sistemas Web

Una gran parte de los problemas de seguridad en las aplicaciones web son causados por la falta de seguimiento por parte del programador en los siguientes aspectos:

  • Entradas al sistema
  • Salidas del sistema
Quizás uno de los consejos de seguridad en PHP más conocido en cualquier foro de Internet es el uso del parámetro register_globals que es considerado a priori por muchos administradores como un defecto en la configuración y muy probablemente sin entender con cabalidad que es lo que implica esta configuración.
El tener habilitado este parámetro oculta el origen de los datos. Si se encuentra habilitado, no podemos saber como es que una variable entró al sistema (si lo hizo por medio de una petición GET o POST por ejemplo) y contribuye a la pérdida del control por parte del programador sobre los procesos a los que se ha sometido cada variable para librarla de riesgos potenciales para la aplicación.
Otro aspecto importante además de los procesos de verificación que se deben de tener para con las entradas y salidas del sistema lo representa la fuga de información útil para un posible ataque sobre nuestro sistema. En este punto, los mensajes de error enviados por el servidor, que suelen ser de gran utilidad durante el proceso de desarrollo de la aplicación, se vuelven contra nosotros cuando siguen apareciendo en una aplicación que se encuentra en la etapa de producción, por lo que es necesario deshabitar todos estos mensajes y editar algunos otros (como los que se envían cuando el servidor no encuentra algún archivo en particular) que también pueden ser utilizados por los atacantes para obtener información sobre nuestro sistema.

Practicas básicas de Seguridad Web

Balancear Riesgo y Usabilidad
Si bien la usabilidad y la seguridad en una aplicación web no son necesariamente mutuamente excluyentes, algunas medidas tomadas para incrementar la seguridad con frecuencia afectan la usabilidad. Al igual que debemos pensar en las maneras en que usuarios ilegítimos nos pueden atacar, también debemos considerar la facilidad de uso para los usuarios legítimos.
La recomendación inicial sería tratar de usar medidas de seguridad que sean transparentes a los usuarios. Por ejemplo, la solicitud de un nombre de usuario y una contraseña para registrarse en un sistema son procedimientos esperados y lógicos por parte del usuario.


Rastrear el paso de los Datos
La medida más importante como desarrollador preocupado por la seguridad que podemos tomar es mantener conocimiento de los pasos que ha recorrido la información en todo momento. Conocer de donde vinieron los datos y hacia donde van. En muchas ocasiones lograr esto puede ser complicado, especialmente sin un conocimiento profundo de como funcionan los sistemas Web.
En las aplicaciones web, existen maneras de distinguir los orígenes de los datos y poder así reconocer cuando los datos pueden ser dignos de confianza y cuando no. Ante todo, debemos recordar que la desesperación y la paranoia con mucha frecuencia nos dirigen a complicaciones y errores.
Particularmente para PHP existen arreglos superglobales como $_GET$_POST y $_COOKIE entre otros que sirven para identificar de forma clara las entradas enviadas por le usuario. Si esto lo combinamos con una convención estricta para el nombrado de las variables podemos así tener un control sobre el origen de los datos usados en el código.
Además de entender los orígenes de la información, tiene también igual importancia entender cuales son las salidas que tiene ésta de la aplicación.


 Filtrar Entradas
El filtrado es una de las piedras angulares de la seguridad en aplicaciones web. Es el proceso por el cual se prueba la validez de los datos. Si nos aseguramos que los datos son filtrados apropiadamente al entrar, podemos eliminar el riesgo de que datos contaminados y que reciben confianza indebida sean usados para provocar funcionamientos no deseados en la aplicación.
El proceso de filtrado debe estar conformado por los siguientes pasos:
  • Identificar la entrada.
  • Filtrado de la entrada.
  • Distinguir entre datos que ya han pasado por el filtro y los que no.
Por lo general, se considera más seguro tratar a los datos provenientes de bases de datos como entradas, aunque supuestamente sean bases seguras y en las que debiéramos tener confianza, esto se debe a que es mejor tener redundancia para evitar problemas en el caso de que la base de datos fuera vulnerada.
Existen además muchos puntos de vista diferentes sobre como realizar el filtrado o proceso de limpieza. Lo que usualmente se recomienda es ver al filtrado como un proceso de inspección, no debemos tratar de corregir los datos, es mejor forzar a los usuarios a jugar con las reglas válidas.
Otro aspecto a considerar en el proceso de filtrado es el uso de listas blancas, listas negras o una combinación de ambas.
Al usar listas blancas asumimos que los datos son inválidos a menos que prueben ser validos al encontrarse patrones coincidentes en la lista blanca. Una limitante de usar este punto de vista es considerar inválidos datos que debieron considerarse válidos pero que no fueron tomados en cuenta patrones similares al construir la lista blanca. Dentro de todo, cometer un error de este tipo es preferible que considerar válidos datos que no debieron considerarse así.
Una vez concluido el paso del filtrado solo resta usar convenciones apropiadas en el nombramiento de las variables para poder distinguir las que ya han sido filtradas. Una recomendación sería guardar las variables que ya hayan sido filtradas en un arreglo de fácil identificación (como $limpio).


Escapar salidas
Otra piedra angular de la seguridad en aplicaciones web es el proceso de escapado y su contraparte para codificar o decodificar caracteres especiales de tal forma que su significado original sea preservado.
El proceso de escapado debe estar compuesto a su vez por los siguientes pasos:
Identificar las salidas. Escapar las salidas. Distinguir entre datos escapados y noescapados.
Para escapar las salidas, primero debemos identificarlas. En PHP una forma de identificar salidas hacia el cliente es buscar por líneas como:
echo
print
printf
<?=

Además debemos considerar otro tipo de salidas como los datos que son enviados a otros sistemas como bases de datos, etc. El proceso de escapado debe adecuarse al tipo de salida de que se trate (si es al cliente, a la base de datos, etc.). Para la mayoría de los destinatarios, existen funciones nativas en PHP para esta finalidad.
La salida más común es el cliente, y para él existe en PHP la función htmlentities() que probablemente es la mejor función para escapar este tipo de salidas. Una recomendación adicional con respecto esta función es especificar los parámetros opcionales apropiados con la codificación de carácter empleada en la cabecera de la aplicación (Content-Type).
Para distinguir entre los datos que han sido escapados de los que no es recomendable también usar una convención de nombres. Para el caso de contenido escapado con la función htmlentities() se puede usar un arreglo en especial al que podríamos llamar $html.
Otro destinatario común son las bases de datos, sin embargo cada tipo de manejador (MySQL, PostgreSQL, etc.) puede presentar sus detalles, por lo que es necesario una función de escapado apropiada para cada caso. Para los usuarios de MySQL, la función recomendada es mysql_real_escape_string().


Clasificación de Ataques
Ataques URL de tipo Semántico

Este tipo de ataques involucran a un usuario modificando la URL a modo de descubrir acciones a realizar originalmente no planeadas para él. Los parámetros que son enviados directamente desde la URL son enviados con el método GET y aunque los parámetros que son enviados con este método sólo son un poco más fáciles de modificar que los enviados en forma oculta al usuario en el navegador, esta exposición adicional de los parámetros tiene consecuencias, como cuando queda registrada la URL con todo y estos parámetros quizás privados en buscadores como Google.


Ataques al subir archivos
Existen algunos ataques que aprovechan la posibilidad de la aplicación de subir archivos al servidor. Estos ataques funcionan de la siguiente manera:
Generalmente PHP almacena los archivos subidos en un carpeta temporal, sin embargo es común en las aplicaciones cambiar la localización del archivo subido a una carpeta permanente y leerlo en la memoria. Al hacer este tipo de procedimientos debemos revisar el parámetro que hará referencia al nombre del archivo, ya que puede ser truqueado a modo de apuntar a archivos de configuración del sistema (como /etc/passwd en sistemas Unix).


Ataques de Cross-Site Scripting
XSS es un tipo de vulnerabilidad de seguridad informática típicamente encontrada en aplicaciones web que permiten la inyección de código por usuarios maliciosos en páginas web vistas por otros usuarios.
Los atacantes típicamente se valen de código HTML y de scripts ejecutados en el cliente.
Una vulnerabilidad de este tipo puede ser usada por los atacantes para burlar los controles de acceso comunes, como la muy conocida Same Origin Policy. Recientemente este tipo de ataques han sido explotados para crear poderosos ataques de phishing y de abusos en el navegador.
Desde la liberación del lenguaje JavaScript, se previeron los riesgos de permitir a un servidor Web enviar código ejecutable al navegador. Un problema se presenta cuando los usuarios tienen abiertos varias ventanas de navegador, en algunos casos un script de una página podría acceder datos en otra página u objeto, observando el peligro de que un sitio malicioso intentara acceder datos sensibles de esta forma. Por ello se introdujo la política same-origin. Esencialmente esta política permite la interacción entre objetos y páginas, mientras estos objetos provengan del mismo dominio y en el mismo protocolo. Evitando así que un sitio malicioso tenga acceso a datos sensibles en otra ventana del navegador vía JavaScript.
A partir de entonces se han introducido otros mecanismos y políticas de control en los navegadores y en los lenguajes en el lado del cliente, para proteger a los usuarios de sitios maliciosos.
Las vulnerabilidades XSS pueden ser vistas como técnicas de evasión de las políticas de protección. Encontrando formas ingeniosas de inyectar códigos maliciosos en las páginas servidas por otros dominios, un atacante puede ganar privilegios a datos sensibles, cookies de sesión y otros objetos.


Tipos de vulnerabilidad XSS

Existen tres diferentes tipos de vulnerabilidades XSS:
Tipo 0
También conocido como basado en el DOM o Local. Con este tipo de vulnerabilidad, el problema existe en el script del lado del cliente.
Si un código de JavaScript accede a una URL como un parámetro de una petición al servidor y utiliza esta información para escribir HTML en la misma página sin ser codificada empleando entidades HTML, existe un agujero XSS, dado que estos datos escritos serán interpretados por los navegadores como código HTML que puede incluir en si código adicional del lado del cliente.
Los ataques de este tipo pueden devenir en la ejecución remota de comandos. En el caso de que el atacante suba un sitio malicioso, que contenga un link a una página vulnerable en el sistema de archivos del cliente, resultando en la ejecución con privilegios del navegador del sistema. De esta manera no sólo se pasan las restricciones de comunicación entre dominios.

Tipo 1
A este tipo de agujero XSS se le conoce también como no persistente o reflejado, y es por mucho el más común. Estos agujeros aparecen cuando los datos provistos por un cliente web son usados inmediatamente en el lado del servidor para generar una página de resultados para el usuario. Si los datos no validados por el usuario son incluidos en la página resultante sin codificación HTML, se le permite al cliente inyectar código en la página dinámica.
Un ejemplo clásico de este tipo es en los motores de búsqueda, si alguno busca una cadena que incluya caracteres especiales HTML, comúnmente la cadena de búsqueda será formateada para representar lo que se buscó, o al menos incluirá los términos de la búsqueda en la caja de texto para ser editados. Si las ocurrencias de los términos no son codificados como entidades HTML existe un agujero XSS.
Esto no parecería un problema dado que los usuarios son los únicos que pueden inyectar código en sus propias páginas. Pero con un pequeño esfuerzo de ingeniería social, un atacante puede convencer a alguien de seguir una URL que se encargue de inyectar el código en esta página de resultados, dando al atacante acceso completo al contenido de la página.
La mejor forma de proteger una aplicación de ataques XSS es asegurarse de que la aplicación valide todas las cabeceras, cookies, queries a la base de datos, campos de las formas (entre estos los campos ocultos). Es decir, todos los parámetros entrantes teniendo como referencia una especificación rigurosa de lo que debe ser permitido.
De ninguna manera el proceso de validación debe intentar identificar el contenido peligroso y removerlo, filtrarlo o sanearlo. Existen muchos tipos de contenido activo o peligros y muchas maneras de codificarlo para burlar los filtros para este tipo de contenido.
Se recomienda ampliamente utilizar un esquema positivo de política de seguridad (listas blancas) que especifique de forma clara lo único que es permitido.
Las políticas de lista negra son complicadas de mantener actualizadas y siempre con posibilidades de quedar incompletas.
Codificar la salidas que dependan de los datos provistos por el usuario es una manera eficaz de evitar vulnerabilidades XSS previniendo la transmisión de scripts insertados a usuarios en una forma ejecutable.
Las aplicaciones pueden ganar protección de los ataques basados en JavaScript convirtiendo los caracteres especiales en su equivalente codificado en entidad HTML.
  1. < &lt; or &#60;
  2. > &gt; or &#62;
  3. & &amp; or &#38;
  4. " &quot; or &#34;
  5. ' &apos; or &#39;
  6. ( &#40;
  7. ) &#41;
  8. # &#35;
  9. % &#37;
  10. ; &#59;
  11. + &#43;
  12. &#45;
No creamos que con la codificación de las salida con esta lista negra es una protección suficiente. Es preferible utilizar un esquema de lista blanca como la función HTMLEntityEncode de Java.
Además es crucial deshabilitar el soporte de HTTP TRACE en los servidores web (Apache, IIS, etc.) al hacerlo evitaremos que el servidor devuelva los parámetros de la solicitud errónea recibida.

Cross-Site Request Forgeries
Este tipo de ataque permite al atacante enviar peticiones HTTP a voluntad desde la máquina de la víctima. Por la naturaleza de este tipo de ataques, es difícil determinar cuando una petición HTML se ha originado por un ataque de este tipo.
Cuando un atacante conoce el formato que debe tener una URL para lograr la ejecución de una acción en el sistema, ha logrado encontrar la posibilidad de explotar este tipo de ataques. Ahora lo que necesita el atacante es simplemente hacer que una víctima visite la URL.
Un recurso que se utiliza comúnmente para realizar este tipo de ataques en tener embebida la petición en una imagen.
El atacante sólo necesita crear alguna etiqueta HTML del siguiente tipo:
<img src="http://ejemplo.org/compra.php?param=valor&param2=valor" />
Existen acciones que podemos tomar para contrarrestar este tipo de ataques, una de estas es preferir el método POST para el procesamiento de formas en lugar del GET, otra posibilidad es solicitar confirmación por parte del solicitante antes de realizar los procesos (a costa de reducir la usabilidad en la aplicación).
Otra posibilidad es considerar sospechosa una petición que no ha sido el resultado de una demanda previa de la forma necesaria para enviar esa petición.


Envío de Formas falsificadas
Falsificar una forma es casi tan fácil como manipular una URL. En el fondo, el envío de una forma emplea el mismo mecanismo, la petición HTTP enviada por el navegador al servidor. El formato con el que va a contar la petición se encuentra predeterminado por la forma y algunos de los datos enviados en la petición son dados por el usuario.
Un atacante podría copiar el código fuente de una página, salvarla en su equipo, y modificar el atributo de la acción que realizará la forma incluyendo ahora la ruta absoluta de la página originalmente deseada. Ahora el atacante puede quitar restricciones originales que se hubieran ejecutado en el cliente, como el tamaño máximo de un archivo adjunto, desactivar la validación de datos en el lado del cliente, alterar los elementos ocultos o los tipos de datos de los elementos de la forma. Operando de esta forma podemos enviar datos arbitrarios al servidor, de una manera sencilla y sin el uso de herramientas sofisticadas.
Este tipo de falsificaciones es algo que no podemos prevenir, pero es algo que debemos tomar en cuenta. Mientras tengamos el poder de filtrar las entradas, los usuarios deben jugar con nuestras reglas.

Peticiones HTTP Falsificadas
Un ataque más sofisticado que el anterior es enviar peticiones falsas empleando herramientas especiales para este propósito. La existencia de este tipo de ataques es una prueba determinante de que los datos enviados por los usuarios no son dignos de ninguna confianza.
¿Como puede un atacante enviar una petición HTTP falsa de forma arbitraria? El proceso es simple. Empleando una herramienta de línea de comandos presente en la mayoría de las plataformas se posibilita la comunicación directa con un servidor remoto, conectándonos en el puerto en el cual el servidor escucha (para servicios web típicamente es el puerto 80).
Los dos últimos tipos de ataques mencionados son una muestra de que el usuario no esta obligado a enviar la información siguiendo las reglas que han sido definidas en la aplicación. En realidad un atacante puede confeccionar a gusto sus peticiones HTTP, la fortaleza de nuestro sistema será medible por su capacidad de detectar que peticiones recibidas deben ser escuchadas y procesadas de acuerdo a los parámetros y valores de éstos que es esperable recibir.



Seguridad de las Aplicaciones y su relación con las Bases de Datos
La mayoría de las aplicaciones web son usadas como un conducto entre muchas fuentes de datos y el usuario, esto es, las aplicaciones web son usadas frecuentemente para interactuar con una base de datos.
Aunque el tema de la seguridad en las bases de datos merece un tratamiento diferente al de las aplicaciones web, se encuentran íntimamente relacionados.
Como hemos mencionado en secciones anteriores, toda entrada al sistema debe ser filtrada, y toda salida escapada. Lo mismo aplica cuando las entradas o salidas son de o hacia una base de datos.
Muchos programadores no dan importancia al filtrado de datos provenientes de una consulta a la base de datos, debido a que consideran a esta fuente como confiable. Aunque el riesgo a primera vista parecería menor, es una práctica recomendable no confiar en la seguridad de la base de datos e implementar la seguridad a fondo y con redundancia. Si algún dato malicioso pudiera haber sido inyectado a la base de datos, nuestra lógica de filtrado puede percatarse de ello, pero sólo si se ha implementado este mecanismo.



Exposición de Credenciales de Acceso

Uno de los asuntos principales a ser cuidados cuando se utiliza una base de datos es el almacenamiento de las credenciales de acceso a ella.
Por conveniencia, estos datos son almacenados en un archivo como db.inc.
<?php

    $db_user = 'myuser'; $db_pass = 'mypass'; $db_host = '127.0.0.1';
    $db = mysql_connect($db_host, $db_user, $db_pass); ?>


Los datos de usuario y password son sensibles, por lo que deben tener garantizada una atención especial. Su presencia en el código fuente es un riesgo inevitable.

Si miramos en el archivo por default http.confg de Apache, encontramos que el tipo default es text/plain. Esto significa un riesgo si el archivo db.inc se localiza en la raíz del directorio. Todo recurso localizado en la raíz tiene una dirección URL y como Apache no tiene un tipo de contenido asociado a los archivos .inc la respuesta del servidor será devolver el contenido en texto plano del archivo, en donde se podrían observar las credenciales del servidor.
La mejor solución a este problema es almacenar los archivos a incluir en otro lugar fuera del directorio raíz. No es necesario tenerlos en algún lugar en particular en el sistema de archivos para ser capaces de incluirlos o requerirlos, solo es necesario garantizar que el servidor tenga privilegios de lectura.
De hecho únicamente debemos localizar en la raíz los recursos que deseemos sean accesibles, es un directorio público.
Si por alguna razón no fuera posible localizar al archivo fuera del directorio raíz, es necesario configurar Apache para rechazar las peticiones de recursos con extensión .inc:
<Files ~ "\.inc$"> Order allow,deny Deny from all </Files>



SQL Injection
La inyección de código SQL es una de las vulnerabilidades más comunes en aplicaciones PHP. Una vulnerabilidad de SQL Injection requiere dos fallas por parte del programador:
  1. Fallas en el filtrado de los datos.
  2. Fallas en el escapado de los datos al enviarlos a la base de datos (escapado de salida).
Ninguno de estos pasos cruciales debe ser omitido, y los dos pasos requieren especial atención para poder minimizar los errores. Afortunadamente los ataques de SQL Injection son fácilmente evitables, mientras filtremos y escapemos las salidas. Filtrar las entradas depende enteramente en el tipo de los datos a filtrar, el escapado por su parte requiere una sola función. Existen funciones predefinidas para cada tipo de base de datos, pero de no encontrar ninguna, la función addslashes() puede ser un buen último recurso.

Exposición de datos
Una de las preocupaciones más comunes relacionadas con las bases de datos es la exposición de datos sensibles. Al almacenar números de tarjetas de crédito, o algo tan delicado, es preferible asegurarse que los datos almacenados en la base de datos se encuentran seguros e inaccesibles incluso para los administradores de la base.
Una buena recomendación es encriptar los datos más sensibles, de esta manera si la base de datos llega a ser comprometida el desastre será menor. Un ejemplo de esta técnica es almacenar las contraseñas de usuario convertidas con md5. De esta manera, los cadenas de las claves almacenadas en la base de datos como md5 no son útiles al atacante para conocer contraseñas que le permitirían el acceso al sistema ya que no es posible conocer la cadena de texto original.
  • Páginas Privadas y los Sistemas de Autenticación
La autenticación es el proceso por el cual la identidad de un usuario en el sistema es validada. Comúnmente el procedimiento involucra un nombre de usuario y una contraseña a revisar. Una vez autenticado el usuario es registrado (logeado) como un usuario que se ha autenticado. Muchas aplicaciones tienen recursos que son accesibles sólo para los usuarios autenticados, recursos que son accesibles únicamente para los administradores y recursos totalmente públicos.
El control de acceso debe encontrarse totalmente integrado al diseño original. No debe ser algo improvisado sobre una aplicación ya existente.

Ataques de Fuerza Bruta
Un ataque de este tipo agota todas las posibilidades sin preocuparse por cuales opciones son las que tienen mayor probabilidad de funcionar.
En los términos del control de acceso, generalmente encontramos al atacante intentando registrarse mediante un gran número de pruebas. En algunos casos el atacante puede conocer nombres de usuario válidos y la contraseña es la única parte que se trata de adivinar.
Limitar el número de intentos que se le permite al usuario tratar de adivinar es una medida efectiva en contra de estos ataques, pero tiene por desventaja de poder afectar el uso del sistema a usuarios legítimos. Una propuesta un poco más considerada con el usuario seria intentar encontrar patrones en las peticiones enviadas por el atacante y únicamente bloquear el uso de la cuenta para peticiones que cumplan con dicho patrón, de esta forma se interfiere menos el uso al usuario legítimo.
Otra opción sería imponer un intervalo de tiempo pequeño (ejemplo 15 segundos) que se debe esperar para poder intentar registrarse en el sistema de nuevo después de una falta en la autenticación. De esta manera, se niega el acceso sin importar si se presentaron las credenciales fue correcta, por supuesto que no se le dice al atacante la razón por la que se le negó el acceso para evitar lo intente de nuevo cuando haya terminado el plazo de espera. Trabajando de esta forma, se busca reducir el tiempo útil que tiene el atacante para intentar adivinar las credenciales de acceso.


Espionaje de Contraseñas (Password Sniffing)
Cuando un atacante tiene los medios para analizar el t?afico entre los usuarios y el servidor de la aplicación, debemos preocuparnos por la exposición que pueden tener los datos en el trayecto, sobretodo cuando se trata de credenciales de acceso.
Una manera efectiva de prevenir este tipo de problemas es usar SSL para proteger los contenidos enviados en las peticiones y respuestas en HTTP. Debemos considerar utilizar esta tecnología tanto para cuando se envíen las credenciales de acceso como los identificadores de una sesión ya establecida, de esta forma evitamos un secuestro de la sesión.
Usar SSL para proteger el envío de HTML es además una medida útil para brindar confianza a los usuarios de enviar sus datos cuando ven en su navegador el uso de https.

Registros persistentes
Cuando un usuario permanece en el estado de registrado después de un tiempo no razonable (cuando la sesión expiró por ejemplo), tenemos un problema de registros persistentes.
Este tipo de problemas disminuyen la seguridad de nuestro mecanismo de autenticación. Generalmente estos problemas son causados por una cookie persistente, o un ticket enviado al usuario para hacer referencia a la sesión de registro establecida que no se considera como expirado jamás o que no cambia en cada nuevo registro establecido por el usuario.
Si el ticket de acceso permanece constante para cualquier sesión establecida tenemos un problema serio, la manera más sencilla de evitarlo es haciéndolo dependiente de una variable aleatoria.
Otra medida recomendable es requerir la contraseña del usuario cuando vaya a realizar alguna tarea administrativa importante en el sistema. Con este esquema se permite el acceso únicamente a los recursos que no son tan sensibles.
Otro paso indispensable es efectivamente eliminar la cookie de acceso cuando un usuario solicita salir del sistema.


Conclusiones

La seguridad en aplicaciones Web involucra principalmente al desarrollador, aunque con gran frecuencia se encuentran defectos que pueden ser aprovechados por atacantes en las tecnologías en que se basan los sistemas web,  la atención principal debe dirigirse a los defectos propios al desarrollo nuestras aplicaciones.

La variedad de problemas es grande, pero las medidas para evitar la mayoría de estos problemas son las mismas (filtrar y escapar), con las debidas precauciones y considerando los efectos que entradas contaminadas pueden provocar en el funcionamiento de la aplicación para cada caso podemos disminuir la probabilidad de sufrir ataques. Otro tipo de problemas, como los procesos de autenticación tienen consideraciones propias que debemos implementar para hacer más robusta y confiable nuestra aplicación.




ELABORADO POR: YURIZBETH PRÓSPERO BARRAZA

sábado, 9 de mayo de 2015

PROCEDIMIENTOS ALMACENADOS



 
PROCEDIMIENTO ALMACENADO

 
Un procedimiento almacenado de SQL Server es un grupo de una o varias instrucciones Transact-SQL o una referencia a un método de Common Runtime Language (CLR) de Microsoft .NET Framework. Los procedimientos se asemejan a las construcciones de otros lenguajes de programación, porque pueden:
  • Aceptar parámetros de entrada y devolver varios valores en forma de parámetros de salida al programa que realiza la llamada.
  • Contener instrucciones de programación que realicen operaciones en la base de datos. Entre otras, pueden contener llamadas a otros procedimientos.
  • Devolver un valor de estado a un programa que realiza una llamada para indicar si la operación se ha realizado correctamente o se han producido errores, y el motivo de estos.
Ventajas de usar procedimientos almacenados
  •  Mayor seguridad
  • Reutilización del código
  • Mantenimiento más sencillo
  • Rendimiento mejorado


 
 
Sentencias preparadas
 

Las sentencias preparadas de JDBC permiten la “precompilación” del código SQL antes de ser ejecutado, permitiendo consultas o actualizaciones más eficientes. En el momento de compilar la sentencia SQL, se analiza cuál es la estrategia adecuada según las tablas, las columnas, los índices y las condiciones de búsqueda implicados. Este proceso, obviamente, consume tiempo de procesador, pero al realizar la compilación una sola vez, se logra mejorar el rendimiento en siguientes consultas iguales con valores diferentes.
 
Otra ventaja de las sentencias preparadas es que permiten la parametrización: la sentencia SQL se escribe una vez, indicando las posiciones de los datos que van a cambiar y, cada vez que se utilice, le proporcionaremos los argumentos necesarios que serán sustituidos en los lugares correspondientes. Los parámetros se especifican con el carácter ‘?’.

public class Actualizacion{
private PreparedStatement sentencia;
 
 
public void prepararInsercion(){
String sql = "insert into personas values ( ?, ? ,? )";
sentencia = conexion.prepareStatement(sql);
}
 
 
public void insertarPersona(String nombre, dirección, telefono)
{
sentencia.setString(1, nombre);
sentencia.setString(2, direccion);
sentencia.setString(3, telefono);
sentencia.executeUpdate();
}
}

Al utilizar esta clase, obviamente, deberemos llamar primero al método que prepara la inserción, y posteriormente llamar tantas veces como sea necesario al método insertarPersona.

Se definen tres parámetros en la sentencia SQL, a los cuales se hace referencia mediante números enteros consecutivos:

String sql = "insert into personas values ( ?, ? ,? )";

La clase PreparedStatement incluye un conjunto de operaciones de la forma setXXXX(), donde XXXX es el tipo de dato para los campos de la tabla. Una de esas operaciones es precisamente setString() que inserta la variable en un campo de tipo cadena.
 
 
TRANSACCIÓN
 




  
Una transacción es una interacción con una estructura de datos compleja, compuesta por varios procesos que se han de aplicar uno después del otro. La transacción debe realizarse de una sola vez y sin que la estructura a medio manipular pueda ser alcanzada por el resto del sistema hasta que se hayan finalizado todos sus procesos.
 

Propiedades

Las transacciones deben cumplir cuatro propiedades ACID:
  1. Atomicidad (Atomicity): es la propiedad que asegura que la operación se ha realizado o no, y por lo tanto ante un fallo del sistema no puede quedar a medias.
  2. Consistencia (Consistency): es la propiedad que asegura que sólo se empieza aquello que se puede acabar. Por lo tanto, se ejecutan aquellas operaciones que no van a romper la reglas y directrices de integridad de la base de datos.
  3. Aislamiento (Isolation): es la propiedad que asegura que una operación no puede afectar a otras. Esto asegura que la realización de dos transacciones sobre la misma información nunca generará ningún tipo de error.
  4. Permanencia (Durability): es la propiedad que asegura que una vez realizada la operación, ésta persistirá y no se podrá deshacer aunque falle el sistema.
La forma algorítmica que suelen tener las transacciones es la siguiente:
iniciar transacción (lista de recursos a bloquear)
ejecución de las operaciones individuales.
if (todo_ok){
 aplicar_cambios
}
else{
 cancelar_cambios
}
En cualquier momento, el programa podría decidir que es necesario hacer fallar la transacción, con lo que el sistema deberá revertir todos los cambios hechos por las operaciones ya hechas. En el lenguaje SQL se denomina COMMIT a aplicar_cambios y ROLLBACK a cancelar_cambios.
Las transacciones suelen verse implementadas en sistemas de bases de datos y, más recientemente, se han visto incorporadas a como gestiona un sistema operativo la interacción con un sistema de archivos (como varias características de las bases de datos, debido a que son muy similares arquitectónicamente).

 

Crear conexiones a bases de datos de Access

Visual Studio .NET 2003
Para conectarse a una base de datos de Access, utilice el Proveedor OLE DB de Microsoft Jet 4.0.
Nota de seguridad   El almacenamiento de los detalles de la cadena de conexión (como el nombre de servidor, el nombre de usuario y la contraseña) puede afectar a la seguridad de la aplicación. El uso de la Seguridad integrada de Windows es un modo más seguro de controlar el acceso a una base de datos. Para obtener más información, vea Seguridad de bases de datos.
Existen dos maneras de conectarse a una base de datos de Access:
  • Visualmente, con herramientas de tiempo de diseño.
  • Mediante programación.

Conectar a una base de datos de Access en el Explorador de servidores

El establecimiento de una conexión con una base de datos de Access en el Explorador de servidores permite crear fácilmente objetos OleDbConnection, OleDbDataAdapter y OleDbCommand arrastrando objetos de datos desde el Explorador de servidores hasta los formularios o diseñadores.
Para crear una conexión en el Explorador de servidores
  1. En el Explorador de servidores, haga clic con el botón secundario en Conexiones de datos y, a continuación, en Agregar conexión.
  2. En el cuadro de diálogo Propiedades de vínculo de datos, elija la ficha Proveedor.
  3. Haga clic en Proveedor OLE DB de Microsoft Jet 4.0 y después en Siguiente.
  4. Haga clic en el botón de puntos suspensivos (...) para buscar el archivo de Microsoft Access (.mdb) al que desea obtener acceso.
  5. Escriba el Id. de usuario que desea utilizar para la autenticación cuando inicie una sesión en el origen de datos.
  6. Escriba la Contraseña que desea utilizar para la autenticación cuando inicie una sesión con el origen de datos.
  7. Haga clic en Aceptar.

Conectar con una base de datos de Access desde la aplicación

La creación de conexiones a orígenes de datos desde la aplicación se puede llevar a cabo visualmente utilizando las herramientas de tiempo de diseño de Visual Studio .NET (incluidos el Explorador de servidores y el Cuadro de herramientas) o mediante programación, creando objetos de conexión a datos en el código.

Conectar a una base de datos de Access Visualmente

Visual Studio admite la creación de objetos de datos arrastrando elementos desde el Explorador de servidores o la ficha Datos del Cuadro de herramientas hasta el formulario o diseñador.
Para crear una conexión desde el Explorador de servidores
  1. Cree una Conexión de datos en el Explorador de servidores para la base de datos de Access. Para obtener más información, vea la sección anterior titulada "Conectar a una base de datos de Access en el Explorador de servidores".
  2. Arrastre la conexión desde el Explorador de servidores hasta el formulario o diseñador.
Aparecerá un objeto OleDbConnection en la bandeja de componentes.
  1. Avance hasta la sección "Pasos siguientes" que aparece más adelante en este tema.
Para crear una conexión desde la ficha Datos del Cuadro de herramientas
  1. Arrastre un objeto OleDbConnection hasta el formulario o diseñador.
Aparecerá un objeto OleDbConnection no configurado en la bandeja de componentes.
  1. En la ventana Propiedades, haga clic en la propiedad ConnectionString.
  2. Siga uno de los procedimientos siguientes:
    • Haga clic en una conexión existente en la lista desplegable.
O bien
    • Haga clic en Nueva conexión para abrir Propiedades de vínculo de datos (Cuadro de diálogo) y configure una conexión nueva.
  1. Avance hasta la sección "Pasos siguientes" que aparece más adelante en este tema.

Conectar a una base de datos de Access mediante programación

Puede crear un objeto OleDbConnection directamente en el código.
Para crear una conexión mediante programación entre la aplicación y una base de datos de Access
  • El código siguiente crea un objeto OleDbConnection, define la propiedad OleDbConnection.ConnectionString y abre la conexión.
' Visual Basic
Public Sub ConnectToAccess()
    Dim conn As New System.Data.OleDb.OleDbConnection()
    ' TODO: Modify the connection string and include any
    ' additional required properties for your database.
    conn.ConnectionString = & _
    "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & _
    "C:\Documents and Settings\username\My Documents\dbFile.mdb"
    Try
       conn.Open()
       ' Insert code to process data.
    Catch ex As Exception
       MessageBox.Show("Failed to connect to data source")
    Finally
       conn.Close()
    End Try
End Sub
 
// C#
public void ConnectToAccess()
{
    System.Data.OleDb.OleDbConnection conn = new 
        System.Data.OleDb.OleDbConnection();
    // TODO: Modify the connection string and include any
    // additional required properties for your database.
    conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
        @"Data source= C:\Documents and Settings\username\" +
        @"My Documents\AccessFile.mdb";
    try
    {
        conn.Open();
        // Insert code to process data.
    }
        catch (Exception ex)
    {
        MessageBox.Show("Failed to connect to data source");
    }
    finally
    {
        conn.Close();
    }
}

 

 Elaborado por:  Yurizbeth Prospero Barraza