En PHP es posible generar script para imitar el envío de datos a través de formularios que utilizan el método POST usando las cabeceras necesarias para que el navegador reconozca la petición. Veamos un ejemplo:
//Lleno los datos a enviar. $contenido[] = “x=$x”; $contenido[] = “y=$y”; $contenido[] = “z=$z”;
while (!feof($manejador)) { $respuesta .= fgets($manejador, 1024); }
fclose($manejador); }
Con este script podremos testear nuestros formularios o se podría usar para ingreso de datos masivos. Pero también para ataque a nuestro sitios por lo que deberíamos usar un captcha para prevenir estos ataques.
Como todos sabemos la seguridad se puede dividir en 3 aspectos:
Autenticación: que el usuario sea realmente quien dice ser.
Autorización: que el usuario pueda hacer solo lo que el tenga permiso de hacer.
Seguridad de Datos: que el usuario vea los datos que el realmente puede ver.
No todas las aplicaciones necesitan todas estos aspectos, por ejemplo una aplicación menor de una intranet no necesariamente necesita la seguridad de datos.
Vamos a atacar la autenticación. Con JSF podemos autenticar a nuestros usuarios de diferentes maneras.
Una forma es por medio del contenedor, todos los contenedores web manejan el concepto de seguridad y la posibilidad de autenticar a un usuario. Muchas aplicaciones solo necesitan la autenticación; por lo tanto lo podemos hacer a nivel contenedor. Este provee tres formas: basic, form-based, y client certificate. Veamos un ejemplo de autenticación basic, agregando las siguientes lineas al web.xml :
BASIC UserDatabase
La autenticación básica trajo con sigo el concepto de realm. Un realm es un objeto que representa al usuario y su autenticación. Realm no es un concepto estándar y se implementa de forma diferente en los contenedores. Por ejemplo en Apache Tomcat es un simple archivo xml:
Otra posible autenticación es basado en formularios, esta solución fue creada antes de JSF y no es recomendada si la autenticación debe estar integrada a la aplicación:
FORM UserDatabase /faces/login.jsp /faces/loginError.jsp
Otra posibilidad es integrar el login a nuestra aplicación. Vamos a profundizar esta opción que es la más utilizada.
Lo que deberíamos hacer es una aplicación la cual no se pueda acceder a ninguna pagina sin antes logearse, y si alguien intenta acceder a la pagina esta lo redireccionara a la pagina de login. En el login el usuario podrá logearse y así poder realizar sus tareas.
El concepto de servler filter, implementado en la versión 2.3 de servlet y redefinido en 2.4 permite operar sobre una request antes que esta sea procesada. Esto nos permite chequear si el usuario esta logueado cuando quiere acceder a alguna pagina. Entonces declaremos nuestro filtro en el web.xml:
Require that the user log in before accessing any page
other than the entry pages ForcedLoginFilter org.assembly.util.ForcedLoginFilter
public class ForcedLoginFilter implements Filter {
private static final String LOGIN_JSP = "login.jsp";
public ForcedLoginFilter() {
}
private static boolean checkLoginState(ServletRequest request,
ServletResponse response) throws IOException, ServletException {
boolean isLoggedIn = false;
HttpSession session = ((HttpServletRequest) request).getSession(false);
UserBean managedUserBean = null;
// If there is a UserBean in the session, and it has
// the isLoggedIn property set to true.
if (null != session
&& (null != (managedUserBean = (UserBean) session
.getAttribute("UserBean")))) {
if (managedUserBean.isIsLoggedIn()) {
isLoggedIn = true;
}
}
return isLoggedIn;
}
// Force the login
requestDispatcher.forward(request, response);
return;
} else {
try {
chain.doFilter(request, response);
} catch (Throwable t) {
// A production quality implementation will
// deal with this exception.
}
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
Las clases que son filtros deben implementar la interfaz Filter. En este caso lo que hace el filtro es verificar que existe el usuario en la session y si la url es redirecciónable, dado que si al ir a login redireccionamos se formara un bucle infinito.
El objeto UserBean es el encargado de representar un usuario.
Publico esta noticia de clarin, que la verdad no me gusta nada:
A pesar del avance del software libre, el Windows de Microsoft continuó dominando en 2010 el mundo de las computadoras con una cuota del 78,6% en el sector de los sistemas operativos, según el analista de mercado Gartner.
El porcentaje supera al de 2009, cuando Microsoft tenía un 77,9%. En total, el sistema operativo Windows permitió facturar a la compañía US$ 30.400 millones, lo que supone un incremento interanual del 7,8%.
Por su parte, Apple pudo elevar los aportes de sus sistemas operativos a la facturación total de 1,6 a 1,7 por ciento. Actualmente las computadoras Mac están experimentando un "boom", según Gartner, mientras que Microsoft se benefició del cambio del impopular Vista al nuevo Windows 7.
De acuerdo con Gartner, además de PCs y Mac, para su estudio tuvo también en cuenta las grandes computadoras corporativas, los llamados "servidores", donde IBM, HP o Oracle tienen mayor presencia. Entre los operadores de servidores el más popular resultó ser Linux.
Quien no tuvo que encriptar una password antes de guardarla en la base de datos? Como sabrán es una muy buena práctica guardar las password encriptadas dado que esto permite minimizar los daños a nuestros usuarios en caso que que un intruso consiga la forma de consultar la base y a la vez permite que los administradores del sistema no tengan conocimiento de las mismas, ni forma de saberlas.
Cuando trabajamos con MySQL, podemos usar las funciones md5 o sha1. Para probarlas podemos hacerlo de la siguiente forma:
> select md5('Holass');
> select sha1('Holass');
Recordemos que los algoritmos de encriptación md5 y sha1 son los más usados.
Para insertas un usuario con su password encriptado usando md5 podremos hacer lo siguiente:
> insert into usuario (nombre, clave) values ('nombre', md5('password'));
y si queremos verificar el usuario:
> select * from usuario where nombre = 'nombre' and clave = md5('password');
Además MySQL trae su propia función para encriptar llamade password:
Soy Yeta o debo ser lo, por que en este blog comente que el browser flock era el futuro de los browsers, o por lo menos era lo que pensaba. Hoy me llego un mail que flock se discontinuo, que el soporte para este browser cesara el 26 de Abril y me invita a migrar a otros browsers como firefox o chrome.
Voy a intentar no predecir el futuro de otros productos; simplemente para que no cierren.
Antes de empezar vamos a definir que es NoSQL y NewSQL.
Nos dice la wikipedia: NoSQL es un término usado en informática para agrupar una serie de almacenes de datos no relacionales que no proporcionan garantías ACID. Normalmente no tienen esquemas fijos de tablas ni sentencias "join".
"NewSQL" es la forma abreviada que nos referimos a los diversos nuevos vendedores de base de datos de alto rendimiento. Anteriormente se referian a estos productos como “ScalableSQL” para diferenciarlos de los productos de bases de datos relacionales tradicionales. Dado que esto implica escalabilidad horizontal, que no es necesariamente una característica de todos los productos.
Y para aclarar, como NoSQL, NewSQL no debe ser tomado demasiado literalmente: lo nuevo acerca de los vendedores NewSQL es el vendedor, no el SQL.
Entonces, ¿quiénes serían considerados vendedores NewSQL? Al igual que NoSQL, NewSQL se utiliza para describir un grupo de empresas o productos, lo que tienen en común es el desarrollo de nuevos productos y servicios de base de datos relacionales, diseñados para llevar los beneficios del modelo relacional a arquitecturas distribuidas, o para mejorar el rendimiento de bases de datos relacionales en la medida en que la escalabilidad es una necesidad.
Para nombrar algunas productos/empresas NewSQL: Clustrix, GenieDB, ScalArc, Goleta, VoltDB, RethinkDB, ScaleDB, Akiban, CodeFutures, ScaleBase, Translattice y NimbusDB...
Estos nuevos productos NewSQL solapan su funcionalidad con el NoSQL, permitiendo gran escalabilidad sin perder el modelo relacional y algunos productos se confunden con los productos NoSQL, haciendo la linea muy delgada.
Cual es el futuro de las bases de dato? NewSQL le ganara el puesto que gano NoSQL?
JEE y EJB proveen un conjunto de servicios que los desarrolladores pueden integrar de forma declarativa o programática. Estos servicios incluyen autorización y autenticación.
Autenticación e identificación
La autenticación es comprobar que el usuario sea quien dice ser. En un sistema EJB un usuario es asociado con una identidad segurizada, esta esta lista para ser usada por los EJB. Cuando un cliente invoca un método de un EJB, el servidor pasa la identidad del cliente con la invocación del método. Cuando el contenedor de EJB recibe la invocación valida la identidad del usuario y si este puede invocar el método invocado.
La especificación EJB no indica como se autentica. Aunque esta definido como la seguridad se propaga del cliente al servidor, no esta definido como el cliente obtiene la identidad y la credencial con una invocación EJB, tampoco define como el servidor guarda y obtiene las autenticaciones.
Cuando accedemos a un EJB muchas aplicaciones utilizan la JNDI API, por ejemplo podemos autenticar el acceso a un EJB de este modo:
En el ejemplo, el usuario es autenticado con la conexión a el “JNDI InitialContext”
Autorización.
Como sabemos en las aplicaciones no todos somos iguales, cada usuario tiene un rol ante una aplicación por ejemplo “administrador”, “empleado”, etc. y cada rol puede hacer o no determinadas acciones, es decir tiene o no tiene permiso para.
En EJB existen diferentes tipos de granularidad de permisos, puede ser por usuario o por rol. Esto permite que la autenticación sea un proceso separado de la autorización.
Los roles son definidos de forma logica y pueden representar roles, grupos de usuarios, o cualquier otro sistema de identificación. Los roles del los EJB son mapeados a los usuarios y grupos reales cuando el bean es deployado.
La autorización esta bien definida en la especificación EJB. Se declaran los roles de forma programática y luego se indican los permisos a los beans por medio de anotaciones o declararlos en ejb-jar.xml
Vimos de forma teoría la seguridad en EJB, en un próximo post vamos a hace algo más práctico.
Soy un promovedor del uso de Spring pero por X motivo estoy estudiando un poco JEE 5 y la verdad estoy sorprendido por su simpleza, cambio mucho. Lo único que critico es que el tiempo de levantar jboss o glassfish o otro servidor JEE es mayor que usar solo tomcat o jetty (obviamente).
La especificación EJB 3 deja atrás el mal sabor que tenían las anteriores versiones de EJB a la hora de desarrollar. El paso más importante ahora los EJB son pojos, que por medio de anotaciones se infiere el comportamiento. No es necesario heredar de ningún objeto, ni hacer interfaces (gracias a Dios).
Veamos los tipos de beans que existen:
Session EJB: Son los beans que tienen las acciones; son los que tienen la lógica del negocio. Este tipo de bean viene en 2 sabores Stateless (no mantiene el estado en el servidor) o Statefull (mantiene el estado en el servidor). Además se agrego un Sigleton Beans, para cuando necesitamos solo una instancia de nuestro objeto de negocio.
Message-Driven Beans: La mensajería asíncrona es un paradigma en el cual dos o más aplicaciones se se comunican mediante un mensaje que describe un evento de negocio. Estos beans pueden generar mensajes asíncronos y consumirlos.
Entity Beans: Son objetos que modelan nuestros datos (Pojos) y son persistidos por medio del javax.persistence.EntityManager. Usando JPA (descripto en JSR-317) podemos persistir nuestros entity beans como si usáramos un ORM común.
Este es un pequeño resumen de la que nos brinda EJB 3. En próximos post ampliaremos!!
La verdad es que mucho no me gusta (sera resistencia al cambio), yo pienso que le roba trabajo a los objetos, para mi debería estar esta funcionalidad en Object o de otra forma, no lo se.
Más allá de mi humilde opinión era necesaria, siempre teníamos que escribir un util que haga cosas que hora hace esta librería.
Veamos unos ejemplos:
public void showFoo(Foo foo) { Foo foo2 = new Foo();
...no voy a cambiar, no voy a cambiar mi modo ellos me dicen : "nena, nena vos lo tenes todo." Oh, negro go...
Rara forma de empezar un post del no tan famoso lenguaje de google Go!
El pequeño párrafo de la canción de los piojos “go negro go” resume un poco mi sensación con respecto a este lenguaje, es como que tiene todo pero hecho como le gusta a google. Que no digo que este mal, pero por ahí tantas vueltas de rosca no son muy buenas a veces.
El lenguaje de programación Go es un proyecto de código abierto con el objetivo de la productividad en los programadores.
Go es expresivo, conciso, limpio y eficiente. Sus mecanismos de concurrencia hace fácil escribir programas que sacan el máximo provecho a múltiples núcleos y las máquinas en red, mientras su novedoso sistema de tipado permite la construcción de programas flexibles y modulares. Compila rápidamente a código de máquina, pero tiene la comodidad del garbage collection y el poder de reflexión en tiempo de ejecución.
Veamos un ejemplo:
package main
// fib returns a function that returns // successive Fibonacci numbers. func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return b } }
func main() { f := fib() // Function calls are evaluated left-to-right. println(f(), f(), f(), f(), f()) }
La salida de este programa es: 1 2 3 5 8
Se puede ver fácilmente la influencia de python y c++
func main() { fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n") }
Go es un lenguaje compilado. Para compilar este programa podemos utilizar Gccgo que utiliza GCC. También hay una serie de compiladores para diferentes arquitecturas por ejemplo: 6g para 64-bit x86, 8g para 32-bit x86, etc. Estos compiladores corren más rapido que Gccgo pero generan codigo menos eficiente. Veamos como compilar y correr go:
$ 6g helloworld.go # compile; object goes into helloworld.6 $ 6l helloworld.6 # link; output goes into 6.out $ 6.out Hello, world; or Καλημέρα κόσμε; or こんにちは 世界 o $ gccgo helloworld.go $ a.out Hello, world; or Καλημέρα κόσμε; or こんにちは 世界