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_filenamebeschermt 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
slugifyof een aangepaste helper maken, maar in de meeste gevallen isget_valid_filenamede beste optie.
댓글이 없습니다.