martes, 9 de septiembre de 2008

Aumenta la creatividad de los cibercriminales

La media de páginas infectadas durante el primer semestre de 2008 es tres veces mayor que en el mismo periodo de 2007.

Once millones de malware

Sophos acaba de presentar un nuevo informe de seguridad que examina las tendencias de seguridad existentes y emergentes y ha identificado que los cibercriminales están incrementando su creatividad para utilizar nuevas técnicas en sus tentativas de defraudar dinero de los usuarios de Internet.
Se estima que el total del malware existente sobrepasa los once millones, de los que Sophos recibe aproximadamente 20.000 nuevas muestras de software sospechoso cada día, lo que supone un nuevo programa malicioso cada cuatro segundos

El informe de Sophos revela que la mayor parte de los ataques han sido diseñados para intentar engañar a los sistemas de seguridad tradicionales tales como el escaneo del correo electrónico. Durante la primera mitad de 2008 se ha visto una explosión de ataques vía web, la preferida por los hackers con motivos económicos. El 90 por ciento de estas páginas, que utilizan Caballos de Troya y programas espía, son sitios web legítimos. Algunos de ellos, pertenecientes a grandes y reconocidas compañías incluidas en Fortune 500, han sido hackeadas a través de ataques de Inyecciones SQL.

Según el informe de Sophos el sitio web que más malware aloja es Blogger (Blogspot.com), el sistema de publicación de blogs, propiedad de Google, que contabiliza el dos por ciento de todo el malware que reside en sitios web a nivel mundial.

Además, el Informe de Seguridad de Sophos detalla intentos de hackers y spammers de aprovecharse de sitios Web 2.0, tales como Facebook o LinkedIn, atacar dispositivos con sistemas operativos distintos a Windows, tales como Apple Macs y Linux, y la probabilidad de ataques emergentes contra usuarios del popular iPhone de Apple.

fuente (http://www.vnunet.es)

viernes, 5 de septiembre de 2008

Aplicando SQL Parte 4

Comenzaremos con un set de 20 nuevos ejercicios para continuar nuestro tutorial de bases de datos (ver tercera parte).

Para comenzar esta parte tendremos que crear una nueva Base de datos a la cual le llamaremos empresa la que a su vez tendrá 2 tablas relacionadas empleados y departamentos.

CREATE DATABASE `empresa`;

USE `empresa`; (para proceder a crear las tablas solo si estamos en modo consola)

CREATE TABLE `departamentos` (
`CODIGODEP` INTEGER(11) ,
`NOMBREDEP` VARCHAR(100) ,
`PRESUPUESTO` INTEGER(11) ,
PRIMARY KEY (`CODIGODEP`))
ENGINE=InnoDB


CREATE TABLE `empleados` (
`RUT` VARCHAR(10) ,
`NOMBRE` VARCHAR(100) ,
`APELLIDO` VARCHAR(200) ,
`DEPARTAMENTO` INTEGER(11) ,
PRIMARY KEY (`RUT`),
) ENGINE=InnoDB

ALTER TABLE EMPLEADOS ADD FOREIGN KEY (`DEPARTAMENTO`) REFERENCES `departamentos` (`CODIGODEP`) ON DELETE CASCADE ON UPDATE CASCADE


Ahora insertaremos registros en la tablas creadas

INSERT INTO `departamentos` (`CODIGODEP`, `NOMBREDEP`, `PRESUPUESTO`) VALUES
(1,'Informatica',1000000),
(2,'Personal',9000000),
(13,'Seguridad',500000),
(56,'Recursos Humanos',5000000),
(77,'Administracion',2000000);
COMMIT;

INSERT INTO `empleados` (`RUT`, `NOMBRE`, `APELLIDO`, `DEPARTAMENTO`) VALUES
('10333444-1','Sofia','quintana',13),
('10352097-6','Maria','Contreras',77),
('11111111-1','Pedro','Tapia',2),
('12052097-0','Jorge','Lara',1),
('13456789-2','Maria','Albornoz',13),
('16152094-2','Jose','Perez',1),
('21345678-7','Manuel','Rodriguez',56),
('23567876-4','Ignacio','Carrera',2),
('6435456-6','Pedro','Asnar',56),
('7654231-9','Eliana','Soto',13);
COMMIT;

(Todos los datos son inventados y no poseen relación con personas de la vida real xD)

Ejercicios:

1. Obtener los apellidos de los empleados
Sentencia SQL:
SELECT APELLIDO FROM EMPLEADOS;
Resultado de la consulta:
2. Obtener los apellidos de los empleados sin repeticiones
Nota tendremos que crear un nuevo trabajador con un apellido repetido en este caso sera Perez para ejecutar esta consulta (esto debido a que hasta el momento no tenemos ningún apellido repetido)
INSERT INTO empleados (RUT, NOMBRE, APELLIDO, DEPARTAMENTO) VALUES ('13987345-9', 'Miguel', 'Perez', 13);

Sentencia SQL:
SELECT APELLIDO FROM EMPLEADOS GROUP BY APELLIDO;
Resultado de la consulta: (como vemos solo aparece un Perez, esto gracias al Group By)

3. Obtener todos los datos de los empleados que se apellidan Perez
Sentencia SQL:
SELECT * FROM EMPLEADOS WHERE APELLIDO = 'Perez';
Resultado de la consulta:

4. Obtener todos los datos de los empleados que se apellidan Perez y los que se apellidan Contreras
Sentencia SQL:
SELECT * FROM EMPLEADOS WHERE APELLIDO = 'Perez' or APELLIDO = 'Contreras';
Resultado de la consulta:
5. Obtener todos los datos de los empleados que trabajan en el departamento 1
Sentencia SQL:
SELECT RUT, NOMBRE, APELLIDO, DEPARTAMENTO FROM EMPLEADOS
INNER JOIN DEPARTAMENTOS
ON DEPARTAMENTO = CODIGODEP WHERE DEPARTAMENTO = 1;
Resultado de la consulta:


6. Obtener todos los datos de los empleados que trabajan para el departamento 1 y para el departamento 13

Nota Importante: Como el rut es una clave primaria no podemos repetir un trabajador en otro departamento ya que nos dará un error de llave primaria, la solución seria incluir un campo rut en la tabla departamento y con ello tendriamos mas o menos solucionado esto, pero como no lo hice al comienzo y para no crear confuciones de nuevas relaciones agregare un campo llamado departamento 2 en la tabla empleados.
ALTER TABLE EMPLEADOS ADD DEPARTAMENTO2 INTEGER DEFAULT NULL;

El valor por defecto de los campos es Null (esto es distinto a cero y a vacio) .
Ahora Asignare trabajadores a otro departamento de la empresa. (Los que estan en el departamento 1 los llevare al 13 tambien)
UPDATE EMPLEADOS SET DEPARTAMENTO2 = 13 WHERE departamento = 1;

Y ahora a ejecutar la sentencia solicitada en el ejercicio
Sentencia SQL:
SELECT RUT, NOMBRE, APELLIDO, DEPARTAMENTO, DEPARTAMENTO2 FROM EMPLEADOS
WHERE DEPARTAMENTO = 1 OR DEPARTAMENTO = 13
AND DEPARTAMENTO2 = 1 OR DEPARTAMENTO2 = 13;

Nota:
He preguntado 1 ó 13 en ambos campos para filtrar correctamete la consulta.
Resultado de la consulta:

7. Obtener todos los datos de los empleados cuyo apellido comience con P.
Sentencia SQL:
SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE 'P%';
Nota:
LIKE es otra palabra clave que se utiliza en la cláusula WHERE. Básicamente, LIKE le permite hacer una búsqueda basada en un patrón en vez de especificar exactamente lo que se desea (como en IN) o determinar un rango (como en BETWEEN).
En este caso LIKE 'P%'; entregará todos los apellidos que comienzan con P
Resultado de la consulta:

8. Obtener el presupuesto total de todos los departamentos.
Sentencia SQL:
SELECT NOMBREDEP, PRESUPUESTO FROM DEPARTAMENTOS;
Resultado de la consulta:


9. Obtener el número de empleados de cada departamento.
Sentencia SQL:
SELECT COUNT(DEPARTAMENTO), NOMBREDEP
FROM EMPLEADOS INNER JOIN DEPARTAMENTOS
ON DEPARTAMENTO = CODIGODEP
OR DEPARTAMENTO2 = CODIGODEP GROUP BY NOMBREDEP;


NOTA: En esta consulta he debido considerar que hay empleados que trabajan en 2 departamentos a la vez por ello realice el count a departamento pero a su vez en el inner Join
ingrese el departamento2
Resultado de la consulta:



10. Obtener un listado completo de cada empleado incluyendo por cada empleado los datos de syu departamento.
Sentencia SQL:
SELECT NOMBREDEP, NOMBRE, APELLIDO, RUT
FROM DEPARTAMENTOS INNER JOIN EMPLEADOS
ON CODIGODEP = DEPARTAMENTO
OR CODIGODEP = DEPARTAMENTO2 ORDER BY NOMBREDEP;


NOTA: En esta consulta para lo mi lo mas optimo fue hacer el select a departamento y el enner join a empleados puesto que como ya vengo mencionando tengo empleados en 2 departamentos a la vez (es un ejemplo mas realista):


11. Obtener un listado completo de cada empleado incluyendo por cada empleado los nombres y apellidos junto al nombre y presupuesto de su departament0
Sentencia SQL:
SELECT NOMBRE, APELLIDO, RUT, NOMBREDEP, PRESUPUESTO FROM DEPARTAMENTOS INNER JOIN EMPLEADOS ON CODIGODEP = DEPARTAMENTO OR CODIGODEP = DEPARTAMENTO2 ORDER BY NOMBREDEP;

Nota: Los usuarios que pertenecen a dos departamentos aparecen con su presupuesto en ambos departamentos).


12. Obtener un los nombres y apellidos de empleados que trabajen en departamentos con un presupuesto mayor a $500000
Sentencia SQL:
SELECT NOMBRE, APELLIDO FROM DEPARTAMENTOS INNER JOIN EMPLEADOS ON CODIGODEP = DEPARTAMENTO OR CODIGODEP = DEPARTAMENTO2 WHERE PRESUPUESTO > 500000 ORDER BY NOMBREDEP;

13. Obtener un los datos de los departamentos cuyo presupuesto es mayor al precio medio de todos los departamentos.
Sentencia SQL:
SELECT NOMBREDEP, PRESUPUESTO FROM DEPARTAMENTOS WHERE PRESUPUESTO > ( SELECT AVG(PRESUPUESTO) FROM DEPARTAMENTOS);


14. Obtener unicamente los nombres de los departamentos que poseen más de 2 empleados.
Sentencia SQL:
SELECT NOMBREDEP
FROM EMPLEADOS INNER JOIN DEPARTAMENTOS
ON DEPARTAMENTO = CODIGODEP
OR DEPARTAMENTO2 = CODIGODEP
GROUP BY NOMBREDEP HAVING COUNT(DEPARTAMENTO) > 2;

En lo personal considero que esta consulta es mas completa indicando además cuantos empleados posee el departamento mencionado.

SELECT COUNT(*) As CANTIDAD, NOMBREDEP FROM EMPLEADOS INNER JOIN DEPARTAMENTOS ON DEPARTAMENTO = CODIGODEP OR DEPARTAMENTO2 = CODIGODEP GROUP BY NOMBREDEP HAVING COUNT(DEPARTAMENTO) > 2;


15. Añadir un nuevo departamento Calidad con presupuesto $40000 y código 11..
Sentencia SQL:
INSERT INTO DEPARTAMENTOS (CODIGODEP, NOMBREDEP, PRESUPUESTO) VALUES (11, 'Calidad', 40000);
Select * from departamentos;



16. Añadir un nuevo empleado al departamento calidad (Esther Vazquez rut 23456789-9).
Sentencia SQL:
INSERT INTO EMPLEADOS (RUT, NOMBRE, APELLIDO, DEPARTAMENTO)
VALUES (23456789-9, 'Esther', 'Vazquez', 11);


17. Aplicar un recorte presupuestario del 10% a todos los departamentos.
Sentencia SQL:
UPDATE DEPARTAMENTOS SET PRESUPUESTO = PRESUPUESTO * 0.9;

18. Reasignar los trabajadores del departamento 11 (Calidad) al departamento 1 (informática).
Sentencia SQL:
UPDATE EMPLEADOS SET DEPARTAMENTO = 1 WHERE DEPARTAMENTO =11;

19. Eliminar a todos los trabajadores del departamento 1 (informática).

Nota:Como ya he indicado hay empleados que están en 2 departamentos y se los elimino de informática también serán eliminados del departamento2 aunque este no sea informatica por lo que este ejercicio lo resolvere en 3 pasos.

Importante: Siempre se debe tener mucho cuidado en realizar un delete directo a la Base de datos ya que si no se asigna una condición Where serán eliminados todos los registros. ( No es exagerado realizar un backup antes de hacer un delete) recuerden que aquí no existe el comando deshacer....
1.- Primero eliminar todos los empledos que trabajen en el departamento 1 y que no posean un trabajo en un segundo departamento (por defecto el departamento2 debe se NULL)

Sentencia SQL:
DELETE FROM EMPLEADOS WHERE DEPARTAMENTO = 1 AND DEPARTAMENTO2 <=> NULL;

2.- Como yo se por las consultas anteriores que en la columna departamento 2 solo están asignados empleados al departamento 13 actualizare la información de manera de que los que están en informática (que por defecto también están el el dpto 13) serán asignados solo al departamento 13, pero como su primer departamento.

Sentencia SQL:

UPDATE EMPLEADOS SET DEPARTAMENTO =DEPARTAMENTO2 WHERE DEPARTAMENTO2 = 13;
3.- Ahora que ya dispongo de mi información actualizada procederé a eliminar la información del depratamento2 dejando el campo en NULL (recordemos que la misma información ya esta en la columna departamento y esto es solo para no dejar repetida la información en departamento2)

Sentencia SQL:
UPDATE EMPLEADOS SET DEPARTAMENTO2 = NULL WHERE DEPARTAMENTO2 = 13;

Veamos como quedo nuestra tabla select * from empleados;


20. Eliminar a todos los empleados que trabajen en un departamento con un presupuesto mayor a $2000000.
Sentencia SQL:

DELETE A FROM EMPLEADOS A INNER JOIN DEPARTAMENTOS ON DEPARTAMENTO = CODIGODEP WHERE PRESUPUESTO > 2000000;

Nota: Aquí he utilizado un inner join nuevamente para unir las tablas pero para que el delete se realice correctamente se debe asignar un alias a la tabla empleados en este caso mi alias es A ( si nos fijamos mi sentencia dice DELETE A FROM....).

Veamos como quedo nuestra información .... ahora solo deberiamos poseer empleados en departamentos con presupuestos de hasta $2000000

SELECT RUT, NOMBRE, APELLIDO, NOMBREDEP, DEPARTAMENTO, DEPARTAMENTO2 FROM EMPLEADOS INNER JOIN DEPARTAMENTOS ON DEPARTAMENTO = CODIGODEP;


21. Eliminar a todos los empleados.
Nota: esta sentencia es la mas fácil de todas, pero no se olviden realizar un backup antes ya que si sus jefe les dio la orden siempre cabe la posibilidad de que se arrepienta o de que necesitemos esa información.

Sentencia SQL:
DELETE FROM EMPLEADOS;

Vemos como quedo nuestra información (aunque ya lo se..... no habrá nada)

SELECT * FROM EMPLEADOS;


Ha sido todo por el momento.... cualquier consulta publicando sus comentarios.



viernes, 29 de agosto de 2008

Diez millones de zombies enviando malware

Botnet

Un informe realizado por Commtouch y PandaLabs durante el segundo trimestre del año detecta un incremento de los ordenadores zombie en todo el mundo.


Los ordenadores zombies son máquinas infectadas por “bots” y controladas remotamente por el ciberdelincuente. ‘Bot es el diminutivo de la palabra robot. Son pequeños programas que son introducidos en los ordenadores con la intención de permitir al ciberdelincuente tomar el control remoto de los mismos. Las redes de bots o ‘Botnets’, son grupos de ordenadores infectados por bots unidos para actuar de manera conjunta. El ciberdelincuente da instrucciones a esos ordenadores para, por ejemplo, descargar una nueva amenaza en el equipo, mostrar publicidad al usuario, lanzar ataques de denegación de servicio o, sobre todo, el envío de spam.

El informe realizado por Commtouch y PandaLabs muestra que durante el segundo trimestre del año Turquía se ha convertido en el país con mayor número de ordenadores zombie del mundo, con un once por ciento del total, seguido de cerca por Brasil, con un 8,4 por ciento y Rusia con un 7,4 por ciento. Estados Unidos, que en el primer trimestre contaban con un cinco por ciento del total de zombies, ha caído hasta la novena plaza, representando sólo el 4,3 por ciento del total.

Este gran número de “zombies” continúa siendo el principal causante de la avalancha de spam vivida por usuarios y empresas; y es que entre abril y junio el 74 por ciento del correo recibido en los buzones de correo era spam.
Luis Corrons, director técnico de PandaLabs ha hecho referencia al estudio de Nucleus Research, una consultora independiente, que ha cifrado en 712 dólares el coste por cada empleado que tras recibir un e-mail lo eliminaba inmediatamente, sin ni siquiera abrirlo.

investigar más (En wikipedia)

jueves, 28 de agosto de 2008

Utilizan falsos programas de descargas para infectar al usuario

Panda Software advierte que los programas BitRoll-5.0.0.0 y Torrent101-4.5.0.0 ser están utilizando para instalar malware en los ordenadores de los usuarios.

Este tipo de programas se utilizan para intercambiar ficheros entre usuarios remotos, punto a punto. Ambos instaladores están disponibles para su descarga desde Internet, de modo que cualquier usuario puede acceder a ellos y quedar infectado.
Los ciberdelincuentes también están utilizando otras falsas aplicaciones, como un programa llamado wavesoftwarecreative.exe (y que se hace pasar por un software de sonido) u otro llamado bitdownloadsetup.exe para instalar este código malicioso.

El adware Lop está diseñado para mostrar publicidad de distintos anunciantes al usuario durante la navegación mediante ventanas emergentes, banners, etc. Además, cambia la página de inicio de Internet Explorer por la de un buscador propio. Si se realizan búsquedas en él, éste devolverá como resultado páginas de publicidad relacionadas con la palabra buscada.

Para dificultar su detección, este adware se conecta cada cierto tiempo a una página web desde la que descarga nuevos ficheros que contienen nuevas variantes de sí mismo, de modo que sea muy difícil eliminar todos los ficheros maliciosos activos en el sistema. Además, si el usuario intenta utilizar el programa instalado, le permitirá realizar búsquedas de archivos, pero no descargarlos.

Como destaca Luis Corrons, director técnico de PandaLabs, “en muchas ocasiones, la instalación del adware era ‘aprobada’ por el usuario, ya que ésta se incluía en el acuerdo de licencia de distintos programas y el usuario, de manera inconsciente, la aceptaba durante el proceso de instalación del programa principal”. Pero, como explica Corrons, “en este caso, sin embargo, en el acuerdo de licencia de los programas no se menciona en ningún momento la instalación del adware Lop”.

Puede comprobar gratuitamente si está infectado con este ejemplar de malware desde la página web Infected or Not.

(Fuente www.vnunet.es)



8 millones de afectados en uno de los mayores ciber ataques de la historia


Un hacker ha estado robando los datos personales y números de tarjetas de crédito de todos los clientes de la cadena hotelera Best Western en Europa desde 2007.

Durante doce meses, todos los datos de cada uno de los clientes de los más de 1.300 hoteles que la cadena Best Western tiene distribuidos por Europa, han sido extraídos por un hacker indio, según ha revelado una investigación del diario Sunday Herald.

El ataque, uno de los más graves de la historia en cuanto a magnitud y alcance, afecta a unas 8 millones de personas que se han alojado en los hoteles de esa compañía a lo largo del año.

Un hacker indio consiguió desbloquear el sistema de reservas del hotel, accediendo remotamente a la base de datos del mismo y puso en venta la información de cómo acceder a este sistema a través de una red controlada por la mafia rusa. Los datos extraídos incluyen la información completa de los clientes, dirección personal, números de teléfono, detalles de la tarjeta de crédito y puesto de trabajo.

Según explica Jacques Erasmus, un ex hacker que ahora trabaja para la firma de seguridad Prevx, se trata de un gran golpe. “Hay gran cantidad de bases de datos de varias compañías hackeadas y que están en venta online, pero el volumen y la calidad de información que ha sido robada de Best Western es excepcional”.

Aunque el agujero de seguridad fue cerrado inmediatamente por los técnicos de Best Western cuando el diario alertó a la compañía el pasado viernes, los expertos temen que la información haya sido ya usada para ataques delictivos. “Best Western desactivó el sistema inmediatamente. Por el momento estamos trabajando con nuestros socios que se encargan de las tarjetas de crédito para asegurar que todos los procedimientos relevantes se cumplan y que los intereses de nuestros clientes estén protegidos”, ha dicho un portavoz de la empresa.

La publicación señala que el hacker indio consiguió infectar el sistema de reservas de Best Western con un virus troyano que registró las claves para entrar. En cuanto un trabajador de la compañía utilizó su nombre de usuario y contraseña, el hacker consiguió la información para conectarse remotamente sin ser descubierto.

“Las grandes compañías utilizan antivirus para proteger su infraestructura, pero el problema de este sistema es que estos productos sólo detectan alrededor del 60 por ciento de los ataques que hay. En las manos justas, los virus pueden atravesar los programas, y esto es lo que ha pasado aquí”, ha explicado Erasmus.

martes, 19 de agosto de 2008

Bases de Datos Tercera Parte (ejercicios)

Continuando con el tutorial de bases de datos (ver parte 1, ver parte 2) en esta tercera parte me enfocare solo a la creación de ejercicios con sus respectivos resultados para que puedan servir de ejemplo.

11.- Obtener un listado de artículos, incluyendo por cada articulo los datos de su nombre, precio y el nombre de su fabricante.
Sentencia SQL:
SELECT art.NOMBRE, art.PRECIO, fab.NOMBRE Nombre_Fabricante from ARTICULOS art, fabricantes fab where art.CODFRABICANTE = fab.CODIGO;

Resultado de la consulta


12.- Obtener el precio medio de los productos de cada fabricante, mostrando el Código del fabricante.
Sentencia SQL:
select CODFRABICANTE, AVG(PRECIO) as promedio from ARTICULOS GROUP by CODFRABICANTE;
NOTA: En esta sentencia se ha incluido un nuevo concepto GROUP by que sirve para agrupar la información, es esta caso se agrupo por fabricantes los cuales son diferenciados por si ID o codigo de fabricante.

Resultado de la consulta


13.- Obtener el precio medio de los productos de cada fabricante, mostrando el nombre del fabricante.
Sentencia SQL:
select FABRICANTES.NOMBRE, AVG(PRECIO) as promedio from ARTICULOS , FABRICANTES WHERE ARTICULOS.CODFRABICANTE = FABRICANTES.CODIGO GROUP by FABRICANTES.NOMBRE;
Resultado de la consulta


14.- Obtener el nombre de los fabricantes que ofrezcan productos cuyo precio medio sea igual a $5445.

Nota: He seleccionado la cantidad de $5445 porque la consulta anterior me devolvió los valores promedio y en consultas anteriores se que insumos nacionales posee mas de un articulo. De lo contrario no se reflejaría la sentencia si un fabricante posee un solo articulo puesto que su promedio seria el mismo valor del articulo
Sentencia SQL:

select fab.NOMBRE as EMPRESA from fabricantes fab inner JOIN articulos art on fab.CODIGO = art.CODFRABICANTE GROUP BY EMPRESA HAVING AVG(precio) = 5445;


Descripción ampliada: (Aqui he incluido nuevos comandos)

* A la tabla Fabricantes le he asignado un alias fab (para no escribir fabrica.nombre)
* A la tabla Articulos le he asignado un alias art (para no escribir articulos.codfrabicante)
* Al campo Fabrica.NOMBRE ó fab.NOMBRE le asige un alias EMPRESA.
* INNER JOIN devuelve todas las filas de ambas tablas, donde hay un Claves en común.
(En las consultas anteriores he escrito todos los componetes de ambas tablas ejemplo:
Select articulos.nombre , articulos.codfrabicante, articulos.precio, fabricantes.codigo, fabricantes.nombre from articulos, fabricantes where ........
* GROUP BAY agrupa los resultado por un nombre de campo.
* HAVING similar al where pero es tratado como función.
* AVG devuelve el promedio.
Resultado de la consulta



14.- Obtener el nombre y precio del producto mas barato.
Sentencia SQL:
select nombre, precio from articulos order by precio limit 1;
Resultado de la consulta


Nota: Podríamos haber hecho subconsultas en el where y enredarnos bastante pero aquí lo mejor es utilizar LIMIT por defecto el ordenamiento es ascendente es por ello que nos entrega el precio mas bajo... si ordenamos descendente "order by nombre desc" nos entregara el producto mas caro.

16.- Obtener una lista con los nombres y precio de los artículos mas caro de cada proveedor (Incluyendo el nombre del proveedor)
Sentencia SQL:
select a.nombre, a.precio, f.NOMBRE as Fabricante from articulos a inner join fabricantes f on a.codfrabicante = codigo group by f.nombre order by precio desc;
Resultado de la consulta


Nota: Aquí nuevamente utilice el limit en orden descendente y además agrupe por fabricantes para mostrar sus productos mas caros.. el inner join me ayuda a traer los registros de la tabla relacionada (fabricantes) el as Fabricantes es solo para darle nombre a la columna.

17.- Añadir un nuevo producto del fabricante 2 lampara USB $7990.
Sentencia SQL:
insert into articulos (codigoart, nombre, precio, codfrabicante)
values (114, 'Lampara USB', 7990, 2);

Resultado de la consulta
Para ver el resultado ahora aremos un select del fabricante 2 con sus productos

select f.codigo, f.nombre, a.nombre, a.precio from fabricantes f inner join articulos a on f.codigo = codfrabicante where f.codigo = 2;

(Este select es muy completo pero solo de referencia para mostrar el registro insertado)

18.- Cambiar el nombre del articulo 108 a Impresora Láser.
select * from articulos where codigoart = 108;

Sentencia SQL:
UPDATE articulos set nombre = 'Impresora Laser' where codigoart = 8;
Resultado de la consulta


19.- Aplicar un descuento de un 10% a todos los productos.
Sentencia SQL:
update articulos set precio = precio * 0.9;

Nota: No necesita explicación todos los productos fueron rebajados en un 10%.

20.- Aplicar un descuento de un $1777 cuyo precio sea mayor o igual $20000.
Sentencia SQL:
update articulos set precio = precio - 1777 where precio >= 20000;

Eso es todo
... Pronto segundo set de 20 ejercicios mas.


lunes, 18 de agosto de 2008

Google busca más seguridad a través de la criptografía

La compañía ha implementado KeyCzar, una herramienta de código abierto que permite a los desarrolladores utilizar la codificación en sus aplicaciones.

El objetivo final de KeyCzar es ofrecer a los desarrolladores una herramienta segura y fiable que pueda insertarse fácilmente en su código. Como ha destacado Steve Weiss, ingeniero de software de seguridad de Google, que ha ayudado a desarrollar KeyCzar, “es difícil utilizar la criptografía y, de hacerse mal, puede crear serios agujeros de seguridad”.

Weiss ha explicado que los errores comunes, como utilizar algoritmos no actualizados o no ser capaz de alternar con nuevas claves de codificación pueden llevar a que las herramientas sean completamente inútiles. El objetivo de KeyCzar es simplificar estos actos y permitir que los desarrolladores no sólo coloquen las herramientas de codificación en su lugar, sino que gestionen y cambien las claves si fuera necesario.

Es decir que KeyCzar facilita la rotación y suspensión de las claves sin que el desarrollador tenga que preocuparse por la compatibilidad o que los cambios afecten al código fuente.

Google ha advertido, no obstante, que KeyCzar no debe verse como un completo sistema de codificación, ya que no contiene librerías ni ejecuta la mayoría de las tareas de codificación, pero es un primer paso.

La primera versión de KeyCzar está disponible para su descarga desde el servicio Google Code de la compañía. La herramienta está actualmente limitada a los lenguajes de programación Java y Python, pero Google ya está preparando una versión para C++.


(fuente www.vnunet.es)