¿Validar la columna de la base de datos y los nombres de las tablas para evitar SQLi?

3

Hay algunos tipos de software, como ORM y constructores de consultas, que tienen que concatenar nombres de columnas y tablas en consultas SQL. Dado que los desarrolladores aparentemente colocan datos no confiables en todo tipo de lugares sin segundos, una estrategia sensata para tal biblioteca sería validar que el nombre provisto es en realidad un nombre, y no un ataque SQLi.

Una forma sencilla de hacerlo sería coincidir con una expresión regular como /[a-zA-Z_]+/ . Sin embargo, esto limitaría los nombres de columna que pueden usarse. Muchos DBMS son bastante liberales en cuanto a qué nombres de columna permiten, y no quiero introducir restricciones artificiales.

Por lo tanto, lo que estoy buscando es un enfoque para validar o sanear los nombres de tablas y tablas de bases de datos. Puede ser una tarea difícil, pero lo ideal sería:

  1. Trabajo para las principales bases de datos: Postgres, MySQL, Oracle, MSSQL, etc.
  2. Limite qué nombres de columna se pueden usar lo menos posible.
  3. Sé inmune a SQLi.

Se pueden hacer compromisos con respecto al # 1 y # 2, pero no al # 3.

    
pregunta Anders 16.03.2018 - 00:51
fuente

1 respuesta

1

Creo que tu mejor apuesta es citar. El estándar SQL-99 especifica que se utiliza comillas dobles (") para delimitar identificadores (pero su millaje con varias DBs variará). Esta pregunta tiene más información sobre cómo se maneja esto en las bases de datos.

Oracle tiene una función específica para este DBMS_ASSERT.ENQUOTE_NAME - pero si estás buscando ir a la plataforma cruzada, tendrás que hacerlo tú mismo. Cita doble el nombre, pero busca comillas dobles en la cadena y rechaza la cadena si no se han escapado (emparejadas).

    
respondido por el Egret 24.03.2018 - 01:45
fuente

Lea otras preguntas en las etiquetas