miércoles, 12 de octubre de 2011

Raman Sharma: Building Metro Style Apps with C++ and JavaScript



Creating a Metro style app with Javascript doesn't mean Javascript is the only language you can use. There are several reasons to leverage compiled code as well, which will be covered in this session. Learn how your Metro style app with HTML5 can directly access native code. We'll show you how to access your C++ Windows Runtime components from JavaScript. After this talk, you'll understand how to combine native and script code in order to build the most compelling Metro style apps.

BitSquatting : Phising por errores en bits

Voy a hablar de Bitsquatting. Esta es una forma de ciberocupación (generalmente usada para robo de credenciales o phising) que se basa en los errores de bits aleatorios en el área de memoria que almacena el nombre de dominio de una dirección de Internet mencionada.

A diferencia de TypoSquatting, que explota los errores que cometen los usuarios cuando se escribe una dirección web en un navegador web, bitsquatting explota el caso raro de que en el Hardware se produce un error, en este caso error de un cambio de bit (Se cambia un 0 por 1 o viceversa).

Aquellos que deseen explotar typosquatting general, registro de nombres de dominio que son fáciles de escribir mal en un teclado QWERTY normal (Por ejemplo wikipeda.org en lugar de wikipedia.org). Bitsquatters, por el contrario, suelen registrar nombres de dominio que difieren de un dominio ya existente por un solo bit de información.

Por ejemplo, un bitsquatter que desee robar credenciales en Wikipedia podría registrar “wikipmdia.org”, ya que el patrón de bits de ‘m’ minúscula es el 1101101, que difiere sólo en un solo bit del patrón de bits de la minúscula «e», que es 1100101.

En el caso improbable, pero posible (recordad en Internet hay millones de peticiones diarias), se puede producir que un error de bit al azar cambia el cuarto bit 0 a 1 en la posición de memoria que almacena la letra ‘e’ en la cadena “wikipedia.org”, ya sea en el navegador web del usuario o la caché de DNS. El usuario en principio no se daria cuenta que esta en un sitio falso, ya que la URL se escribio correctamente.

Este error puede agravarse, si se produce en el servidor DNS en lugar de en la memoria del PC local, ya que en el caso del servidor DNS, propagaria el error a todos aquellos que realizaran una petición.

Vulnerabilidad en el protocolo SSL

Una importante vulnerabilidad ha sido descubierta en el protocolo SSL (Secure Sockets Layer), que protege la mayoría de los sitios Web. El agujero de seguridad permite a los atacantes descifrar los datos que se pasan entre un servidor Web y el navegador del usuario.

La vulnerabilidad reside en las versiones 1.0 y anteriores de TLS (Transport Layer Security), base de confianza en la seguridad de las conexiones en Internet. Aunque las versiones 1.1 y 1.2 de TLS, no son vulnerables, la mayoría de los navegadores y sitios Web no las soportan. Por este motivo, las transacciones cifradas en portales como PayPal, GMail y otros muchos, son vulnerables al espionaje de los hackers, que pueden controlar la conexión entre el usuario final y el sitio web que está visitando.

En la conferencia de seguridad ekoparty (Buenos Aires), los investigadores Duong y Juliano Rizzo, van a realizar una demostración con un código al que denominan BEAST, abreviatura de Browser Exploit Against SSL/TLS.

BEAST emplea javascript y un sniffer de red para descifrar las cookies y acceder a cuentas restringidas de usuario. El exploit funciona incluso contra sitios que emplean HSTS (HTTP Strict Transport Security), que impide que las páginas se carguen si no están protegidas por SSL.

En la demostración, va a descifrarse una cookie de autenticación utilizada para acceder a una cuenta de PayPal, según ha manifestado Duong. Según confirma la fuente del artículo, dos días después del anuncio, Google ha realizado una actualización en la versión de desarrollo de Chrome, diseñada para frustrar este ataque.

Nuevo troyano secuestra el PC simulando provenir de Microsoft




PandaLabs, el laboratorio de malware de Panda Security, – The Cloud Security Company – ha descubierto un nuevo troyano del tipo ransomware que simula proceder de Microsoft. El troyano, bautizado como Ransom.AN, alerta al usuario de que su copia de Windows no es legal y amenaza con inutilizar el dispositivo si no se introduce un código específico, el cual, se le facilitará al usuario tras pagar la suma de 100 euros.

Este malware, dirigido específicamente a usuarios de habla alemana, puede distribuirse de múltiples formas, siendo las más utilizadas mensajes de spam y descargas P2P. Tras alertar al usuario de que su copia de Windows no es legítima, le informa de las posibilidades de pago invitándolo a realizarlo a través de una página web maliciosa, donde se le solicitarán los datos de su tarjeta de crédito. Incluso, para incentivar el pago, Ransom.AN amenaza a la víctima comunicándole que la fiscalía ya cuenta con sus datos para tomar medidas si no se realiza el pago antes de que expire un plazo de 48 horas, tras el cual además se perdería toda la información de la PC.

“Este tipo de troyanos son muy peligrosos ya que una vez infectado el equipo, es tremendamente complicado eliminarlo de forma manual, lo que obliga a muchos usuarios a pagar el rescate o formatear la PC”, comenta Luis Corrons, Director Técnico de Pandalabs, que añade: “Además, al simular proceder de Microsoft y amenazar con actuaciones de las autoridades, muchos usuarios creerán lo que dice el troyano y realizarán el pago sin dudarlo, para no buscarse problemas”.

“Seguridad por niveles” : libro Creative Commons

Se ha publicado “Seguridad por niveles“, un libro que desarrolla todos los temas de interés para profundizar en Seguridad de la Información, presentándolo desde el modelo de capas TCP/IP y con una gran cantidad de ejercicios, herramientas y prácticas.

Le he estado dando un vistazo y sus mas de 700 paginas tienen contenidos interesantes para cualquier estudiante de seguridad. El libro esta liberado bajo licencia Creative Commons, para su libre descarga y difusión sin fines de lucro.

Descargalo aqui: http://darfe.es/CMS/index.php?module=Descargas&func=prep_hand_out&lid=85

Microsoft's "Oslo" project




Microsoft's "Oslo" project aims at creating a unified platform for model-based, service-oriented applications. This new approach will affect the next versions of several products and technologies, including the Microsoft .NET Framework, Microsoft Visual Studio, Microsoft BizTalk Server, Microsoft System Center, and more. Although many details of "Oslo" won't be public until later in 2008, this session provides an overview of what Microsoft has revealed so far. Along with a description of the problems it addresses, the session includes a look at several new "Oslo" technologies, including a general-purpose modeling language, role-specific modeling tools, a shared model repository, and a distributed service bus. With David Chappell and Ron Jacobs.

jueves, 10 de febrero de 2011

Porque debería usar PHP’s PDO Para acceder a Bases de Datos? Parte 2

Insertar y actualización
Inserción de nuevos datos o actualizar los datos existentes es una de las operaciones de base de datos más comunes. Uso de DOP, esto es normalmente un proceso de dos pasos. Todo lo descrito en esta sección se aplica por igual tanto INSERT como para UPDATE.

Aquí un ejemplo del tipo más básico de inserción:

# STH means "Statement Handle"
$STH = $DBH->prepare("INSERT INTO person ( first_name ) values ( 'Cathy' )");
$STH->execute();

También se puede realizar la misma operación utilizando el método exec(). En la mayoría de los casos, usted va a utilizar el método más largo para lograr tomar ventaja de declaraciones preparadas. Incluso si sólo va a utilizarla una vez, ya que las declaraciones preparadas le ayudarán a protegerse de los ataques de inyección SQL.

Sentencias preparadas
El uso de declaraciones preparadas le ayudará a protegerse de la inyección de SQL.


Una declaración preparada es una instrucción SQL precompilada que se pueden ejecutar varias veces mediante el envío sólo de datos al servidor. Tiene la ventaja adicional de establecer de forma automática los datos utilizados en los marcadores de posición asegurándonos así de un ataque de inyección SQL.
Utilice una declaración preparada mediante la inclusión de marcadores de posición (parámetros) en su instrucción SQL. Veamos 3 ejemplos: uno sin marcadores de posición, uno con marcadores de posición sin nombre, y uno con marcadores de posición con nombre.


// sin marcadores de posición
$STH = $DBH->("INSERT INTO person (name, addr, city) values ($name, $addr, $city)");

# usando marcadores de posición sin nombre
$STH = $DBH->("INSERT INTO person (name, addr, city) values (?, ?, ?) ");

# usando marcadores de posición con nombre
$STH = $DBH->("INSERT INTO person (name, addr, city) value (:name, :addr, :city)");


Es recomendable evitar el primer método, que se utiliza aquí para la comparación. La opción de usar marcadores con nombre o sin nombre afectará la forma de configurar los datos en las instrucciones SQL.

Marcadores de posición sin nombre


$STH->bindParam(1, $name);
$STH->bindParam(2, $addr);
$STH->bindParam(3, $city);

$name = "Daniel"
$addr = "1 Wicked Way";
$city = "Arlington Heights";
$STH->execute();

$name = "Steve"
$addr = "5 Circle Drive";
$city = "Schaumburg";
$STH->execute();



Contamos con dos pasos para ejecutar nuestras sentencias SQL. En primer lugar, asignamos variables diferentes a los marcadores de posición (líneas 2-4). Luego, asignamos valores a los marcadores de posición y por ultimo ejecutamos nuestra sentencia SQL. Para ejecutar otra sentencia SQL solo será necesario cambiar los valores de las variables y ejecutar nuevamente la sentencia SQL.

¿Esto parece un poco difícil de manejar para las sentencias con una gran cantidad de parámetros? Eso es cierto. Sin embargo, si los datos se almacenan en una matriz, hay una opción más corta:


$data = array('Cathy', '9 Dark and Twisty Road', 'Cardiff');

$STH = $DBH->("INSERT INTO person (name, addr, city) values (?, ?, ?);
$STH->execute($data);



Waao, Que fácil!
Los datos de la matriz se aplican a los marcadores de posición en orden secuencial. $data[0] será asignado al primer marcador de posición, $data[1],en el segundo, etc Sin embargo, si los índices de matriz no están en orden, esto no funcionará muy bien que digamos, y se tendrá que volver a indexar la matriz.

Marcadores de posición con nombre
Probablemente se podría adivinar la sintaxis, pero aquí dejo un ejemplo:


$STH->bindParam(':name', $name);


Aquí también se puede utilizar una matriz (array), pero en este caso trabaja con las matrices asociativas. Ejemplo:


$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' );

# the shortcut!
$STH = $DBH->("INSERT INTO person (name, addr, city) value (:name, :addr, :city)");
$STH->execute($data);


No es necesario que las claves de la matriz comiencen con dos puntos, pero todo lo demás es necesario para lograr que coincidan los valores en los marcadores de posición con nombre. Si usted tiene una matriz de matrices se puede iterar sobre cada una de ellas, y simplemente ejecute su sentencia SQL con cada conjunto de datos.

Otra característica interesante de los marcadores de posición con nombre es la posibilidad de insertar objetos directamente en la base de datos, suponiendo que las propiedades del objeto coinciden con los campos con nombre. Veamos un ejemplo con un objeto y cómo añadirlo:


class person {
public $name;
public $addr;
public $city;

function __construct($n,$a,$c) {
$this->name = $n;
$this->addr = $a;
$this->city = $c;
}
# ...
}

$cathy = new person('Cathy','9 Dark and Twisty','Cardiff');

$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
$STH->execute((array)$cathy);




Se convierte el objeto en una matriz y se ejecuta la sentencia SQL, las propiedades son tratadas como claves de matriz.

Seleccionando datos

Los datos se obtienen a través del metodo -> fetch (), el cual es un método de nuestro identificador de instrucción. Antes de llamar a fecth(), lo mejor es decirle PDO cómo quieres obtener los datos. Para lo cual se cuenta con las siguientes opciones:
PDO:: FETCH_ASSOC: devuelve una matriz indexada por nombre de columna
PDO:: FETCH_BOTH (por defecto): devuelve una matriz indexada por nombre y número de columna
PDO:: FETCH_BOUND: Asigna los valores de las columnas a las variables definidas con el metodo ->bindColumn()
PDO:: FETCH_CLASS: Asigna los valores de las columnas a las propiedades de la clase. Se crearan las propiedades si no existen
PDO:: FETCH_INTO: Actualiza una instancia existente de la clase especificada.
PDO:: FETCH_LAZY : Combina PDO:: FETCH_BOTH/DOP:: FETCH_OBJ, creando los objetos y las variables para su uso.
PDO:: FETCH_NUM: devuelve una matriz indexada por número de columna.
PDO:: FETCH_OBJ: devuelve un objeto anónimo con nombres de propiedades que corresponden a los nombres de columna.

En realidad, hay tres que cubren la mayoría de las situaciones: FETCH_ASSOC, FETCH_CLASS y FETCH_OBJ. La sintaxis que se utiliza con el fin de establecer el método fecth() es la siguiente:


$STH->setFetchMode(PDO::FETCH_ASSOC);


FETCH_ASSOC

Este crea una matriz asociativa, indexada por nombre de columna. Esto debería ser muy familiar para cualquiera que haya usado las extensiones mysql/mysqli. Veamos un ejemplo de selección de datos con este método:


# creamos nuestra sentencia SQL
$STH = $DBH->query('SELECT name, addr, city from person);

# configuramos el modo deseado
$STH->setFetchMode(PDO::FETCH_ASSOC);

while($row = $STH->fetch()) {
echo $row['name'] . "\n";
echo $row['addr'] . "\n";
echo $row['city'] . "\n";
}


El bucle while se ejecuta hasta terminar de escribir en pantalla el resultado obtenido.

FETCH_OBJ

Este crea un objeto para cada fila de datos captados. Ejemplo:


# creamos nuestra sentencia SQL
$STH = $DBH->query('SELECT name, addr, city from person);

# configuramos el modo deseado
$STH->setFetchMode(PDO::FETCH_OBJ);

# mostramos el resultado
while($row = $STH->fetch()) {
echo $row->name . "\n";
echo $row->addr . "\n";
echo $row->city . "\n";
}


FETCH_CLASS
Las propiedades del objeto se establecen antes que el constructor sea llamado. Esto es importante.


Este método le permite recuperar los datos directamente en una clase especificada. Cuando se utiliza FETCH_CLASS, las propiedades de su objeto se establecen antes de llamar al constructor. Las propiedades que no existan como según las columnas obtenidas se crearan automáticamente.
Esto significa que si sus datos necesitan cualquier transformación después de salir de la base de datos, se pueden hacer automáticamente por su objeto, ya que cada objeto es creado.
Ejemplo, imagine una situación en la que la dirección tiene que ser parcialmente protegida por cada registro. Podemos hacer esto operando con la propiedad en el constructor. veamos:


class secret_person {
public $name;
public $addr;
public $city;
public $other_data;

function __construct($other = '') {
$this->address = preg_replace('/[a-z]/', 'x', $this->address);
$this->other_data = $other;
}
}


Como los datos se traen en esta clase, la dirección tiene caracteres entre a-z en minúscula y la sustituiremos por la letra x. Ahora, al momento de usar la clase todas las transformaciones curren de forma transparente:


$STH = $DBH->query('SELECT name, addr, city from person);
$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person');

while($obj = $STH->fetch()) {
echo $obj->addr;
}


Si la dirección es “5 Bronds”, se obtendrá “5 Bxxxxx”. Por supuesto, puede haber situaciones en las que desea que el constructor se llame antes de asignar los datos. PDO ofrece una solución ante esto también.


$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'secret_person');


Ahora, cuando se repita el ejemplo anterior con este modo establecido (PDO:: FETCH_PROPS_LATE) La dirección no se oculta, ya que el constructor se llama y las propiedades ya fueron asignadas.
Por último, si usted necesita pasar argumentos al constructor durante la obtención de datos en objetos con PDO, use el siguiente modo:


$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person', array('stuff'));


Si usted necesita para pasar datos de forma dinámica al constructor para cada objeto, puede establecer el modo al momento de ejecutar fecth():


$i = 0;
while($rowObj = $STH->fetch(PDO::FETCH_CLASS, 'secret_person', array($i))) {
$i++
}



Conclusión
Espero que estos dos artículos ayuden a muchos programadores a cambiarse de las extensiones mysql y mysqli.