Saltar al contenido

¿Inyección SQL usando letras y números?

Si te encuentras con algún detalle que no comprendes puedes dejarlo en los comentarios y te responderemos tan rápido como podamos.

Solución:

Solo habría una falla de seguridad si fuera posible dejar el MySQL string contexto literal el $id El valor se inserta en y para proporcionar fragmentos de SQL arbitrarios. Y esto solo es posible si $id contiene la llanura ' eso denotaría el delimitador final de MySQL string literal:

// resulting SQL statement with $id = "' OR '1'='1"
SELECT * users WHERE id = '' OR '1'='1'

Ahora que estás eliminando cualquier ' personaje de $idno es posible salir del string contexto literal y, por lo tanto, no es posible proporcionar fragmentos de SQL arbitrarios.

Sin embargo, esta conclusión se aplica solo para el caso de que el valor se use en MySQL string literal. Si está utilizando el mismo filtrado de entrada en valores en una consulta diferente, aún puede ser vulnerable a las inyecciones de SQL.

Dicho esto, métodos como mysqli::prepare y mysqli::escape_string son técnicas de mitigación adecuadas. mysqli::prepare implementa las llamadas declaraciones/consultas parametrizadas a través de declaraciones preparadas donde el comando (sentencia SQL) y los datos proporcionados por el usuario están separados entre sí para que los datos proporcionados por el usuario no puedan interpretarse erróneamente como comandos. mysqli::escape_string sería similar a su técnica actual, ya que simplemente escapa de ciertos caracteres de datos para no confundirse con caracteres de control como el string delimitador final literal.

(Publicaría esto como un comentario, pero los comentarios no hacen enlaces de manera ordenada).

Esto es bastante similar a muchas preguntas en Stack Overflow.

El Proyecto de Seguridad de Aplicaciones Web Abiertas (OWASP) señala que escapar de los caracteres especiales es una defensa contra la inyección SQL:

  1. Usar declaraciones preparadas (consultas parametrizadas) y procedimientos almacenados
  2. Si una API parametrizada no está disponible… Caracteres especiales de escape
  3. Realizar validación de entrada de lista blanca

En cuanto al código de prueba de concepto que logra SQLi sin caracteres especiales, no he visto ninguno, pero la ausencia de evidencia no es evidencia de ausencia. Si puede implementar consultas parametrizadas, ¿por qué no hacerlo?

Una regla general: ¡no reinventar la rueda!

Aunque el código que proporcionó probablemente no sea explotable, hay algunas buenas razones para usar declaraciones preparadas (un buen marco de persistencia es aún mejor) siempre que sea posible:

  • Las declaraciones preparadas son eficientes.
  • No desea ocuparse de todos los resultados posibles de alimentar caracteres exóticos a su motor de expresiones regulares (vea el fiasco de mysql_escape_string())
  • En relación con el punto anterior: si los datos del usuario se almacenan/codifican/formatean de formas no triviales, puede ser posible el contrabando de SQL
  • En su ejemplo, la defensa se implementa en dos fases: tanto el RE como la expresión SQL deben ajustarse teniendo en cuenta el otro componente. A medida que su base de código comience a crecer (y tal vez se unan otros desarrolladores), será difícil cuidar siempre ambos pasos y, tarde o temprano, cometerá un error explotable.

Puntuaciones y comentarios

Agradecemos que desees apoyar nuestro cometido exponiendo un comentario y valorándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *