Instructor: Como has
visto hasta ahora, las inyecciones SQL son muy peligrosas.
Además, son muy fáciles de (murmura) y muy fáciles de encontrar.
Los encontrarás en todas partes en algunos sitios web realmente famosos.
Las personas intentan evitar estas vulnerabilidades utilizando filtros.
Los filtros pueden hacer que parezca que no
hay exploits, pero si realmente se esfuerza al usar
codificaciones, diferentes tipos de codificación o un proxy,
podrá omitir la mayoría de estos filtros.
Algunos programadores usan una lista negra.
Por ejemplo, evitan el uso de la unión, evitan el
uso de insertos y cosas por el estilo.
De nuevo, no es 100% seguro.
Se puede pasar por alto.
¿Usando una lista blanca?
Exactamente los mismos problemas que la lista negra.
La mejor manera de hacerlo es programar su aplicación
web de manera que no permita que se inyecte código y luego
se ejecute.
La mejor manera de hacerlo es usar una declaración parametrizada
donde los datos y el código están separados.
La mejor manera de mostrarle lo que quiero
decir con eso es usar un ejemplo.
Estoy manteniendo la menor cantidad de programación en este ejemplo.
No quiero que sea un ejemplo de programación.
En realidad, hay errores en la programación, pero
estoy tratando de darle el concepto
más que cómo programarlo.
El código vulnerable que estábamos viendo solía hacer esto.
Solía seleccionar * de las cuentas donde el nombre de usuario es igual a lo
que ponemos en el cuadro de texto1.
Luego solíamos poner en el cuadro
de texto
1, solo pongamos aquí, solíamos decir admin, y
luego cerramos la cita.
Entonces podemos hacer una selección de unión y
ejecutar otra cosa.
Luego, una vez que terminamos, solíamos agregar el comentario
que, básicamente, ignora todo lo que viene después.
Entonces, cuando copie esto y
lo pegue aquí, verá
lo que sucede.
Ahora, vamos a deshacernos de esto
porque esto solo hace que los colores no sean agradables.
(murmura), en realidad, solo voy a poner un comentario sobre esto.
Hará un select * de las cuentas
donde el nombre de usuario es
igual a admin, union select y ejecutar lo que queramos hacer.
Esto es muy malo y es muy difícil protegerse contra él.
Como dije, usando filtros
y demás, solo ocultaremos el problema, no lo solucionaremos.
La mejor manera
de hacer esto es usar las declaraciones parametrizadas así.
Esta es la forma segura de hacerlo.
En primer lugar, prepara su declaración.
La mayoría de los lenguajes como PHP
y todos ellos, en realidad, tienen una función como esa.
Puede preparar select * de las cuentas donde el nombre de
usuario es igual al signo de interrogación.
Luego envías los valores.
Entonces, PHP ahora lo sabe.
La instrucción SQL es select * de cuentas donde
el nombre de usuario es igual a algo.
Entonces tomará el valor de textbox1.
Entonces, incluso si entramos y usamos
nuestra declaración muy furtiva aquí
mismo, y la
pegamos allí, la aplicación web sabrá que el valor
para esto es admin union select.
En realidad, intentará ir
y seleccionar * de las cuentas donde está el nombre
de usuario, y luego, en realidad, agregará sus propias
citas e intentará encontrar un nombre de usuario con el siguiente nombre de usuario.
Todo esto se ejecutará así.
Por lo tanto, será select *
de las cuentas donde el nombre de usuario es igual a admin
union select, este hashtag.
Lo que ponga en su cuadro de texto se enviará como un valor.
La aplicación web sabrá que este es
un valor, no es un código, y nunca lo ejecutará.
Por lo tanto, esto lo protegerá contra las inyecciones de SQL.
Puede usar los filtros como segunda línea de
defensa, y también le recomiendo
que use los menos privilegios posibles.
Para cada base de datos, use un usuario con la
menor cantidad de privilegios que desee.
No permita que los usuarios hagan lo que quieran.
Si se trata de un sitio web simple que solo selecciona, entonces
solo permite que el usuario seleccione.
Si solo necesita seleccionar e
insertar, entonces solo permítales seleccionar e insertar.
Esta es una regla que debe cumplir con
todo, incluso con sistemas Linux.
Asegúrese de que los permisos sean siempre lo menos posibles.
Cada usuario no tiene permisos adicionales que
no necesita.