¿Por qué la protección contra la inyección SQL no es una prioridad alta?

39

En Stack Overflow, veo una gran cantidad de código PHP en preguntas y respuestas que tienen consultas MySQL que son altamente vulnerables a los ataques de inyección SQL, a pesar de que las soluciones básicas están ampliamente disponibles durante más de una década.

¿Hay alguna razón por la cual estos tipos de fragmentos de código todavía se usan hoy?

La ligereza corre con Mónica
fuente
37
culpe a los tutoriales en línea mal escritos. la mayoría de las veces, las personas simplemente copian y pegan cualquier código que encuentren en la red. JavaScript también es otra víctima de dicha práctica.
KJYe.Name
34
Culpa a los blogs. Ah, y W3Schools ...
Brian Driscoll
13
Sí, absolutamente W3Schools - ver w3fools.com
DisgruntledGoat
2
Constantemente veo personas advirtiendo sobre la inyección de SQL, por lo que ni siquiera creo que la premisa de esta pregunta sea válida. Que es una alta prioridad.
GrandmasterB
3
Lo que veo en muchas de las respuestas es que es más fácil enseñar PHP críticamente roto que enseñar, bueno, PHP no está críticamente roto. No puede aceptar ese argumento y aún así afirmar que PHP no es un lenguaje incorrecto
user16764

Respuestas:

34

Creo que se debe principalmente a a) ignorancia b) pereza. Los principiantes generalmente no saben mucho sobre la inyección sql, e incluso cuando lo escuchan, lo ignoran porque es mucho más simple y fácil de codificar de esa manera.

froadie
fuente
8
He tratado de corregir esas cosas en otro lugar, solo para que me digan que no es relevante para el problema en cuestión. Entonces, debido a que mucha gente prefiere un simple hackeo a una buena solución un poco más compleja, los malos ejemplos se quedan solos.
l0b0
66
La mayoría de las personas realmente no se preocupan por la inyección SQL hasta que se les aplica. Entonces, de repente, se preguntan a dónde fueron sus mesas.
Joel Etherton
1
La otra razón es que la inyección SQL no siempre se considera una preocupación relevante para las aplicaciones internas. (No es que tengan razón.)
John Fisher
1
No olvide que las respuestas están ahí para responder la pregunta. A menudo, el pseudocódigo (o SQL) está destinado a responder la pregunta, no necesariamente proporciona una solución segura de copiar y pegar (a pesar de cómo la respuesta se puede usar en la realidad).
Dalin Seivewright
1
@ l0b0 Conozco a alguien que hizo que la gente tomara en serio las soluciones de inyección SQL al demostrar un ataque de inyección SQL contra el código de producción actual.
user16764
26

PHP hace que sea muy fácil para las personas que saben muy poco crear páginas web dinámicas útiles. Esto significa que PHP atraerá a muchos principiantes, que crearán algo útil, aprenderán de otros ejemplos útiles y se darán la vuelta para enseñar a otros cómo hacer esta cosa genial y útil. El resultado es una gran cantidad de códigos incorrectos y una oferta de programadores que no conocen mejor.

Solo empeora las cosas que una gran fracción de programadores competentes no quieren tener nada que ver con PHP. Esto reduce la base de personas experimentadas que están dispuestas a enseñar mejor a otros. Pero, ¿por qué evitan PHP? Bien por una combinación de factores. En parte no les gusta lidiar con las verrugas del lenguaje. Y en parte es porque preferirían trabajar con un buen código, y no hay muchos PHP buenos por ahí.

Esta constelación exacta de problemas solía infligir Perl. Como un ejemplo brillante, considere el caso de Matt Wright, un adolescente entusiasta que se propuso proporcionar muchos scripts CGI útiles, bien documentados y fáciles de instalar en la década de 1990. Desafortunadamente no entendió nada sobre seguridad, y tampoco las personas que querían usar sus cosas. El resultado fueron los Archivos de Script de Matt Wright, que era un flujo interminable de problemas de seguridad para los primeros scripts CGI. A pesar de esfuerzos como http://www.scriptarchive.com/nms.html , el problema no mejoró para Perl hasta que los proveedores de alojamiento compartido hicieron PHP más conveniente que cualquier otra cosa. Eso condujo al problema de pasar de Perl a PHP.

btilly
fuente
Como dijiste, el problema no es perl o PHP, es que estos lenguajes permiten a los principiantes hacer muchas cosas, lo cual es bueno, pero no siempre proporcionan formas de hacerlo bien que son tan obvias.
Zachary K
2
@ZacharyK: ¿No es ese el defecto del idioma por defecto?
Lightness compite con Monica el
66
@ tomalak-geretkal: Usas la palabra "culpa" como si hacer que las cosas se hicieran es algo malo. Las mismas características que conducen a muchos códigos incorrectos también conducen a muchos problemas reales resueltos. No está claro que esto sea algo malo en general.
btilly
'Culpa' Re: si HTML (o más bien los navegadores lo interpretan) habían sido tan tolerante a fallos como XSL, hay nunca habría sido un World Wide Web ...
Benjol
8

Desafortunadamente, hay toneladas de tutoriales PHP más que malos y algunos libros PHP más antiguos también apestan al decirle a la gente que escriba el código adecuado (no usar register_globals, etc.).

Además, al magic_quotes_gpcestar habilitado en el pasado, a las personas no les importaba escapar porque "simplemente funcionaba".

ThiefMaster
fuente
4

Personalmente, creo que PHP es fácil de usar, por lo que, naturalmente, es fácil de usar mal.

davidhaskins
fuente
2

Como humano y programador, me resulta notablemente fácil cometer errores y pasar por alto ciertas cosas, especialmente cuando se me presiona por el tiempo.

Es fácil, y tal vez demasiado tentador, culpar a cierto idioma por ser demasiado accesible por su propio bien. Pero eso sería pasar por alto el gran problema de la falibilidad humana, independientemente del idioma elegido para programar.

De acuerdo, hemos recorrido un largo camino desde el lenguaje ensamblador, y creo que sería una programación mucho más productiva en un lenguaje más moderno, como PHP, Python, Ruby o Java.

PHP (y otros lenguajes de secuencias de comandos) de hecho han reducido la barrera de entrada. Eso puede significar que más recién llegados a la programación prueben PHP primero. Pero eso ciertamente no significa que todos los programadores de PHP estén de alguna manera menos calificados o menos capaces de aprender de sus errores que los programadores de otros lenguajes.

Rasmus Lerdorf creó PHP en su forma original en 1994, ha evolucionado considerablemente desde entonces. En su encarnación más moderna, admite programación orientada a objetos, así como marcos excelentes, como Symfony. PHP como lenguaje se ha liberado de sus restricciones originales y ha crecido para ofrecer una gran flexibilidad en cómo los programadores pueden elegir usarlo. Puede usarlo para crear un script de 9,000 líneas de código de espagueti, o puede usarlo dentro del contexto de un marco MVC moderno, como Symfony: ¡es su elección!

Sospecho firmemente que las vulnerabilidades de seguridad no están restringidas a un solo idioma. Es tentador descartar a todos los programadores PHP como de alguna manera menos capaces o más propensos a escribir código inseguro. Pero me pregunto cuánto de eso es el sesgo del lenguaje, y cuánto de eso es un hecho.

Jay Sheth
fuente
No dije nada sobre "todos los programadores PHP".
Lightness compite con Monica el
2

Creo que parte del problema son las personas que simplemente copian el código sin molestarse en aprender lo que están haciendo, pero en mi opinión, la forma en que enseñamos porgamnming está rota y es una de las razones por las que hay tanto código malo. Enseñamos la sintaxis fuera de contexto, por lo que los principiantes no saben cuándo usar algo y cuándo no, o qué problemas se pretende resolver con la sintaxis y qué problemas no se pretende resolver. Entonces usan un martillo cuando una llave inglesa hubiera sido la mejor herramienta.

Entonces, por ejemplo, en lugar de enseñar solo la sintaxis, organiza el curso como (Claramente, habría más pasos, este es solo un ejemplo básico de construcción de problemas básicos a problemas más complejos en lugar de solo enseñar sintaxis):

  1. Así es como configuras una página web básica
  2. Así es como haces que la página web extraiga datos de una base de datos
  3. Así es como se envían datos desde una página web a una base de datos
  4. Así es como se asegura de que se envíen los datos correctos.
  5. Así es como protege su base de datos contra la entrada de datos maliciosos
HLGEM
fuente
esa es más o menos la forma en que me enseñaron php +1
Rémi
1

Creo que encontrará una cantidad similar de ejemplos de MS SQL + ASP / ASP.NET que son igual de vulnerables.

Creo que el problema se debe en parte al hecho de que cuando intentas enseñar algo, por ejemplo, filtrar datos usando una cláusula WHERE, entonces realmente no quieres saturar tu ejemplo escapando adecuadamente de tu cadena de consulta o usando un comando parametrizado.

He estado entrenando desarrolladores durante muchos años y puedo empatizar con personas que escriben códigos horribles en tutoriales. A veces eso es lo más fácil de entender. Sin embargo, aparte, siempre señalo el código que es vulnerable y lo convierto en un tema secundario interesante.

Fung
fuente
66
Eso no debería ser un aparte. Eso debería ser parte de la lección básica. Posiblemente con una advertencia grande y gorda sobre la forma incorrecta de hacer las cosas. Las personas tienden a cortar y pegar lo que ven por primera vez, y realmente quieres que sea la forma correcta de hacer las cosas.
btilly
Ciertamente, en el mundo .NET, la parametrización es bastante sencilla en estos días y, de hecho, debería ser algo de 'página uno'.
Alan B
1

El autor original de PHP, Rasmus Lerdorf , en su infame entrada de blog aboga por el desarrollo "sin marco" . Aunque para consultas SQL usa PDO, entonces no hay riesgo de inyección SQL. Todavía es bastante feo y obsoleto en comparación con los marcos MVC modernos con capas ORM.

vartec
fuente
55
Ciertamente es posible sobre-diseñar sitios con marcos complejos que simplemente no necesita. Diría que las sugerencias de Rasmus rayan en lo criminalmente peligroso, pero definitivamente hay un término medio sensato.
Lightness compite con Monica el
hoy en día usar ORM no es una ingeniería excesiva; Es estándar. Entonces está usando el patrón MVC.
vartec
3
@vartec: No es "estándar" simplemente porque todas las ovejas lo están usando (y, por lo que vale, ni siquiera todas las ovejas lo están usando). Para los scripts pequeños que puede fácilmente ser sobre-ingeniería.
Lightness compite con Monica el
1
@Tomalak: es estándar, porque esa es la forma de implementar proyectos limpios y sostenibles. Los "pequeños guiones" tienden a crecer con el tiempo y a convertirse en monstruosidades imposibles de mantener.
vartec
2
@vartec: Creo que has entendido mal el significado de "estándar".
Lightness compite con Monica el
1

Puede culpar a esta mala práctica en el propio PHP. Las versiones heredadas de PHP (hasta alrededor de 2006) escaparían de todas las variables de entrada GET y POST para que fueran adecuadas para la interpolación de consultas de la base de datos POR DEFECTO. Ver http://php.net/manual/en/security.magicquotes.php

Ben XO
fuente
2
Hubo un tiempo en que escapó a TODAS las variables como si estuvieran entrando en MySQL específicamente, ya sea que alguna vez lo fueran o no . Nota para los diseñadores de idiomas: cuando tenga que implementar stripslashes(), ya lo ha hecho mal.
Dan Ray
0

No confunda el propósito de un tutorial, que es demostrar algo simplemente con lo que debe hacerse en un entorno de producción. Por ejemplo, la mayoría del código tutorial que he escrito tiene poca o ninguna verificación de error / excepción. Intento recordarle al lector que el código solo demuestra cómo realizar una tarea específica, no cómo cubrir todos los resultados posibles.

SnoopDougieDoug
fuente
3
Lo sentimos, pero absolutamente ningún código de ejemplo debería mezclar consultas mySQL con PHP. Eso simplemente lo está haciendo mal.
Raynos
1
E irresponsablemente.
Lightness compite con Monica el
-1 para most tutorial code I have written has little or no error/exception checking..
Yannis
Puedo ver el punto del OP. Irresponsable es cuando un empleador contrata a un tipo que carece de conocimiento sobre la inyección de SQL y similares.
Raffael
Creo que este enfoque es defendible si incluye comentarios directamente en el código que dice "¡No use esto en producción!". De esa manera, los copy / pasters no tienen excusa.
Benjol
-1

Cuando estaba aprendiendo PHP, miré algunos de estos libros de PHP + MySQL, y sí, siento que contribuye a esa mala práctica. Pero tengo simpatía, porque están enseñando el idioma , no buenas prácticas de programación. De lo contrario, ¿dónde terminaría?

Steve Rathbone
fuente
2
Pero cuando está enseñando el idioma, aún debe usar las API preferidas en sus ejemplos. Como siempre, use la forma paramétrica de consultas SQL, posiblemente con una nota al pie como "Nunca piense en usar la interpolación para construir SQL. Parece un poco más fácil, pero es extremadamente propenso a las vulnerabilidades de seguridad".
Jan Hudec
Sí, buenos puntos. Las notas a pie de página serían un buen recordatorio, y eso también se aplica a los tutoriales en línea. Sin embargo, con toda seriedad, sería genial si los autores de libros de todos los idiomas pudieran incorporar los consejos de OWASP en textos para principiantes. Incluso solo como referencia. La Fundación OWASP hace un buen trabajo.
Steve Rathbone
@indifferentDrum: También puedes enseñar a las personas a conducir con los pies, no significa que sea una buena idea.
Lightness compite con Monica el