Я использую Flask -Загрузки для загрузки изображений в веб-приложение. Веб-приложение принимает только изображения в формате JPEG, но кажется, что Flask -Uploads только усиливает это, проверяя расширение файла.
Например, я могу легко подорвать это, изменив имя файла с myfile.txt
на myfile.jpg
и текстовый файл myfile.txt
будет ошибочно принят в качестве изображения JPEG.
Как я могу убедиться, что файлы, загруженные в мое веб-приложение, на самом деле являются файлами JPEG по содержимому, а не только по расширению?
Вот минимальная реализация (исключая шаблоны), которая демонстрирует то, что я пытаюсь сделать:
# __init__.py
from flask import Flask
from flask_uploads import UploadSet, configure_uploads, IMAGES
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
photos = UploadSet("photos", IMAGES)
configure_uploads(app, photos)
from app import routes
# routes.py
import os
from flask import redirect, render_template, send_from_directory, url_for
from flask_uploads import UploadNotAllowed
from app import app, photos
from app.forms import PhotoForm
@app.route('/', methods=["GET", "POST"])
def index():
form = PhotoForm()
if form.validate_on_submit():
try:
filename = photos.save(form.photo.data)
return redirect(url_for("uploaded_file", filename=filename))
except UploadNotAllowed:
print("UploadNotAllowed!")
redirect(url_for("index"))
return render_template("index.html", form=form)
@app.route("/uploads/<filename>")
def uploaded_file(filename):
directory = os.path.join(os.getcwd(), app.config["UPLOADED_PHOTOS_DEST"])
return send_from_directory(directory, filename)
# forms.py
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
from wtforms import SubmitField
class PhotoForm(FlaskForm):
photo = FileField(validators=[FileRequired()])
submit = SubmitField("Upload")
# config.py
import os
class Config(object):
SECRET_KEY = os.environ.get("SECRET_KEY")
UPLOADED_PHOTOS_DEST = "uploads"
UPLOADED_PHOTOS_DENY = ["bmp", "gif", "png", "svg"]