#35607: Improve Storage base backend API Flexibility -------------------------------------+------------------------------------- Reporter: Natalia Bidart | Owner: (none) Type: | Status: new Cleanup/optimization | Component: Core (Other) | Version: Severity: Normal | Resolution: Keywords: storages | Triage Stage: | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- Comment (by Natalia Bidart):
To add some extra context and details, below some extracts of conversations held while discussing the security reports around `Storage` API: From Shai: > [...] I think the validation itself should be overridable, but I feel weary about adding an API in a security release; can we add it as "internal" in the security release, and document it (making it public) later? From Josh Schneier: > Untangling the various ways that validation was peppered through the code base in a couple of competing ways led me to drafting a local change that unified them all. I’m happy to hear you’re taking a stab at that, shows my head was in the right place. > I think you are already on top of `get_available_name` and `generate_filename` (which uses `validate_file_name`) but want to also call your attention to `get_valid_name` which is also part of the publicly overridable API. Currently it calls into `get_valid_filename` which has yet another implementation of some of the protection logic, it also appears to be its only used place in the code base. From me: > At a high level, I believe the core challenges to resolve are: > 1. The entanglement and tight coupling of file name and file path validations in the code. > 2. The scattering of validations across multiple methods and files. > To fix 1, I think we should take path validation out of `validate_file_name` and put it in a dedicated `validate_file_path`. This makes the `allow_relative_path` switch disappear. Backward compatibility is an issue with this plan though. > There is one more change that I considered but postponed, which is potentially removing the call to `validate_file_name` in FileField.generate_filename[1] since this method calls it's storage's `generate_filename` which would *also* call `validate_file_name` (at least in its default implementation). My main concern here is how often/likely is to have custom storages overriding `generate_filename` without validating the given name > [1] https://github.com/django/django/blob/main/django/db/models/fields/files.py#L336 Outcome up to this point: we did evaluate adding a public and overridable method to do validation in the [https://www.djangoproject.com/weblog/2024/jul/09/security-releases/ recent security release] but we decided not to, to keep the patch small and self contained, with the counterpart of having to duplicate file name validation in various places. I'll be proposing a PR (no logic change) to land in `main` to extend test coverage in preparation for future refactoring. -- Ticket URL: <https://code.djangoproject.com/ticket/35607#comment:1> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/01070190c69b7883-b454c7dc-3bae-4ee6-a15c-d208ac9a6055-000000%40eu-central-1.amazonses.com.