Commit c378718
Architect post-hoc audit follow-up from #119: PR #110 (FileField /
ImageField read-half) emits ``value.url`` in the detail envelope.
The URL is the consumer's storage-backend choice: signed-URL
backends ship time-bound URLs (safe by construction); local-storage
backends with publicly-readable ``MEDIA_URL`` ship a path that any
staff user can share with anyone, including unauthenticated parties.
This is not a regression (Django's HTML admin behaves the same way
with ``<a href="{{ field.url }}">``), but the SPA makes the URLs
trivially scriptable, which raises the operational stakes of
``MEDIA_URL`` configuration. ``SECURITY.md`` didn't surface it.
Adds a "File / image field storage" subsection to §9 "Recommended
consumer settings" enumerating the two storage classes and the
concrete consumer actions for the local-storage case
(django-private-storage, nginx auth_request, or a custom staff-gated
MEDIA_ROOT view).
Tier 5 — touches ``SECURITY.md``. Authored by the Security &
Compliance Lead session; merger must be the repo owner. P1 — should
land before the next release cycle so the disclosure is honest with
consumers.
Co-authored-by: Martin Castro Laminrs <mcastro@laminr.ai>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b8be316 commit c378718
1 file changed
Lines changed: 33 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
212 | 212 | | |
213 | 213 | | |
214 | 214 | | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
215 | 248 | | |
216 | 249 | | |
217 | 250 | | |
| |||
0 commit comments