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"
}
]