diff --git a/docs/FORO.md b/docs/FORO.md index 89a3504..0d95111 100644 --- a/docs/FORO.md +++ b/docs/FORO.md @@ -51,8 +51,20 @@ en `forum/permissions.py`: guardar — `forum/sanitize.py` — evitando el XSS que tenía el original (que renderizaba HTML del editor sin filtrar). Se renderiza con `|safe` ya saneado. - **Todas** las acciones que modifican datos (publicar, responder, editar, mover, - bloquear/desbloquear, fijar, borrar/restaurar temas y posts) van por **POST con - CSRF**. Las vistas de moderación rechazan GET. + bloquear/desbloquear, fijar, borrar/restaurar temas y posts) van por **POST**, y + las vistas mutadoras llevan **`@csrf_protect`** (fuerza la validación CSRF por + vista aunque el middleware global no esté activo). +- El HTML de los posts también se **sanea al renderizar** con el filtro + `forum_safe` (defensa en profundidad frente a datos heredados sin sanear). +- Acceso a temas de foros ocultos/borrados bloqueado también por URL directa + (no solo en los listados). + +> ⚠️ **Recomendación para todo el sitio** (fuera del foro): `novawow/settings.py` +> no incluye `django.middleware.csrf.CsrfViewMiddleware`, por lo que el resto de +> formularios POST del portal (app `home`) **no** validan CSRF. El foro está +> protegido con `@csrf_protect`, pero conviene activar el middleware global y +> revisar que las vistas POST de `home` lleven `{% csrf_token %}` (algunas ya lo +> llevan; las AJAX usan `@csrf_exempt`). ## Editor diff --git a/forum/db.py b/forum/db.py index 4d62c2d..53cb6d3 100644 --- a/forum/db.py +++ b/forum/db.py @@ -183,10 +183,11 @@ def get_topic(topic_id, include_hidden=False): return topic -def count_posts(topic_id): +def count_posts(topic_id, include_deleted=False): + delf = "" if include_deleted else "AND deleted = 0" with _conn().cursor() as cursor: cursor.execute( - "SELECT COUNT(*) FROM forum_posts WHERE topic_id = %s AND deleted = 0", + f"SELECT COUNT(*) FROM forum_posts WHERE topic_id = %s {delf}", [topic_id], ) return cursor.fetchone()[0] diff --git a/forum/templates/forum/topic.html b/forum/templates/forum/topic.html index 76de7c1..6302f10 100644 --- a/forum/templates/forum/topic.html +++ b/forum/templates/forum/topic.html @@ -1,5 +1,5 @@ - +{% load forum_extras %} {% include 'partials/head.html' %} {% include 'partials/header.html' %} {% include 'partials/video.html' %} @@ -34,7 +34,7 @@ {% if post.deleted %}