elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 434
71  Programación / Bases de Datos / Re: Ayuda mostrar filas se relacion muchos a muchos en: 20 Abril 2020, 09:39
Citar
Estoy verde en estos temas.

Tranquilo, nadie nace sabiendo las cosas.

Citar
¿modelos de datos desde aplicacion?

Un modelo de datos es cuando creas una clase (objeto en tu lenguaje de programación) y ese refleja los datos que están en la base de datos, por ejemplo, si tienes una tabla llamada reuniones con dos columnas entonces tendras una clase llamada reuniones con dos variables y los valores se obtendrán desde la base de datos, de esa manera tu código de lógica (capa de negocio o servicio) no tendrá porque ir a consultar a una base de datos y tendrás integridad.

Algo así: https://www.iteramos.com/pregunta/21106/diseno-del-modelo-de-repositorio-adecuado-en-php

No se aun en que lenguaje estás programando pero deberías usar un framework, estos frameworks hacen todo el trabajo y no debes estar haciendo las consultas sql manualmente. Para cada lenguaje de programación hay frameworks, eso dependerá si tu app es de escritorio o web, por ejemplo laravel, codeigniter, spring bot, express, etc.

Citar
¿que es Escalar?

Es simplemente cuando tu aplicación está diseñada para ser ampliada sin dar problemas, por ejemplo, supongamos que por ahora solo quieres hacer un listado de reuniones, pero talves en algun momento necesitarás agregarle mas cosas, por ejemplo lugares, digamos que un mismo lugar pueda ser agendado por mas de una fecha, entonces necesitarás una tabla de lugares y separar las busquedas por id de reunion y por lugar, despues talves necesitarás gestionar los lugares por dependencias (edificios), talves despues necesitarás llevar una estadística de cuantas reuniones ha tenido un unico usuario y necesitarás hacer una consulta sql muy rápida, porque si crece y llegas a tener miles de registros puede que tus informes estadísticos tarden muchos minutos en ejecutarse y mientras tanto bloquearás la base de datos por exceso de carga o bloqueo nativo. Pensar en el futuro de la aplicación y crear una buena estructura desde el principio es hacer una aplicación escalable.

Citar
Lo digo porque de los tutoriales de bases de datos vistos se insiste en la normalizacion y asi evitarse problemas de inconsistencia, redundancia

La técnica de desnormalización se utiliza mucho, de hecho es un tipo de estructura y acceso a la información, crear datos redundantes te ayuda a alivianar la carga de las consultas sql siempre y cuando mantengas la integridad desde tu aplicación, esto quiere decir lo siguiente:

Las dos maneras más comunes de crear una aplicación es de manera transaccional y/o analítica, transaccional significa que usarás transacciones, o sea, consultas sql, inserciones y actualizaciones y nada mas, todas las tablas son únicas y cada tabla tiene su relación, a esto se le llama una base de datos relacional, pero cuando creas una base de datos analítica necesitas crear redundancia y particionamiento de datos, a esto se le llama desnormalización y sirve cuando necesitas crear reportes con muchos datos unidos, por ejemplo un informe total por més de la cantidad total de reuniones en % de totalidad entre las audiencias que tuvieron éxito o no, un % de inasistencias, un top de usuarios que no asistieron, un top de salas más usadas por día de la semana y esas cosas, imagina si necesitas todos esos datos en un único informe y necesitas ir a consultar a cientos de miles de registros o talves millones, probablemente hacer semejante cantidad de consultas requiera ir a recorrer todos los registros de la base de datos, hacer ordenamientos inversos (para hacer el top), etc, probablemente tardes una hora o más en sacar un solo informe, ahora piensa que mientras la aplicación está ejecutando todas estas consultas sql t base de datos quedará inoperativa y puede que mas de un usuario necesite el mismo informe más de una ves al día, entonces una base de datos transaccional normalizada no sirve y tienes varias opciones, la mayoría de ellas costosas y de compleja implementación, por ejemplo utilizando bigdata, apache hadoop, apache solr, etc, pero la manera mas simple y al alcance de un usuario normal es hacer desnormalización, o sea, duplicar datos.

¿Cómo se mantiene esto en integridad?: Cada ves que tu aplicación inserte, elimine o modifique un registro tendrás que actualizar el contador o registro redundante manualmente en la tabla desnormalizada.

Un ejemplo práctico es este mismo foro, está sobre una base llamada SMF construido en php y si te fijas, cuando ingresas la la pagina principal te dice muchas cosas, por ejemplo, cuantos mensajes personales tienes, te marca en gris los foros que no tienes nuevos temas que leer, dice la cantidad total de mensajes, la cantidad total de usuarios registrados, etc etc y no creas que el foro hace un calculo por cada usuario que ingresa al foro, sería una locura, por eso existe una tabla en la base de datos con toda esa información donde se guarda un contador total de temas, asi cuando se crea un tema se suma un uno a ese valor y listo y para saber los temas que no has leido lo saca de una tabla desnormalizada, esto quiere decir que smf duplica el titulo de cada post en diferentes tablas para no tener que irlas a buscar una por una y estar calculando los resultados, eso sería desastrozo si tienes miles de usuarios conectados simultaneamente leyendo el foro.

Es normal que la base de datos sea mas pesada en espacio pero será mas liviana en uso de memoria ram y cpu, tu elijes, que te sobra más? un par de gigas en el disco duro o teras de memoria ram?

Mira, aver si te sirve, lo hize en mysql:



Código:
CREATE TABLE `lugares` (
    `id` INT NOT NULL,
    `nombre` VARCHAR(24) NOT NULL,
    PRIMARY KEY (`id`)
)
ENGINE = InnoDB;

CREATE TABLE `reuniones` (
    `id` BIGINT NOT NULL,
    `fecha_inicio` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `fecha_termino` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `lugar_id` INT NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `fk_reuniones_lugares1_idx` (`lugar_id` ASC),
    CONSTRAINT `fk_reuniones_lugares1`
      FOREIGN KEY (`lugar_id`)
      REFERENCES `lugares` (`id`)
      ON DELETE CASCADE
      ON UPDATE CASCADE
)
ENGINE = InnoDB;

CREATE TABLE `personas` (
    `id` BIGINT NOT NULL,
    `nombres` VARCHAR(24) NOT NULL,
    `apellidos` VARCHAR(24) NOT NULL,
    PRIMARY KEY (`id`)
)
ENGINE = InnoDB;

CREATE TABLE `roles` (
    `id` INT NOT NULL,
    `nombre` VARCHAR(24) NOT NULL,
    PRIMARY KEY (`id`)
)
ENGINE = InnoDB;

CREATE TABLE `participantes` (
    `id` BIGINT NOT NULL,
    `reunion_id` BIGINT NOT NULL,
    `persona_id` BIGINT NOT NULL,
    `rol_id` INT NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `fk_participantes_personas_idx` (`persona_id` ASC),
    INDEX `fk_participantes_roles1_idx` (`rol_id` ASC),
    INDEX `fk_participantes_reuniones1_idx` (`reunion_id` ASC),
    CONSTRAINT `fk_participantes_personas`
        FOREIGN KEY (`persona_id`)
        REFERENCES `personas` (`id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT `fk_participantes_roles1`
        FOREIGN KEY (`rol_id`)
        REFERENCES `roles` (`id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT `fk_participantes_reuniones1`
        FOREIGN KEY (`reunion_id`)
        REFERENCES `reuniones` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
)
ENGINE = InnoDB;

Para obtener el listado de reuniones lo haces así:

Código:
SELECT
    lugares.nombre     as lugar_nombre     ,
    reuniones.fecha_inicio                 ,
    reuniones.fecha_termino                ,
    personas.nombres   as persona_nombre   ,
    personas.apellidos as persona_apellidos,
    roles.nombre       as rol_nombre
FROM reuniones
INNER JOIN lugares       ON ( lugares.id               = reuniones.lugar_id       )
INNER JOIN participantes ON ( participantes.reunion_id = reuniones.id             )
INNER JOIN roles         ON ( roles.id                 = participantes.rol_id     )
INNER JOIN personas      ON ( personas.id              = participantes.persona_id )
WHERE
    reuniones.id = 1
LIMIT 1;

saludos.
72  Programación / Bases de Datos / Re: Ayuda mostrar filas se relacion muchos a muchos en: 20 Abril 2020, 06:27
Hay algunos detalles en tu modelo, por ejemplo, que tipo de dato es "rol_partocipante" ?, si es un varchar, que pasa si alguien ingresa el valor con un punto al final o un espacio en blanco o con mayusculas? duplicarás los registros para un mismo tipo?, no sería mejor contar con una tabla para roles y que solo se asocie el id del rol?, a demás, porque las tablas dicen "Table_" al comienzo si se sabe que son tablas? es como si las columnas comenzaran con "Column_", lo mismo sucede con "Id_reunion", si se sabe que la tabla es reunion, porque la columna tambien se llama reunion?. También te recomiendo que no uses nombres tan genéricos, por ejemplo, que la tabla "intermedia" se llame por ejemplo "reuniones_participantes", porque sino, que harás si tienes mas de una tabla intermedia?.r

Por otro lado, SQL retorna filas, no un arbol de datos, por lo cual no puedes esperar a que la primera fila contenga ciertos datos y en otras otros datos y para obtener tu consulta sql debes hacer un join:

Código:
SELECT
    reunion.fecha,
    participantes.id
FROM reunion
INNER JOIN reuniones_participantes ON (reuniones_participantes.reunion_id = reunion.id)
INNER JOIN participantes ON (participantes.id = reuniones_participantes.participante_id)
WHERE reunion.id

Pero como no me dices mucho sobre lo que contiene la columna rol, puedo asumir una tabla de roles de la siguiente manera:

Código:
SELECT
    reunion.fecha,
    participantes.id,
    participantes.nombre,
    roles.id,
    roles.name
FROM reunion
INNER JOIN reuniones_participantes ON (reuniones_participantes.reunion_id = reunion.id)
INNER JOIN participantes ON (participantes.id = reuniones_participantes.participante_id)
INNER JOIN roles ON (roles.id = reuniones_participantes.rol_id)
WHERE reunion.id

De esta manera obtendrás una lista de todos los integrantes con sus roles y fechas de reunión a traves de un id de reunión.

Ahora, no te recomiendo hacer esto porque, primero, es desordenado y no es eficiente ya que estás intentando crear un retorno de lógica utilizando una base de datos que no fue diseñado para ello, a demás, es una pésima práctica obtener todod e una única ves ya que desperdicias recursos e impides la escalabilidad de tu aplicación porque ya no podrás separar cada dato cuando necesites hacer un paginador, por ejemplo.

Te recomiendo que desde tu aplicación hagas uso de modelos de datos. Si quieres obtener un listado de reuniones entonces no necesitas todos los datos, si necesitas ver el detalle de una reunión necesitarás otros datos con mas detalles y para ello debieras realizar mas de una consulta sql utilizando varios modelos de datos, esto evita por ejemplo que la base de datos tenga que retornar multiples filas con el mismo registro (como la fecha por ejemplo).

En el caso de querer listar reuniones de la manera que lo planteas es porque necesitas procesar los datos de manera individual y desde tu código del aplicativo agrupar los resultados y mostrar por ejemplo un único nombre de reunión, una única fecha y abajo los asistentes, para esto puedes realizar una consulta sql con un listado finito (usando LIMIT y ORDER BY) de reuniones y al ir mostrando una por una vas a ir buscando sus ntegrantes con sus roles asociados a traves de un modelo de datos que lo haga de manera autónoma y con contenido limitado (sólo nombres por ejemplo). Esto te permitirá escalar tu sección de listado de reuniones, por ejemplo, cuando quieras integrar un buscador o un paginador de resultados.

También te recomiendo desnormalizar, eos quiere decir que puedes tener una tabla, por ejemplo, llamada "reuniones_desnormalizado" donde contenga el id de la reunion, el nombre y fecha de la reunion y los nombres de los integrantes en formato texto separado por comas, luego en el listados olo muestras el valor de la columna tal cual y ya, ya que no necesitarás el id del usuario porque no habrá un enlace hacia el perfil del usuario o una imagen con su rostro (supongo), eso es optimizar los recursos y escalar la aplicación.

Saludos.
73  Foros Generales / Foro Libre / Re: VIDEO: La Estación Espacial Internacional captó una supuesta “flota de OVNIs” en: 17 Abril 2020, 03:47
No se, no los veo moviendose como para decir que son extraterrestres, lo más lógico es que sea la basura espacial que dejan los rastros de meteorito destruido (como los que hay en todo el espacio), es cuestión de ver los crateres de la luna y los últimos impactos que ha tenido la tierra, es normal que este tipo de cosas se vean.

Yo si creo en la vida extraterrestre pero está claro que esto no es. Me parece más una noticia sensacionalista para atraer mas visitas y ganar más dinero, nada más.
74  Foros Generales / Foro Libre / Re: Necesito descargar archivo de baidu en: 10 Abril 2020, 21:50
Y donde está ese famoso archivo? tienes el enlace desde baidu para intentar descargarlo?
75  Programación / Scripting / Re: Cómo puedo descencryptar o decrypt una script .Lua en: 10 Abril 2020, 07:50
Si es pequeño subelo a pastebin.com
76  Seguridad Informática / Hacking Ético / Re: PREGUNTA - SQL BLIND INJECTION en: 10 Abril 2020, 07:11
Pues primeramente debes reconocer si realmente el sitio web tiene inyección o no antes de comenzar a lanzar comandos sql, recuerda que si el wordpress le pertenece a una empresa o a una entidad relativamente grande entonces tendrán sistemas de monitoreo que deben estar guardando tus peticiones cada ves que las realizas.

Primero detecta porque está arrojando el error 500, trata de hacer una consulta normal sin sql ni nada, si aun asi te arroja el error 500 puede ser porque la sección simplemente no funciona, es un error genérico, es problema de tu petición y tus cabeceras, etc. Primero intenta que el servidor te devuelva un 200ok y después comienza a intentar ver si tiene inyección, por ejemplo, saber si una comilla o backslash tiene un comportamiento diferente a un caracter normal como simples letras, luego de eso debes intentar pensar como está diseñado la consulta sql original para que puedas inyectar tu consulta, ya sea dentro de un select, con o sin saltos, con o sin parentesis, dentro de funciones o no, etc.
77  Seguridad Informática / Hacking Ético / Re: Pregunta - SQL blind injection en: 10 Abril 2020, 04:18
Primero, recuerda que estás usando form urlencoded asi que debes codificar el contenido en urlencode, por ejemplo los espacios en blanco deben ser %20, lo mismo con los asteriscos y demás. Recuerda a demás que los separadores de parámetros no pueden llevar saltos de línea. También recuerda que si modificas el body de la petición post también debes modificar el content length con la cantidad de bytes de tu nueva petición.

Saludos.
78  Programación / Bases de Datos / Re: Duda una tabla con una base de datos SQL en: 8 Abril 2020, 18:52
Eso solo funciona en Microsoft SQL Server, no es parte del lenguaje SQL estandar.
79  Programación / Scripting / Re: [AYUDA] (PYTHON) Quiero hacer un Bot de Trading y no se como en: 7 Abril 2020, 02:40
Hola, así de palabras es dificil poder saber porque tu bot no funciona ya que no hemos visto el código fuente ni los parámetros que usas. Tienes algún proyecto público, por ejemplo en github para darle un vistazo?

Saludos.
80  Programación / Programación General / Re: Busco Programador en: 6 Abril 2020, 03:28
Así?

Código:
<?php

$inicio = new DateTime('NOW');
while(true)
{
    if((int)$inicio->diff(new DateTime('NOW'))->format('%a') > 3)
    {
        break;
    }
    echo "Este es un mensaje.\n";
    sleep(10);
}
echo "Finalziado.\n";

Eso mostrará un mensaje cada 10 segundos durante 3 días.

No veo que esto tenga que estar en hacking avanzado asi que lo muevo al foro de programación general (ya que ni si quiera sabemos aun el lenguaje en que lo quieres).

Saludos.
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 434
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines