Saltar navegación

20260519 AccesoBD_6 - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 19 de mayo de 2026 por Raquel G.

13 visualizaciones

Descargar la transcripción

Bueno, pues efectivamente, esto es feo, ¿verdad? Que tan fácilmente podamos extraer toda la información de una base de datos, pues es feo. 00:00:01
Vale, entonces, este tipo de sentencias hay que usarlas con limitaciones. En ciertos contextos son las más rápidas, porque el acceso a una base de datos muchas veces es el cuello de botella de una aplicación. 00:00:22
Entonces lo del tiempo de acceso no es una tontería 00:00:34
Y estas sentencias son las más rápidas 00:00:37
Pero tienen este problema 00:00:39
Entonces tenemos la posibilidad de hacer este método 00:00:40
Sin que nadie pueda hacer esta inyección SQL de aquí 00:00:44
Entonces vamos a hacer este método 00:00:50
Pero con una versión ya segura 00:00:52
Pongo aquí versión segura 00:00:53
Versión segura 00:01:08
Vale, de este método 00:01:14
Bueno, pues la conexión es igualita 00:01:15
la misma, pero ahora nuestra 00:01:19
sentencia no va a ser de tipo statement 00:01:21
¿vale? 00:01:23
entonces, como va a ser más larga 00:01:26
vamos a quitarla del 00:01:27
de este de aquí 00:01:29
para no hacer un try con recursos tan grandote 00:01:31
la quito de aquí 00:01:34
entonces nuestra sentencia ahora va a ser 00:01:37
del tipo 00:01:39
prepared 00:01:40
prepared 00:01:42
statement 00:01:46
que también se crea a partir de la 00:01:48
conexión, pero en lugar de con 00:01:53
createStatement, se crea con 00:01:55
prepare 00:01:57
prepareStatement 00:01:57
está 00:02:02
aquí, y aquí 00:02:02
con esto 00:02:11
estamos precompilando 00:02:13
una primera sentencia 00:02:16
¿vale? precompilando una primera 00:02:17
sentencia que todavía no se está ejecutando 00:02:19
aquí le damos el SQL 00:02:21
que queremos hacer 00:02:23
el SQL que queremos hacer, ¿cuál es? 00:02:24
queremos hacer este 00:02:27
select asterisco 00:02:29
from 00:02:32
personas 00:02:33
minúscula 00:02:36
que queda más bonito 00:02:37
personas 00:02:38
where 00:02:41
nombre 00:02:43
igual y aquí era donde venía 00:02:45
el problema 00:02:48
que yo aquí directamente concatenaba 00:02:48
con lo que me habían mandado desde fuera 00:02:52
concatenaba tal cual 00:02:54
pues aquí no concateno con nada 00:02:55
aquí pongo una interrogación 00:02:57
y digo, oye, yo voy a ejecutar una sentencia 00:02:58
de esta estructura 00:03:04
y aquí va a entrar algo 00:03:06
que tiene que ser un parámetro válido para esto de aquí 00:03:11
entonces, te estoy avisando de que esto es un select 00:03:14
un select con un único parámetro 00:03:17
o sea, aquí no puedes luego añadirme un or 00:03:20
ni un script, ni nada 00:03:24
con esto estamos diciendo, aquí solamente vas a poder añadir 00:03:26
un parámetro para nombre 00:03:31
y el resultado va a ser 00:03:32
una select con una búsqueda 00:03:35
por un único parámetro 00:03:37
aquí no cabe 00:03:38
ni luego un or después 00:03:41
ni luego un script, no cabe nada 00:03:42
en esta sentencia solo va a caber un select 00:03:44
con un único parámetro 00:03:46
con el valor que sea 00:03:48
entonces estamos dándole un aviso de que eso es lo único 00:03:50
que se va a poder hacer 00:03:53
ahora ya 00:03:53
esto por ahora ya lo modificaremos 00:03:55
verificaremos. Ahora le damos los parámetros, le decimos, oye tú, sentencia que te estoy 00:03:59
preparando, la primera interrogación que hay, sustituyela, como es un string, pongo 00:04:05
setString, la primera interrogación que hay, sustituyela con lo que yo te diga. Empezando 00:04:17
desde el 1. Si esta SQL, esta sentencia 00:04:23
tuviera más interrogaciones, porque yo busco por más 00:04:30
where nombre, and, edad, no sé qué, si tuviera más interrogaciones 00:04:34
pues las iría fijando todas. Set string, 1 nombre 00:04:38
set int, 2 edad, lo que fuera. 00:04:42
Pero con esta estructura ya estoy diciendo exactamente lo único 00:04:46
que se va a poder ejecutar. Exactamente esto. Cualquier otra 00:04:50
cosa, que vaya aquí 00:04:54
dentro, que no sea exactamente 00:04:56
un valor de parámetro para esto, 00:04:58
pues eso ya no lo va a ejecutar. 00:05:01
Entonces, 00:05:03
ahora ya falta ejecutarlo. Vale, pues para 00:05:04
ejecutarlo, con hacer el execute query, 00:05:06
ya no hay que darle nada, porque ya está hecho, 00:05:08
ya estaría ejecutado. 00:05:10
PS. 00:05:13
Ya está. 00:05:16
Ahora aquí ya es imposible hacer 00:05:18
la inyección. 00:05:20
100%. Podemos probarlo. 00:05:24
Entonces, la clave 00:05:29
en lugar de una statement normal 00:05:30
hacer una prepare de statement 00:05:32
que lo primero 00:05:34
que hace es decir, oye, este es 00:05:36
el tipo de SQL que vamos a hacer 00:05:38
este 00:05:40
una select con un parámetro 00:05:40
de búsqueda con 00:05:44
este valor, con lo cual aquí 00:05:46
solo se admiten cosas 00:05:50
que sean valores para nombre 00:05:52
es imposible 00:05:53
a partir de aquí que me aparezca 00:05:56
una concatenación con cosas que no sean valores 00:05:58
para nombre porque ya está avisada 00:06:00
el prepara statement de que solo puede ser eso 00:06:02
una vez que ya está este avisado 00:06:03
con sus interrogaciones se van fijando 00:06:06
una por una, en nuestro caso solo hay una 00:06:07
que fijar, pues ya está fijada 00:06:10
y ahora ya ejecutamos 00:06:12
la query 00:06:14
la ejecutamos 00:06:14
y una vez que tengo los registros procedo exactamente 00:06:16
igual, entonces ahora 00:06:20
si nosotros 00:06:27
volvemos a intentar 00:06:29
voy a cambiar en el main 00:06:31
para que ahora llame al 2 00:06:35
al que es seguro 00:06:37
que era getPersonasByNombre 00:06:38
cambiamos a la versión 2 00:06:42
cambiamos a la versión 2 00:06:44
recupera personas por nombre 00:06:47
vamos a darle 00:06:49
esta, que era la peligrosa 00:06:51
no me saca nada 00:06:53
porque entonces 00:06:56
ahora ya si, lo que busca es una persona 00:06:57
que se llame así 00:06:59
no hay ninguna persona que se llame así 00:07:00
con lo cual no recupera 00:07:02
Vale, ahora ya, no, esto es solamente el parámetro nombre, eso es. 00:07:04
Entonces, no lo hay, pues no lo recupero. 00:07:10
Vale, entonces este tipo de sentencia, 00:07:17
este tipo de sentencia es más larga de hacer, 00:07:19
porque hay que ir fijando las interrogaciones, 00:07:24
pero lógicamente es más segura. 00:07:26
claro, imagínate, vamos a hacer 00:07:28
para que tenga varios, un método 00:07:52
que devuelva 00:07:53
todas las 00:07:55
personas cuyo nombre 00:08:00
empieza 00:08:02
por 00:08:04
A y son mayores de edad 00:08:04
por ejemplo 00:08:07
a ver, public 00:08:08
static 00:08:11
get personas 00:08:13
mayores edad 00:08:16
by inicial 00:08:21
venga, le damos una inicial 00:08:23
que me devuelva 00:08:27
todas las personas con esa inicial 00:08:40
mayores de edad 00:08:42
vale, vamos a copiar 00:08:44
esto y lo 00:08:48
retocamos 00:08:49
vale, mi array list de personas 00:08:51
ahora, tengo que construir el SQL 00:09:00
entonces, vosotros aquí sois los 00:09:02
expertos en SQL 00:09:04
¿cómo se pone la condición 00:09:05
de que un nombre 00:09:08
un campo 00:09:10
de marchar empiece por un carácter? 00:09:12
vale, vamos a 00:09:15
comprobarlo aquí 00:09:16
ver nombre, like 00:09:17
el carácter 00:09:19
¿qué? 00:09:23
¿me has dicho? 00:09:24
no, pero era comilla por sentación 00:09:26
¿comilla? 00:09:27
sí, comilla simple 00:09:29
bueno, debería ser 00:09:30
no, a por sentación 00:09:34
Ah, porcentaje 00:09:35
Sí, porque 00:09:36
Porcentaje significa 00:09:38
Cero o más o varios 00:09:39
Vale, sí, lo que pasa es que este ejemplo no nos gusta 00:09:42
Porque 00:09:45
Para hacer con este 00:09:45
Hay que 00:09:49
Habría que hacer otra sentencia 00:09:50
Habría que fijarlo 00:09:53
Entonces, no, no nos 00:09:54
Vamos a complicar 00:09:57
Ahora, porque tendríamos que incorporar otro tipo de sentencia 00:09:59
Entonces, que se llamen de una manera 00:10:01
Siendo mayores de edad 00:10:04
Todos los pepitos mayores de edad 00:10:05
Así no nos complicamos 00:10:06
Vale, get personas mayores de edad 00:10:08
Por nombre 00:10:13
Vale 00:10:14
Entonces ahora 00:10:15
Añadiríamos where nombre igual a este 00:10:18
And, ahora ya sí 00:10:21
And 00:10:22
Edad igual a otra interrogación 00:10:23
¿Verdad? 00:10:28
No, mayor o igual, perdón 00:10:31
Que el mayor o igual en SQL es ese 00:10:32
¿No? 00:10:36
¿Es ese? 00:10:37
El mayor o igual en SQL 00:10:40
vale, entonces 00:10:41
ahora yo, mi nombre es este 00:10:47
y me fijo la otra interrogación 00:10:50
ps.setint 00:10:52
la interrogación 00:10:54
2 igual a 00:10:56
18, ahora 00:10:58
este me sacará solo los mayores 00:11:03
de edad que se llaman así 00:11:05
anedadman 00:11:07
dos interrogaciones, fijo los dos valores 00:11:09
y me saca esas personas 00:11:11
entonces si pongo 00:11:15
Voy a poner otra Ana 00:11:16
Pero más pequeña 00:11:22
Con 12 años 00:11:25
Ahora tengo dos que se llaman Ana 00:11:27
Pero solo una es mayor de edad 00:11:31
Vamos a 00:11:33
Comprobarlo 00:11:35
Personas 00:11:45
Mayores de edad 00:11:51
De edad por nombre 00:11:53
El caso 4 00:11:59
Sería como el 00:12:01
Pero cambiando el método 00:12:04
El caso 4 00:12:05
Un segundito 00:12:09
Operaciones de personas mayores de edad 00:12:10
Vale, ya tengo el caso 4 00:12:16
Que son solo las mayores de edad 00:12:22
Pues efectivamente solo me ha sacado la que es mayor de edad de las dos 00:12:33
Este mismo 00:13:00
No, no, no, esta es la interrogación 00:13:01
que ya se asume que va a ser un string 00:13:08
hay que poner la interrogación 00:13:10
hay que ponerla entre comillas y nada 00:13:11
Claro, aquí el string 00:13:12
ya marca que es un string 00:13:16
Vale 00:13:17
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Primer Curso
Subido por:
Raquel G.
Licencia:
Todos los derechos reservados
Visualizaciones:
13
Fecha:
19 de mayo de 2026 - 13:49
Visibilidad:
Clave
Centro:
IES ROSA CHACEL
Duración:
13′ 40″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
64.16 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid