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

#361
Talves descubrieron algo que no pueden decir a público.
#362
Dudas Generales / Re: ¿Dónde alojar Imágenes?
2 Noviembre 2019, 17:58 PM
Yo también uso https://es.imgbb.com/ , antes usaba flickr pero da problemas al postear imagenes antiguas.

Saludos.
#363
Bases de Datos / Re: Ayuda bbdd
2 Noviembre 2019, 17:43 PM
Hola, te sugiero lo siguiente (esto está en postgres 10):

Código (sql) [Seleccionar]
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- as postgres user

create table teachers (
   id bigserial NOT NULL PRIMARY KEY,
   identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
   name character varying(32) NOT NULL,
   last_name character varying(32) NOT NULL,
   attention time NOT NULL
);

create table courses(
   id bigserial NOT NULL PRIMARY KEY,
   identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
   name character varying(32) NOT NULL,
   duration time NOT NULL,
   teacher_id bigint NOT NULL REFERENCES public.teachers(id) ON DELETE CASCADE ON UPDATE CASCADE
);


Primero, no necesitas indicar el id del curso en la tabla del profesor, si llevas esto a la práctica no podrás crear la tabla profesores porque la tabla de cursos aun no existe y de todas maneras tampoco podrías ingresar un registro de profesor porque no existe el registro de curso y al reves, no puedes crear un curso porque no existe el profesor.

Segundo, debes declarar tus columnas si podrán estar nulos o no, esto es importante para mantener la integridad de la tabla.

Tercero, he agregado un identificador uuid para evitar exponer los id del lado del usuario y enumerar items, esto se considera una vulnerabilidad.

Cuarto, he utilizado bigint como id primario para aumentar la cantidad de registros soportados, esto añade escalabilidad a tu proyecto.

Quinto, he traducido las columnas y tablas al inglés, esto es una buena práctica, que tu sitio funcione con textos en español no quiere decir que el código deba estar en español, esto también ayuda en la escalabilidad del proyecto cuando necesites contratar a mas desarrolladores fuera de tu pais cuando el proyecto crezca.

Notas: Si te fijas, he mantenido el id separado del identificador, una opción hubiera sido utilizar únicamente el uuid como llave primaria pero esto aumentaría el coste de carga de la base de datos, por eso debes usar el id de manera interna para tus joins y el identificador para manipular desde tu front-end. La opción de cascada al eliminar se la puse para mantener la integridad de los datos, así si borran el profesor sus cursos también se eliminan ya que hemos declarado ese campo como no nulo, si quieres que el curso se mantenga entonces el campo debe ser nullable y la cascada debiera ejecutar un set null:

Código (sql) [Seleccionar]
teacher_id bigint NULL REFERENCES public.teachers(id) ON DELETE SET NULL ON UPDATE CASCADE

Si te fijas, esta es una tabla de 1 a muchos, normalmente la tabla de 1 a 1 no debiera existir o no se debiera enseñar, pero en la práctica si es posible hacer esto aunque es un concepto complejo y útil en casos muy específicos, en tu caso no aplica, pero:

Una tabla de 1 a 1 quiere decir que un profesor sólo puede tener un curso y un curso sólo puede tener un profesor, esto en la práctica es imposible pero se puede solucionar de dos maneras: usando una tabla intermedia con dos llaves que les sean imposibles repetir o estableciendo el id del profesor de la tabla cursos como valor único.

Veamos:

Código (sql) [Seleccionar]
teacher_id bigint NOT NULL REFERENCES public.teachers(id) UNIQUE ON DELETE CASCADE ON UPDATE CASCADE

De esta manera un profesor no podrá tener más de un curso y un curso no podrá tener más de un profesor, aunque esto es ridículo, pero esto sería de 1 a 1.

Será que tu profesor te ha querido gastar una broma?

Saludos.
#364
Eso lo puedes hacer con arduino y un micrófono, de esa manera detectas cuando haya señal de entrada por el micrófono y mandas una pulsación por usb y luego en tu pc asignas esa tecla a la funcionalidad que tu quieras.

https://arduino.stackexchange.com/questions/22040/how-to-send-data-from-an-arduino-to-pc-without-using-the-serial-monitor

Sino lo puedes hacer en python, el interprete de windows es muy limitado, pero desde python puedes importar el módulo para capturar la entrada de audio por microfono y detectar niveles y ejecutar cosas cuando estos niveles sobrepasen cierta frecuencia o ganancia.

https://realpython.com/playing-and-recording-sound-python/

Saludos.
#365
Pues para entender como inyectar cosas necesitas aprender primero sobre como usar las jeringas y su contenido, no todo se inyecta de la misma manera, en el mismo lugar o con el mismo contenido. Primero debes entender sobre consultas SQL y después podrás entender como hacer inyecciones de contenido SQL.

Por ejemplo:

SELECT
   P.id_post,
   P.id_user,
   U.id_user,
   U.avatar
FROM
   posts P
INNER JOIN users U ON P.id_user = U.id_user
WHERE
   P.title LIKE "%'.($search).'%"
ORDER BY
   P.id_post DESC


Una posible inyección sería:

qqqq" UNION SELECT * FROM (SELECT 1 AS id_post, 2 AS id_user, 3 AS id_user, @@version AS avatar) P WHERE 1 LIKE "1

De esta manera con qqqq invalidas el resultado arrojando cero items para que no haya problemas con la obtención de filas del union select, luego el union select con la cantidad de columnas exactas, el avatar será el texto de escapado de información, un subselect para representar P como tabla debido al order by y el primer resultado con el mismo nombre de la columna a ordenar y para finalizar una condicional cualquiera para unir las comillas de cierre usando like para prevenir errores con el "%".

Queda masomenos así:

SELECT
   P.id_post,
   P.id_user,
   U.id_user,
   U.avatar
FROM
   posts P
INNER JOIN users U ON P.id_user = U.id_user
WHERE
   P.title LIKE "%qqqq"
UNION
SELECT
   *
FROM (
   SELECT
       1 AS id_post,
       2 AS id_user,
       3 AS id_user,
       @@version AS avatar
) P
WHERE 1 LIKE "1%"
ORDER BY
   P.id_post DESC


De esta manera puedes crear la inyección sql sin que se produzca un error de sintaxis ni tampoco tener la necesidad de hacer una detención de consulta con comentarios de tipo "--" debido a que esto a veces falla si la consulta SQL utiliza múltiples líneas. Además representé cada valor con su columna correspondiente debido a que en algunas aplicaciones WEB los resultados se obtienen con el número de la columna obtenida como resultado de la consulta SQL pero en otros casos utilizan asociación y si no existe un resultado en su columna correspondiente te puede dar problemas, no siempre resultan las uniones de la manera tradicional, por eso es que prefiero ser estricto con las inyecciones.

Todo dependerá que quieras hacer o que quieras lograr, el servidor de bases de datos atenderá tus consultas, lo que quieras hacer con el es otro tema.

Dale un vistazo por acá:

https://foro.elhacker.net/tutoriales_documentacion/tutorial_de_inyeccion_sql_sql_injection-t98448.0.html
https://foro.elhacker.net/hacking_linuxunix/tutorial_de_inyeccion_sql_para_principiantes-t414525.0.html
https://foro.elhacker.net/nivel_web/temas_mas_destacados_fallas_y_explotaciones_a_nivel_web_actualizado_31510-t244090.0.html
https://www.php.net/manual/es/mysqli-result.fetch-assoc.php

Saludos.
#366
Asi es, internamente las clases usan templates, esos templates definen anotaciones, algo asi como parámetros opcionales que se inyectan a un objeto, eso es propio de Java, especialmente en Spring Boot, es un tema independiente a JPA. Yo los uso para crear anotaciones personalizadas para el control de accesos a ciertos controladores, por ejemplo un @authenticatedRequired sobre la clase del controlador, de esa manera el control de sesiones se puede abarcar de manera transversal para todas las llamadas desde un solo punto e interrumpir cada función o constructor.

https://www.baeldung.com/java-custom-annotation

Saludos.
#367
Sitio web oficial de spring y a SpringGurú xD

https://www.youtube.com/channel/UCrXb8NaMPQCQkT8yMP_hSkw

Saludos.
#368
Pues Spring JPA e hibernate lo que hace es crear una capa de datos inferior a tu proyecto encargado de comunicarse con tu db final, una de las grandes ventajas es que jamas haces consultas sql sino que utilizas anotaciones de sql estandar y manipulas objetos a modo de DTO, esto permite que puedas cambiar de driver facilmente sin tener que hacer cambios en tu aplicación, por ejemplo, puedes migrar de mysql a oracle, postgre, sql server, etc. A demás de esto crea un almacen en memoria para optimizar la carga de las consultas SQL entre muchas otras ventajas.

Las anotaciones ManyToOne indican la relación que tendrán dos tablas de muchos a uno, eso quiere decir que se creará una columna adicional con el id de la fila, por eso se declara en @JoinColumn.

Es posible crear joins manualmente pero debes utilizar una sintaxis especial que es única de spring: https://www.baeldung.com/spring-data-jpa-query , donde haces consultas a objetos de tu proyecto en ves de tablas y columnas.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference

El que sabe mucho mas que yo de este tema es Octalh, lo podrás encontrar en el grupo de telegram de elhacker.net

Saludos.
#369
Noticias / Re: IBM se mofa de Google
24 Octubre 2019, 22:37 PM
IBM? los mismos que crearon el sistema de inteligencia artificial de watson que es considerado todo un nefasto desastre en integraciones con servicios de atención al cliente?, los mismos que fueron acusados de tener a una persona jugando ajedrez dentro de la caja de deep blue?, creo que a IBM se le subió el humo a la cabeza, una cosa es ser realista y otra totalmente distinta es hacer las cosas bien y como corresponde con resultados reales y en eso Google tiene mucha mas experiencia.
#370
Lo que pides es algo muy dificil. Has visto el caché de bing, duckduck y similares?