Jose Salazar Claude Opus 5 commited on
Commit
dd5a294
·
1 Parent(s): a2a4438

Corregir afirmación falsa sobre la guarda de auth en /api/papers

Browse files

La auditoría afirmaba «Depends(usuario_actual) en interpret/papers (401
verificado)». Verificado contra el despliegue y en local: papers NO tiene
guarda; /api/papers?query=anemia responde 200 sin sesión. Sólo lo protege el
rate limit de 30/min por IP.

No es una regresión —el punto del plan pedía «auth en interpret, rate-limit en
papers»— pero la anotación de estado sobreafirmaba, y no hay clave de API en
juego (eutils se consulta sin credencial).

Se documenta además que el bloqueo de CORS, correcto en la app (verificado en
local: un origen no listado no recibe ACAO), queda neutralizado en producción
por el proxy de HF Spaces, que añade ACAO y expose-headers por su cuenta. Ahí
la defensa efectiva es SameSite=Strict en las cookies.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Files changed (1) hide show
  1. PLAN_MODERNIZACION.md +10 -1
PLAN_MODERNIZACION.md CHANGED
@@ -320,7 +320,16 @@ FastAPI backend.
320
  send `Access-Control-Allow-Origin: *`, no session check). Anyone can call them directly
321
  and burn the HF key / abuse PubMed. → Require an authenticated session on `/api/interpret`
322
  (and rate-limit papers); lock CORS to the app origin.
323
- — *`Depends(usuario_actual)` en interpret/papers (401 verificado); CORS a orígenes fijos.*
 
 
 
 
 
 
 
 
 
324
  2. ✅ **Password-hash DB may be web-served.** SQLite fallback writes `data/morphos.db` under the
325
  web root; `.htaccess` only denies `.env`/`setup.php`, so `/data/morphos.db` may be
326
  downloadable, and `.htaccess` is Apache-only. → Move the DB **outside** the served root;
 
320
  send `Access-Control-Allow-Origin: *`, no session check). Anyone can call them directly
321
  and burn the HF key / abuse PubMed. → Require an authenticated session on `/api/interpret`
322
  (and rate-limit papers); lock CORS to the app origin.
323
+ — *`Depends(usuario_actual)` en **interpret** (401 verificado en producción). **Corrección
324
+ (2026-07-26): papers NO lleva guarda de auth** — `/api/papers?query=…` responde 200 sin
325
+ sesión; sólo está limitado a 30/min por IP. Coincide con lo que pide el punto («auth en
326
+ interpret, rate-limit en papers»), pero la anotación anterior decía «interpret/papers» y era
327
+ falsa. No hay clave de API en juego (eutils se consulta sin credencial), así que el riesgo se
328
+ limita a abuso del proxy. CORS a orígenes fijos: verificado en local — un origen no listado no
329
+ recibe `Access-Control-Allow-Origin`. **Ojo en producción**: el proxy de HF Spaces añade por su
330
+ cuenta `Access-Control-Allow-Origin: <origen>` y `expose-headers: *` por encima de la app, así
331
+ que el bloqueo de CORS queda neutralizado en la plataforma. Lo que sostiene la defensa ahí es
332
+ `SameSite=Strict` en las cookies de sesión y CSRF: una petición cross-site no las lleva.*
333
  2. ✅ **Password-hash DB may be web-served.** SQLite fallback writes `data/morphos.db` under the
334
  web root; `.htaccess` only denies `.env`/`setup.php`, so `/data/morphos.db` may be
335
  downloadable, and `.htaccess` is Apache-only. → Move the DB **outside** the served root;