Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - WHK

#271
Talves estás buscando un nav bar fixed?
#272
Citary consultando di con que mejor es usar los procedimientos almacenados

Nopues, mejor no vuelvas a consultar más en ese sitio web xD, lo peor que puedes hacer es usar procedimientos almacenados porque eso aumenta la carga y pierdes integridad cuando necesitas escalar a más de una capa de negocio (o sea, tener a más de una aplicación usando la misma base de datos). Toda la lógica se debe hacer de lado de .net, no del motor de la base de datos, recuerda que el motor de la db es lo más pesado que se ejecuta en una aplicación, si tienes miles de visitas tu IIS soportará muy bien pero puede que tu base de datos no y tendrás que gastar mucho dinero en memorias ram y en hardware para hacer balanceo de carga. Mejor ahorrate todo eso y haz que la base de datos trabaje lo menos posible.

Ya que me has dicho que estás usando .net, averigua que es MVC5 para .net, persistencia, entity framework, como crear entidades y multiproyecto  vía services references en una misma solución, con eso debiera bastar.

Desde tu solución debes crear dos proyectos, uno con tu sitio web y otro que sirva solo para recibir y enviar datos desde y hacia la db, entonces desde tu proyecto web le pedirás vía referencia de servicio al proyecto de capa de datos que requieres el listado de reuniones, por ejemplo, DataService.getAllMettingsByPage(1) y tu capa de datos (el proyecto que se conecta a la db) utilizara linq para poder acceder a las entidades de la base de datos a traves de migraciones (lo puedes buscar en visual studio).

Actualmente no necesitas realizar consultas manualmente a la bae de datos, .net lo hace por ti, solo debes crear clases que representen a tus tablas y .net a traves de migraciones creará automáticamente la base de datos y aplicará los cambios cuando cambien algun objeto. Esto te permitirá escalar debido a que en un futuro podrás cambiar de sql server a oracle sin tener que reescribir todas las consultas sql otraves, solo basta con cambiar el driver de conexión de mvc y aplicar las migraciones de la base de datos (con un solo comando) y listo.

Aprovechando que vas a hacer todo de cero, te recomiendo utilizar c#, es mas intuitivo al momento de utilizar lambda y linq para acceder a los repositorios de los datos. A demás en un futuro te será más facil aprender otros lenguajes como Java y frameworks como Spring ya que nadie a excepción de microsoft utiliza un lenguaje Basic para crear aplicaicones modernas y eso te puede provocar una dependencia al largo plazo bien grave ya que si pierdes tu trabajo no podrás buscar otro empleo que no sea en empresas que usen visual basic y por lo general ya van en desuso.

Saludos.
#273
Hola, para eso puedes utilizar bootstrap 4 o crear tu css manualmente con varias decenas de lineas teniendo mucho cuidado para crear clases que no causen conflictos con otras:

https://getbootstrap.com/docs/4.0/layout/grid/#offset-classes

<div class="row">
   <div class="col-sm-12 col-md-4 offset-md-4">
       Contenido
   </div>
</div>


Saludos.
#274
CitarEstoy 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.

CitarLo 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:



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í:

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.
#275
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:

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:

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.
#276
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.
#277
Y donde está ese famoso archivo? tienes el enlace desde baidu para intentar descargarlo?
#278
Si es pequeño subelo a pastebin.com
#279
Hacking / Re: PREGUNTA - SQL BLIND INJECTION
10 Abril 2020, 07:11 AM
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.
#280
Hacking / Re: Pregunta - SQL blind injection
10 Abril 2020, 04:18 AM
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.