¿Usar JSON es una forma segura de manejar consultas SQL en Python?

1

La pregunta

Intentaré articular esto de la manera más clara y mejor posible:

Supongamos que tengo un programa python que se conecta a una base de datos en un servidor. A continuación, les pido que consideren que este programa de Python toma las consultas de MySQL de un archivo JSON, Python las lee y luego se usan para hacer que la base de datos haga algo. ¿Es esto seguro? ¿Por qué otros no hacen lo mismo? ¿He cometido algún tipo de error grave al hacer esto? ¿Es esto vulnerable a la inyección de SQL o similar?

Me disculpo por preguntar qué es más que una pregunta. Supongo que realmente quiero saber si es una idea buena o terrible.

Context

No tengo experiencia con la seguridad y comencé a usar Python para las cosas del lado del servidor hace una semana. Principalmente estoy haciendo esto para aprender . Estoy tratando de armar un sitio web que use Python y Mysql para manejar la base de datos. Esto significa:

  • En algún momento, este código llegará a producción.
  • Porque: 1) No soy muy bueno con la seguridad y 2) La gente realmente usará esto. Estoy muy preocupado por la seguridad del código.

Mi objetivo al comenzar este código era que quería una forma muy fácil y eficiente de hacer consultas seguras a mi base de datos MySql. Como resultado, mantuve todas mis consultas en un archivo JSON, que luego Python lee y regresa a un decorador de funciones que realiza una conexión a la base de datos.

El código

# Imports 
import json 
import mysql.connector 

# Class which reads json files 
class json_read():
    def __init__(self,name):
        self.name = name  
    def json_caller(self):
            with open(self.name) as f:
                f = json.load(f)[0]
                return f

# Returns the file needed to connect to the database 
f = json_read("database_connect.json") 
config = f.json_caller()

# Function decorater used to initiate the connection to the database 
def mysql_connect(func):
    def wrapper(*args, **kwargs):
        try: 
            cnx = mysql.connector.connect(**config)
            cursor = cnx.cursor(prepared=True) 
            cursor.execute(*args, **kwargs)
            result = cursor.fetchall() 
            print("\nConnection is stable @ the function " + func.__name__)
            print(result)
        except:
            print("\nConnection failed @ the function " + func.__name__)
    return wrapper 

# Returns the line from the json file associated with the key
class query_dbh():
    f2 = json_read("queries.json")
    def __init__(self, index): 
        self.index = self.f2.json_caller()[index]

@mysql_connect
def output(*args, **kwargs):
    pass 

# Select_names is the key
output(query_dbh("Select_names").index) 

Cómo se almacenan las consultas:

[
{
    "Select_names" : "SELECT first,last FROM user",
    "Select_id" : "SELECT id FROM user"

}
]
    
pregunta Ranch Mayonaise 06.10.2018 - 04:56
fuente

1 respuesta

1

Lo que quieres hacer es utilizar procedimientos almacenados. Esto está integrado en MySql en sí. Esto ayudará a prevenir los riesgos de inyección de SQL y posiblemente acelerará su aplicación porque la consulta no tendrá que compilarse y planificarse cada vez que se ejecute.

OWASP tiene un gran recurso sobre cómo prevenir la inyección de SQL. Aquí está la sección relevante a los procedimientos almacenados que enumeran sus ventajas e inconvenientes. enlace

    
respondido por el Daisetsu 06.10.2018 - 05:58
fuente

Lea otras preguntas en las etiquetas