miércoles, 14 de noviembre de 2018

151. Envenenamiento de Cache - Ataques

En este tipo de ataque no tenemos que ver directamente como desarrolladores, y digo no directamente, por que una aplicación que presente vulnerabilidad puede ser la puerta para que se efectué este tipo de ataque.

El ataque se da cuando un código malicioso cambia la tabla de nombres de dominio de un servidor de Internet, remplazandolas por otro, de tal forma que las direcciones legales dejan de serlo, y las solicitudes se redirigen a sitios falsos, con el fin de extraer o dañar la información.

Comúnmente para poder efectuar el ataque, se requiere la ejecución de algún proceso externo en el servidor, este puede entrar por un banner, un correo, o un programa mal desarrollado.


felices lineas

150. CSV INJECTION - Ataques

Platiquemos de este tipo de ataque, los archivos CSV son un tipo de archivos muy común, los cuales se emplean para compartir información entre diversos sistemas de manera sencilla, este formato es empleado por varias aplicaciones tanto comerciales como propias de una empresa.

Existen algunos programas comerciales, como Excel, open office etc, que permiten interpretar la información con algunas formulas ( en algunos casos un desarrollador llega a buscar interpretar campos de un CSV para poder obtener ciertos datos o ejecutar ciertos procesos)

La inyección de CSV, consiste en aprovechar esta capacidad, y en vez de enviar un dato, enviar una formula, esperando que el servidor sea capaz de interpretarla, comúnmente se emplea el signo = y posteriormente se escribe la formula.

Ahora me preguntaran ¿Que daño puede hacer?, realmente puede hacer mucho daño, se puede poner un hyperlink, ejecutar un comando externo un comando externo nos puede dar acceso a un servidor etc.

En muchas ocasiones el tomar una funcionalidad que existe para dar mucha flexibilidad a nuestros aplicativos, abre una puerta para poder causar daños mayores, vean que puertas abren, aprendan a construir sus barreras.

Felices lineas

149. Ataques

Platicando con un amigo surgió un tema en la conversación, la seguridad en nuestras aplicaciones, ¿creamos aplicaciones seguras?, ¿Realmente es muy difícil encontrar una aplicación verdaderamente segura?

Por desgracia la respuesta es no, no creamos aplicaciones seguras hoy en día, hemos caído en un problema muy grabe, en que sistemas es fácil de aprender, y en que desarrollamos para funcionalidad, no para seguridad. Y aunque nos duela los de .net estamos mucho mas lejos todavía de una programación segura, entonces me dirán, pero ejecuto las reglas básicas de seguridad que vienen en Visual Studio, ejecuto los análisis de código, eso ayuda, pero eso no es un diseño en el que se pueda validar la seguridad.

Entonces deberíamos hablar de los diseños y la seguridad, pero no, no voy ha hablar de eso, ¿por que?, por algo sencillo, para poder diseñar la contención, primero es necesario sabe como es un ataque.

Entonces te pregunto ¿Cuantos tipos de ataques conoces?, ¿Has intentado romper tus propios sistemas con ellos?, no estoy pidiendo nada raro, ni complejo, solo ejecuta ataques a tu sistema y veamos que pasa.... Instala un Kali linux y prueba algunos ataques genéricos... cualquier sistema debería poder resistirlos.

Pero volvemos a lo mismo, como construimos una muralla, si yo no se como es el ejercito que me va a a tacar.

Construyo una pared para un ataque por aire?, ¿como debo diseñar mi software?

La respuesta es para poder armar tu defensa conoce al atacante.

Necesitamos aprender ¿Que tipos de ataque existen? ¿Como hacerlos? y ¿Como detenerlos?, y esto debemos tenerlo en mente desde el momento en el que construimos nuestra aplicación.

En próximas entradas pondré una breve descripción de diferentes tipos de ataque, primero quiero que los conozcas, después veremos como hacerlos y controlarlos, no estoy diciendo que ataque un sistema que no es tuyo, estoy diciendo que sepas como defenderte.

felices lineas

martes, 13 de noviembre de 2018

148. Linq Join

Pues seguimos con esta serie de post de lynq, así como en algún momento lo maneje lynq nos ayuda a hacer mas sencillo el manejo de datos, por ello lo que vamos ha hacer esta vez es enlazar 2 tablas mediante lynq.

Bueno realmente hacer esto es muy sencillo, veamos un código y platiquemos sobre el:

namespace union
{
    class Program
    {
        public class  Alumno
        {
            public string nombre { getset; }
            public int Lista { getset; }
        }
 
        public class Calificacion
        {
            public string materia { getset; }
            public int Lista { getset; }
            public int calificacion { getset; }
        }
 
        static void Main(string[] args)
        {
            List<Alumno> Alumnos = new List<Alumno>();
            Alumnos.Add(new Alumno() { nombre="Carlos", Lista=1 });
            Alumnos.Add(new Alumno() { nombre = "Miguel", Lista = 2 });
            Alumnos.Add(new Alumno() { nombre = "Juan", Lista = 3 });
            Alumnos.Add(new Alumno() { nombre = "Raquel", Lista = 4 });
            Alumnos.Add(new Alumno() { nombre = "Irma", Lista = 5 });
 
            List<Calificacion> calificaciones = new List<Calificacion>();
            calificaciones.Add(new Calificacion() 
                        { Lista=1, calificacion=8, materia="1" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 1, calificacion = 8, materia = "2" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 1, calificacion = 9, materia = "3" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 1, calificacion = 10, materia = "4" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 2, calificacion = 8, materia = "1" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 3, calificacion = 8, materia = "2" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 4, calificacion = 9, materia = "3" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 2, calificacion = 10, materia = "4" });
 
            var x = from a in Alumnos join b in calificaciones 
                    on a.Lista equals b.Lista 
                    select new { nombre = a.nombre, calificacion = b.calificacion };
 
            foreach(var loop in x)
            {
                Console.WriteLine(loop.nombre + " - " + loop.calificacion);
            }
 
            Console.ReadLine();
        }
    }
}

Bien que hace el código, el código lo que hace es que carga 2 objetos y obtiene un tercer objeto anónimo poco resultado de ambos, y en donde esta la magia


 var x = from a in Alumnos join b in calificaciones 
                    on a.Lista equals b.Lista 
                    select new { nombre = a.nombre, calificacion = b.calificacion };


si observamos estas lineas es muy fácil de leer, estamos usando 2 objetos uno llamado alumnos y uno llamado calificaciones, le estamos indicando a lynq que el valor que se emplea para hacer la unión es el campo lista, que se encuentra en ambos objetos, ahora bien, en un post pasado vimos que podemos usar linq para hacer convenciones de datos entre objetos, bueno en este caso estamos creando un nuevo objeto
      
select new { nombre = a.nombre, calificacion = b.calificacion };

pero como pueden ver, no existe un objeto con estas características, estamos creando un objeto anónimo, que lo estamos utilizando en la siguiente linea.


            foreach(var loop in x)
            {
                Console.WriteLine(loop.nombre + " - " + loop.calificacion);
            }


Felices Lineas


147. @@error SQL

Dirán que toco muchos temas, pero el salto se da por un hecho, si realmente quieren orquestar lo que es el desarrollo de sistemas, deben tener conocimiento de varias cosas, toco mucho base de datos, es por un tema, los desarrolladores, o bueno un gran numero de ellos se encuentran peleados con la base de datos, solo conocen las operaciones básicas y se niegan a ver un poco mas allá, y bueno siguiendo con el espíritu de crear ayudas rápidas que den esa gota que hace falta para trabajar hablemos de @@error.

@@error es una instrucción para SQL server, que le indica al cliente que nos de el ultimo numero de error que se encuentre registrado.

es importante, si es muy importante, por que otra de las cosas con las que muchos desarrolladores están peleados, es el control de errores real, es decir, ¿Que se debe hacer si hay un error de un tipo especifico?, recordemos que try catch no es control de errores, eso es simplemente un paleativo para que el proceso no se detenga.

felices lineas

lunes, 12 de noviembre de 2018

146. Lynq transformar objetos

Lynq nos permite manipular datos de una manera ágil y sencilla, en este ejemplo lo que vamos a aprender es como copiar datos entre 2 objetos que tienen una estructura diferente.

El select que estamos haciendo desde lynq lo que nos permite es crear un nuevo objeto (el objeto se crea al efectuar el select) y se asigna a un nuevo objeto, de esta manera se deja que el compilador se encargue de establecer la mejor opción para la copia entre objetos, evitando establecer una lógica de forma manual.

Veamos el ejemplo

namespace CopiarDatos
{
 
    public class Primaria
    {
        public string Nombre { getset; }
        public string sexo { getset; }
        public int Numero { getset; }
        public Boolean paso { getset; }
    }
 
    public class Secundaria
    {
        public string Nombre { getset; }
        public string sexo { getset; }
        public int grupo { getset; }
        public int ubicacion { getset; }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Primaria> primaria = new List<Primaria>();
            primaria.Add(new Primaria() { Nombre = "Juan Perez"
                             Numero = 15, sexo = "H",paso=true });
            primaria.Add(new Primaria() { Nombre = "Raquel Perez"
                             Numero = 17, sexo = "H", paso = true });
            primaria.Add(new Primaria() { Nombre = "Alejandra Perez"
                             Numero = 165, sexo = "H", paso = false });
            primaria.Add(new Primaria() { Nombre = "Miguel Perez"
                             Numero = 145, sexo = "H", paso = true });
            primaria.Add(new Primaria() { Nombre = "Raciel Perez"
                             Numero = 155, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Juana Perez"
                             Numero = 415, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Leonardo Perez"
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Miguel Perez"
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Angel Perez"
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Rafael Perez"
                             Numero = 115, sexo = "M", paso = false });
 
            List<Secundaria> x = (from a in primaria 
                 where a.paso == false select new Secundaria { 
                              Nombre = a.Nombre, sexo = a.sexo }).ToList();
 
            foreach(Secundaria objloop in x)
            {
                Console.WriteLine(objloop.Nombre + " - " + 
                                  objloop.grupo + " - " + 
                                  objloop.sexo + " - " + 
                                  objloop.ubicacion);                
            }
            Console.ReadLine();
        }
    }
}

¿Cual es la magia?

 List<Secundaria> x = (from a in primaria where a.paso == false 
       select new Secundaria { Nombre = a.Nombre, sexo = a.sexo }).ToList();

Esta linea es la magia, al momento de generar el select, indicamos que se cree un nuevo objeto y la asignación que tendrá de los valores


 select new Secundaria { Nombre = a.Nombre, sexo = a.sexo }).ToList();

Así llenamos los objetos de una manera eficiente, tanto para el compilador como para el programador.


Felices Lineas


jueves, 8 de noviembre de 2018

145. sp_monitor

La salud de un servidor es muy importante, nunca se deben resolver estos problemas solo incrementando la potencia del servidor, es muy importante que los sistemas se consideren como un todo.

Cuando un sistema tiene problemas de rendimiento, se debe observar ¿ Que elemento tiene el problema ?  pero también se debe localizar ¿ Cual es el elemento que es el que causa el problema?

Existen stores procedures que reportan información de la base de datos, monitores de rendimiento que muestran el estado de un servidor, o de un componente, todo esto debemos saber interpretarlo, por que nos permite generar mejores sistemas.

Un verdadero arquitecto no solo es responsable de sus programadores, es responsable de ese todo que forma el negocio, el arquitecto de sistemas es un director de orquesta, y como tal debe hacer funcionar ese todo

sp_monitor es uno de esos stores, este nos muestra el estado actual de nuestro servidor de SQL

¿Que información nos entrega?

last_run: Fecha en que el proceso fue ejecutado por ultima vez, es importante por que establece el punto desde el que se recolectaron los ultimos datos.

current_run: Fecha actual de ejecucion

seconds: Tiempo en que se tardo en recabar la informacion

cpu_busy: Numero de segundos que el CPU ha estado ocupado por el servidor de SQL

io_Busy: Numero de segundos que el servidor ha dedicado a procesos de entrada y salida

ide: Numero de segundos que el servidor ha estado ocupado

packets_received: Cantidad de paquetes recibidos

packets_sent: Cantidad de paquetes enviados

total_read: Numero de lecturas hechas por SQL Server

total_write: Numero de escrituras a SQL server

total_errors: Cantidad de errores que ocurrieron durante la lectura y escritura

connections: Cantidad de conexiones aceptadas por el servidor de SQL

Para que estos valores tengan sentido, es muy importante que se tome el tiempo que ha transcurrido entre la ejecución anterior y la ejecución actual del proceso, ademas de que es necesario siempre tener los valores de la ejecución anterior para tener valores de referencia

Felices lineas