Project

General

Profile

Development #10990

possibilité d'autocomplétion sur une zone texte via une source de données qui ne serait pas du jsonp

Added by Frédéric Péters about 3 years ago. Updated 5 months ago.

Status:
Nouveau
Priority:
Normal
Assignee:
-
Start date:
19 May 2016
Due date:
% Done:

0%

Patch proposed:
No
Planning:
No

Description

Pour le moment ça fonctionne uniquement quand c'est du jsonp.

0001-misc-add-a-jsonp-endpoint-for-datasources-use-it-for.patch View (8.53 KB) Frédéric Péters, 09 Oct 2016 11:00 AM

0001-misc-add-a-jsonp-endpoint-for-datasources-use-it-for.patch View (10.6 KB) Frédéric Péters, 09 Oct 2016 08:37 PM

0001-misc-add-a-jsonp-endpoint-for-datasources-use-it-for.patch View (11.1 KB) Frédéric Péters, 12 Oct 2016 05:18 PM


Related issues

Related to w.c.s. - Development #15290: signature automatique des appels data_source en JSONP Nouveau 07 Mar 2017
Related to w.c.s. - Development #19271: possibilité de champ select2 pour une liste (peu importe le jsonp) Solution déployée 09 Oct 2017

History

#1 Updated by Frédéric Péters over 2 years ago

#2 Updated by Benjamin Dauvergne over 2 years ago

Est-ce qu'il n'y a pas un risque au niveau sécurité de créer un proxy ouvert vers une API qui elle est protégée ?

#3 Updated by Frédéric Péters over 2 years ago

Genre on aurait un formulaire avec un champ type "Liste des établissements" mais ce formulaire ne serait pas accessible, et via cette nouvelle API quelqu'un pourrait malgré tout découvrir le contenu de la liste "Liste des établissements" ? Je me suis posé la question et j'ai considéré que ça n'était pas gênant. (on autorise l'accès à /api/form/xxx/schema à tout le monde)

Quand j'y réfléchissait, j'avais imaginé que ça pourrait être /api/forms/<formdef_slug>/datasources/<field_id>/ avec vérification de la possibilité pour l'usager d'accéder au formdef, mais ça amène des complications sur les champs de l'action "afficher un formulaire", sur l'action d'édition, etc.

Mais si on imagine un risque suffisant, je peux retourner vers cette idée.

#4 Updated by Benjamin Dauvergne over 2 years ago

Si tu prends l'exemple d'une source non critique, bien sûr, le proxy ne l'est pas plus :) Je dis juste qu'il ne sera pas évident pour les utilisateurs de w.c.s. de comprendre qu'en créant une datasource nommée ils créent automatiquement un proxy ouvert vers cette source.

#5 Updated by Frédéric Péters over 2 years ago

Mais je n'ai pas d'exemple de source critique.

Cela étant, pour se protéger sans pour autant tomber dans les difficultés de ces appels pouvant venir de multiples sources, j'imaginerais le dispositif suivant, inclure dans l'url un jeton, lié à la session.

token = Token()
token.session_id = get_session().id
token.store()
kwargs['url'] = root_url = get_publisher().get_root_url() + 'api/datasources/%s/' % self.data_source.get('type') + '?token=%s' % token.id

Et lors de l'appel à l'URL :

token_id = get_request().form.get('token')
if Token.get(token_id).session_id != get_session().id:
    raise ...

Ça me semble satisfaire le besoin de sécu. Tu en penses quoi ?

#6 Updated by Benjamin Dauvergne over 2 years ago

Oui ça me va, un md5 du session.id suffirait aussi.

#7 Updated by Frédéric Péters over 2 years ago

Le md5 de l'id de session il permettrait un accès à toutes les sources de données, je préfère un jeton dédié.

J'inclus le jeton dans le path de l'URL par facilité pour le cas de la redirection vers la source jsonp (pas besoin de décomposer la query string pour en sortir le jeton avant de faire le redirect).

#8 Updated by Benjamin Dauvergne over 2 years ago

Mouais ben md5(self.datasource.slug + session_id) alors, enfin bon j'aime pas trop stocker quand on peut s'en passer.

#10 Updated by Benjamin Dauvergne over 2 years ago

Il y a un rapport avec ce ticket du dernier bout du patch sur wcs/qommon/forms.py ?

#11 Updated by Frédéric Péters over 2 years ago

De loin, on se trouvait avec un attribut "url" posé sur l'élément <input/> quand il y avait de l'autocomplétion.

#12 Updated by Frédéric Péters over 2 years ago

  • Related to Development #15290: signature automatique des appels data_source en JSONP added

#13 Updated by Frédéric Péters over 1 year ago

  • Related to Development #19271: possibilité de champ select2 pour une liste (peu importe le jsonp) added

#14 Updated by Frédéric Péters 9 months ago

  • Status changed from En cours to Nouveau
  • Patch proposed changed from Yes to No

Mettons que plus rien n'est proposé vu que ça ne s'applique vraisemblablement pas.

#15 Updated by Frédéric Péters 9 months ago

  • Subject changed from source de données sur zone texte → autocomplétion to possibilité d'autocomplétion sur une zone texte via une source de données qui ne serait pas du jsonp

(tentative de reformulation du sujet pour mentionner jsonp pour être plus facilement retrouvé)

#16 Updated by Benjamin Dauvergne 5 months ago

À la relecture du code il me semble qu'il y a un trou de sécurité, les accès sont validés par la connaissance du slug de la datasource et du hash de ce slug et d'un session_id, n'importe lequel. Tout utilisateur connecté est en mesure de calculer ce hash. Or certaines datasource ne seront visibles que d'utilisateurs ayant accès à certains formulaires (genre une datasource de la liste des agents de la commune, des fiches du RSU, etc..), toute signature doit partir d'au moins une information inconnue de l'utilisateur (le session_id ça ne marche pas), genre settings.SECRET_KEY, comme ça on est sûr que c'est une URL générée par l'application. Il faudrait aussi un timestamp pour ne pas laisser ouvert ces accès pour toujours, et donc le plus simple ce serait de réutiliser le système de signature qu'on a déjà plutôt que d'en inventer un nouveau.

#17 Updated by Frédéric Péters 5 months ago

À la relecture du code

Il n'y a pas de code à relire. (cf commentaire numéro 14).

#18 Updated by Benjamin Dauvergne 5 months ago

Donc à la non relecture du code, je pense qu'il faudrait quand même faire comme je dis (que ce soit du json ou du jsonp) de toute façon, ça reste une indication pour celui qui réaliserait ce code (ne pas faire de hash d'un truc avec le session_id, bad idea).

Also available in: Atom PDF