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.

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