Implementierung sicherer Dateiupload-Strategien
Whitelisting von Dateitypen
Eine der effektivsten Methoden zur Verhinderung von schädlichen Dateiuploads ist die Implementierung einer Whitelist für zulässige Dateitypen. Dies beinhaltet die Definition einer Reihe vertrauenswürdiger Dateierweiterungen, die zum Hochladen erlaubt sind, und die Ablehnung aller Dateien, die nicht mit der Whitelist übereinstimmen.
Beispielcode (in Python mit 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 'Datei erfolgreich hochgeladen'
else:
abort(400)
Implementierung von Dateigrößenbeschränkungen
Neben der Whitelist für Dateitypen ist es wichtig, Beschränkungen für die maximale Dateigröße zu implementieren, die hochgeladen werden kann. Dies verhindert, dass Angreifer große Dateien hochladen, die die Ressourcen des Servers überlasten könnten.
Beispielcode (in Python mit 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 ## 16 MB Limit
@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 'Datei erfolgreich hochgeladen'
else:
abort(400)
Bereinigung von Dateinamen und Pfaden
Es ist wichtig, Dateinamen und Pfade ordnungsgemäß zu bereinigen, um Directory-Traversal-Angriffe zu verhindern, bei denen ein Angreifer versucht, auf Dateien außerhalb des vorgesehenen Upload-Verzeichnisses zuzugreifen.
Beispielcode (in Python mit 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 'Datei erfolgreich hochgeladen'
else:
abort(400)
Implementierung von Server-seitigen Validierungen
Zusätzlich zu den clientseitigen Validierungen ist es entscheidend, serverseitige Validierungen zu implementieren, um sicherzustellen, dass die hochgeladenen Dateien sicher sind und keinen schädlichen Inhalt enthalten.
Beispielcode (in Python mit 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)
## MIME-Typ der hochgeladenen Datei prüfen
mime_type = magic.from_file(file_path, mime=True)
if mime_type not in ALLOWED_MIME_TYPES:
os.remove(file_path)
abort(400)
return 'Datei erfolgreich hochgeladen'
else:
abort(400)