Post Top Ad

Your Ad Spot

viernes, 15 de mayo de 2020

Cadenas de escape para MySQL para evitar la inyección de SQL


Cadenas de escape para MySQL para evitar la inyección de SQL
Con todo lo que se dice sobre trabajar con bases de datos usando MySQL y PHP en esta serie de tutoriales, una cosa que no cubrimos aún es la inyección SQL y cómo proteger su sitio de ella. La sintaxis para MySQL es muy específica, y si no lo hace bien, es fácil de romper. A medida que creamos consultas utilizando datos dinámicos de nuestras variables en PHP, debe tener cuidado de que los datos contenidos en esas variables no rompan también la sintaxis. Una de las principales cosas a tener en cuenta es la comilla simple entre cadenas. En este episodio, hablaremos un poco sobre la inyección SQL y el método utilizado para combatirla.

¿Qué es la inyección MySQL?

La inyección SQL es el proceso de un pirata informático malicioso en Internet que intencionalmente trata de aprovechar la naturaleza específica de la sintaxis SQL y el hecho de que puede romperse. Si un pirata informático puede reunir cuidadosamente una cadena de URL, datos de formulario o datos de cookies, para inyectar su SQL malicioso en la suya, su base de datos podría ser víctima de tablas caídas, datos robados, bases de datos enteras caídas, o peor. La idea principal es que el pirata informático aprovecha la capacidad de las comillas simples para indicar los puntos de inicio y finalización del código SQL. Si esas comillas simples no se escapan correctamente, entonces son propensas a este tipo de ataque.

La historia de las cuerdas de escape

El problema de escapar de cadenas se remonta a los inicios de PHP. Recordemos que el principal problema es esa molesta cita simple. Puede haber ocasiones en que una cadena contenga una comilla simple literal que se necesita, pero debemos asegurarnos de que MySQL comprenda que esta comilla simple en particular no es el final del límite de la cadena, sino un carácter real que queremos en la cadena.

Problema

Si estuviéramos insertando esto en nuestra base de datos, podría verse así:
El problema es que la comilla simple incluida en la cadena puede causar un problema para MySQL.

Solución

La solución a este problema es simplemente escapar de la cadena así.

¿Qué significa escapar de una cadena?

Esto es simplemente un medio para decirle a MySQL que esta no es la comilla simple que termina la cadena, sino que es parte de la cadena real y debe tratarse como tal. Entonces, como puede ver, la forma en que asignamos este significado especial al personaje para que MySQL sepa que es seguro es anteponerlo con un carácter de barra diagonal inversa. PHP ha tenido algunas formas de tratar de lidiar con esto a lo largo de los años, veamos algunas ahora.

Una lección de historia de cuerdas de escape

Si tiene muchos datos en su aplicación PHP, puede ver que tener que escapar de cualquier cita que pueda existir a mano en las cadenas de su aplicación sería una tarea agotadora. No solo eso, seguramente perderá algunos e introducirá problemas a pesar de sus mejores esfuerzos. ¿No sería ideal simplemente tener una función que haga esto por usted? Por supuesto que sí, por lo que PHP agregó esta capacidad al lenguaje hace muchas lunas.

addslashes$string)

Todo comenzó con la función addlashes en algún momento del pasado. Esta función toma una cadena como argumento y devuelve la cadena con los caracteres problemáticos, como una comilla simple que se le escapa automáticamente. Esta fue una buena idea, tan buena de hecho, que se convirtió por defecto en el lenguaje mediante algo llamado Magic Quotes.

Citas Mágicas

Magic Quotes es una directiva de configuración en PHP que llamará automáticamente a las barras añadidas en todos los datos GET, POST o COOKIE de forma predeterminada. La idea era que esto ahorraría a los desarrolladores el error de olvidarse de hacer esto por su cuenta y abrir sus sitios web a una vulnerabilidad de seguridad. Esto se agregó en PHP2 y se convirtió en el predeterminado en PHP3. Sin embargo, todas las cosas buenas llegan a su fin, y en PHP5.4 se enviaron citas mágicas a la papelera. ¿Por qué dices? Bueno, causó mucha confusión para los desarrolladores e hizo que los programas fueran mucho menos portátiles de un host a otro. Esto se debe a que uno nunca sabía si la configuración estaba activada o desactivada para Magic Quotes. Entonces, en algunos casos, el código funcionaría bien y en otros, si fallara por completo. Sin embargo, hay una solución a estos problemas.

mysqli_real_escape_string$connection$string)

En el maravilloso mundo de PHP, a veces nos encontramos con nombres de funciones increíblemente largos con guiones bajos entre las palabras. Este es uno de esos casos. Sin embargo, esta es una gran función que debe utilizar. Toma una cadena y luego la escapa de tal manera que sea perfectamente segura para las declaraciones de MySQL. Por lo tanto, puede construir sus consultas en PHP tanto como desee, luego, antes de ejecutar la consulta, solo asegúrese de colocar la picadura completamente ensamblada a través de mysqli_real_escape_string y todo estará bien.

Observar

Tenga en cuenta que cuando la consulta se repite por primera vez, contiene todos esos caracteres problemáticos. En MySQL, las cadenas deben estar entre comillas simples exclusivamente, por lo que al poner esta cadena dentro de comillas simples, la consulta ahora está rota y es peligrosa para la base de datos. También tenga en cuenta que una vez que ejecutamos nuestra cadena de consulta a través de la función mysqli_real_escape_string, resulta nítida, limpia y se escapa de forma segura para su uso con la base de datos.

Esto no es bueno
¿No es bueno que no tengamos que escapar de los personajes solos?

¡Esto es bueno!
¿No es agradable que no tengamos que escapar de los personajes solos?

Proporcionar los argumentos correctos

La función mysqli_real_escape_string toma dos argumentos. El primer argumento es la conexión de la base de datos en sí, y el segundo es la cadena que desea limpiar. Es bastante obvio que necesitamos proporcionar la cadena para limpiar, pero la conexión de la base de datos no es tan obvia. Solo recuerde proporcionarlo, o la función de hecho fallará.

La conclusión mysqli_real_escape_string

La conclusión de esta rápida lección es mantener sus datos seguros mediante el uso adecuado de la función mysqli_real_escape_string. Cuando esté utilizando un marco, no tendrá que preocuparse por él, pero cuando PHP y MySQL nativos están en uso, debe realizar este paso manualmente.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas