1. get_valid_filename wat is het?



django.utils.text.get_valid_filename is een kleine helperfunctie die een string omzet naar een bestandsnaam die veilig is voor gebruik in het bestandssysteem.
Het verwijdert of vervangt verboden of problematische tekens (zoals schuine strepen, control tekens, enz.) op de meeste besturingssystemen zoals Windows, macOS en Linux, en normaliseert de string naar een voorspelbaar formaat.

Waarom is het nodig?
Wanneer een gebruiker een bestand uploadt of een random invoer (bijv. blogtitel, gebruikerslabel) gebruikt om een bestandsnaam te maken, kan het opnemen van een schuine streep (../etc/passwd) leiden tot directory traversal of ongepaste tekens, wat het bestandssysteem kan beschadigen of beveiligingsrisico's kan veroorzaken.


2. Hoe het werkt

from django.utils.text import get_valid_filename

raw = "My: New/Project? 2024*"
safe = get_valid_filename(raw)
print(safe)   # → "My_New_Project_2024"

Hoofdfuncties

Invoer Resultaat Uitleg
"my file.txt" "my_file.txt" Spaties → onderstrepingen
"../etc/passwd" "etc_passwd" Vooruitgangen en schuine strepen verwijderd
"file<name>.txt" "file_name_.txt" <·> vervangen
" " "" Als er alleen spaties zijn, is de string leeg
"a"*300 "a"*255 Afgekapt tot bestandssysteemlimiet (255 tekens)

De functie is cross-platform en staat alleen veilige tekens toe ([A-Za-z0-9_.-]) en vervangt andere door een onderstreping (_).


3. Handige situaties



Situatie Behoefte
Gebruikersuploads Voorkomt directory traversal (../../etc/passwd) en verboden tekens
Slug-gebaseerde bestandsnamen Converteert blogtitels naar bestandsnamen voor statische sites
Gegevensexport Genereert bestandsnamen voor CSV/JSON die databasevelden (komma's, aanhalingstekens, enz.) bevatten
Automatische back-up Genereert back-upbestandsnamen met een tijdstempel uit random strings

4. Praktisch voorbeeld: Opslaan van geüploade afbeeldingen

# views.py
from django.shortcuts import render
from django.core.files.storage import default_storage
from django.utils.text import get_valid_filename

def upload_image(request):
    if request.method == 'POST':
        uploaded = request.FILES['image']
        # Opruimen van de originele bestandsnaam
        safe_name = get_valid_filename(uploaded.name)
        # Voeg indien nodig gebruikers-ID of tijdstempel toe
        final_name = f"{request.user.id}_{safe_name}"
        path = default_storage.save(f"uploads/{final_name}", uploaded)
        return render(request, 'success.html', {'path': path})
    return render(request, 'upload.html')

Resultaat
Hoe de gebruiker de bestandsnaam ook instelt, de naam die wordt opgeslagen is veilig, er is geen directory traversal, en de kans op duplicatie is laag.


5. Snelle referentie

from django.utils.text import get_valid_filename

# 1. Basis opruimen
safe = get_valid_filename("My: New/Project? 2024*")  # → "My_New_Project_2024"

# 2. Gebruiken in bestandslocaties
path = f"media/{safe}.jpg"

# 3. Combineren met UUID voor uniciteit
import uuid
unique_name = f"{uuid.uuid4().hex}_{safe}.jpg"

6. Kernsamenvatting

  • get_valid_filename beschermt het bestandssysteem met één regel code tegen gevaarlijke namen.
  • Gebruik het steeds wanneer je gebruikersinvoer of random strings naar bestandsnamen wilt omzetten.
  • De code is schoon, cross-platform en veilig qua beveiliging.

Tip: Als je spaties wilt behouden of Unicode wilt bewaren, kun je het combineren met slugify of een aangepaste helper maken, maar in de meeste gevallen is get_valid_filename de beste optie.