Implementando Estratégias de Carregamento de Ficheiros Seguras
Listagem Branca de Tipos de Ficheiros
Uma das formas mais eficazes de prevenir carregamentos de ficheiros maliciosos é implementar uma lista branca de tipos de ficheiros permitidos. Isto envolve definir um conjunto de extensões de ficheiros confiáveis que são permitidas para carregamento e rejeitar quaisquer ficheiros que não correspondam à lista branca.
Código de exemplo (em 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 'Ficheiro carregado com sucesso'
else:
abort(400)
Implementando Restrições de Tamanho de Ficheiros
Além da listagem branca de tipos de ficheiros, é importante implementar restrições ao tamanho máximo de ficheiros que podem ser carregados. Isto ajuda a evitar que os atacantes carreguem ficheiros grandes que poderiam sobrecarregar os recursos do servidor.
Código de exemplo (em 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 ## Limite 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 'Ficheiro carregado com sucesso'
else:
abort(400)
Sanitização de Nomes e Caminhos de Ficheiros
É importante sanitizar adequadamente os nomes e caminhos de ficheiros para evitar ataques de travessia de diretórios, onde um atacante tenta aceder a ficheiros fora do diretório de carregamento pretendido.
Código de exemplo (em 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 'Ficheiro carregado com sucesso'
else:
abort(400)
Implementando Validação no Lado do Servidor
Além das validações do lado do cliente, é crucial implementar validações do lado do servidor para garantir que os ficheiros carregados são seguros e não contêm nenhum conteúdo malicioso.
Código de exemplo (em 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 o tipo MIME do ficheiro carregado
mime_type = magic.from_file(file_path, mime=True)
if mime_type not in ALLOWED_MIME_TYPES:
os.remove(file_path)
abort(400)
return 'Ficheiro carregado com sucesso'
else:
abort(400)