Implementando Estrategias de Carga de Archivos Seguras
Listado Blanco de Tipos de Archivos
Una de las maneras más efectivas de prevenir las cargas de archivos maliciosos es implementar un listado blanco de tipos de archivos permitidos. Esto implica definir un conjunto de extensiones de archivos confiables que se permiten cargar y rechazar cualquier archivo que no coincida con el listado blanco.
Código de ejemplo (en Python usando Flask):
from flask import Flask, request, abort
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = '/path/to/upload/directory'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
abort(400)
file = request.files['file']
if file.filename == '':
abort(400)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return 'Archivo cargado correctamente'
else:
abort(400)
Implementando Restricciones de Tamaño de Archivo
Además de la lista blanca de tipos de archivos, es importante implementar restricciones sobre el tamaño máximo de archivo que se puede cargar. Esto ayuda a evitar que los atacantes carguen archivos grandes que podrían sobrecargar los recursos del servidor.
Código de ejemplo (en Python usando Flask):
from flask import Flask, request, abort
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = '/path/to/upload/directory'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 ## Límite de 16 MB
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
abort(400)
file = request.files['file']
if file.filename == '':
abort(400)
if file:
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return 'Archivo cargado correctamente'
else:
abort(400)
Sanitización de Nombres y Rutas de Archivos
Es importante sanitizar correctamente los nombres y rutas de archivos para prevenir ataques de recorrido de directorios, donde un atacante intenta acceder a archivos fuera del directorio de carga previsto.
Código de ejemplo (en Python usando Flask):
from flask import Flask, request, abort
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = '/path/to/upload/directory'
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
abort(400)
file = request.files['file']
if file.filename == '':
abort(400)
if file:
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return 'Archivo cargado correctamente'
else:
abort(400)
Implementando Validaciones del Lado del Servidor
Además de las validaciones del lado del cliente, es crucial implementar validaciones del lado del servidor para asegurar que los archivos cargados sean seguros y no contengan ningún contenido malicioso.
Código de ejemplo (en Python usando Flask):
from flask import Flask, request, abort
from werkzeug.utils import secure_filename
import os
import magic
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = '/path/to/upload/directory'
ALLOWED_MIME_TYPES = {'text/plain', 'image/png', 'image/jpeg'}
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
abort(400)
file = request.files['file']
if file.filename == '':
abort(400)
if file:
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
## Verificar el tipo MIME del archivo cargado
mime_type = magic.from_file(file_path, mime=True)
if mime_type not in ALLOWED_MIME_TYPES:
os.remove(file_path)
abort(400)
return 'Archivo cargado correctamente'
else:
abort(400)