Skip to content

Sécurise le tri du dashboard instruction contre l'injection SQL (DPP-77) - #1729

Merged
jbfeldis merged 2 commits into
developfrom
feature/dpp-77-ts-securiser-le-tri-du-dashboard-instruction-order-interpole
Aug 26, 2026
Merged

Sécurise le tri du dashboard instruction contre l'injection SQL (DPP-77)#1729
jbfeldis merged 2 commits into
developfrom
feature/dpp-77-ts-securiser-le-tri-du-dashboard-instruction-order-interpole

Conversation

@jbfeldis

Copy link
Copy Markdown
Contributor

Contexte

Sentry DATAPASS-REBORN-EV : le tri du dashboard instruction interpolait le nom de colonne et la direction issus de Ransack directement dans .order() :

.order("#{search_engine.sorts.first.name} #{search_engine.sorts.first.dir} NULLS LAST")

Ces valeurs viennent du param utilisateur search_query[s]. L'injection SQL n'était stoppée que par le garde framework Rails disallow_raw_sql! — on ne veut pas en dépendre. Un nom de tri non autorisé provoquait un 500 (injection bloquée par Rails, ou colonne inexistante).

Changement

Construction de l'ORDER BY via Arel (identifiant quoté) avec repli sur le tri par défaut quand la colonne demandée n'est pas une vraie colonne du modèle. Le fix est dans la classe de base Instruction::Search::DashboardSearch → couvre les deux sous-classes (DashboardHabilitationsSearch, DashboardDemandesSearch).

SQL généré vérifié :

  • payload malicieux / colonne inexistante → "authorizations"."created_at" DESC NULLS LAST (repli, identifiant quoté, aucune interpolation)
  • tri légitime created_at asc"authorizations"."created_at" ASC NULLS LAST (préservé, NULLS LAST conservé)

Tests

  • Specs façade : 40 examples, 0 failures (dont 4 nouveaux : injection, colonne inexistante, tri légitime × 2 modèles)
  • Feature specs instruction (search_demandes + search_habilitations) : 28 examples, 0 failures
  • Rubocop clean

Périmètre

Correctif ciblé. Le rescue global des inputs de scan (400/404/422) et la coupure du scan à la source (token staging, DPP-10) sont hors périmètre → projet Sécurité applicative.

Closes DPP-77

Le tri Ransack (nom de colonne + direction) était interpolé en SQL brut
dans .order(), protégé uniquement par le garde Rails disallow_raw_sql!.
Un nom de tri non autorisé provoquait un 500 (injection bloquée par Rails,
ou colonne inexistante).

Construit désormais l'ORDER BY via Arel (identifiant quoté) avec repli sur
le tri par défaut quand la colonne demandée n'existe pas. Couvre les deux
sous-classes Dashboard*Search via la classe de base.

Ref DPP-77
@linear

linear Bot commented Aug 12, 2026

Copy link
Copy Markdown

DPP-77

@jbfeldis
jbfeldis marked this pull request as ready for review August 13, 2026 10:09
@jbfeldis jbfeldis changed the title Sécurise le tri du dashboard instruction contre l'injection SQL Sécurise le tri du dashboard instruction contre l'injection SQL (DPP-77) Aug 13, 2026
@jbfeldis jbfeldis added the enhancement New feature or request label Aug 13, 2026
@Isalafont
Isalafont self-requested a review August 24, 2026 14:07

@Isalafont Isalafont left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci pour la PR !
J'ai noté une suggestion mais c'est pas pas obligatoire ^^
Par contre j'ai une question, les tests ici vérifient que la requête ne plante pas mais pas que le tri est le bon.

Du coup, si quelqu'un réintroduit une interpolation dans le order demain, les tests restent verts ?
Peux tu les faire assert sur le SQL produit plutôt que sur l'absence d'erreur ?

Comment thread app/facades/instruction/search/dashboard_search.rb Outdated
Retours de review sur la PR #1729.

Les specs de tri se contentaient de vérifier que la requête ne plantait
pas : une réintroduction de l'interpolation dans .order() les aurait
laissées vertes. Elles asserent désormais sur le SQL produit (identifiant
quoté, NULLS LAST, absence du fragment injecté), ce qui couvre à la fois
le repli sur le tri par défaut et l'absence d'interpolation.

Ferme aussi la duplication du ternaire de direction via
#normalized_direction.

Ref DPP-77
@jbfeldis

Copy link
Copy Markdown
Contributor Author

J'ai amélioré le test pour qu'il reflète mieux le clean mais on ne peut pas écrire un test qui vérifie que le code ne change pas 😅
Mais je pense que c'est déjà pas mal du tout comme ça.

@jbfeldis
jbfeldis requested a review from Isalafont August 25, 2026 16:03

@Isalafont Isalafont left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Top merci beaucoup !!
Let's go 🚀

@jbfeldis
jbfeldis merged commit a8c821b into develop Aug 26, 2026
19 checks passed
@jbfeldis
jbfeldis deleted the feature/dpp-77-ts-securiser-le-tri-du-dashboard-instruction-order-interpole branch August 26, 2026 08:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants