IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Valider une entrée JSON avec JSON Schema


Sujet :

Web & réseau Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut Valider une entrée JSON avec JSON Schema
    Bonjour,

    Pour un service web implémenté en Delphi (11), est il possible de valider les paramètres JSON via un JSON Schema afin de respecter les règles de sécurités ?

    merci,

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    En dehors de prendre les quelques TJSONSchema qui traine sur Github, on ne trouve pas grand chose, même plutôt l'inverse, un peu comme l'Expert WSDL SOAP, on trouve plutôt des Expert générant le code mappant le JSON à partir de son Schéma.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    oh mon dieu !

    je me doutais bien que quelqu'un avait du faire ça...quand on bouffe du XML / XDS à longueur de journée, JSON semble doux et apaisant à côté...il fallait donc bien que quelqu'un réimplémente la lourdeur du SOAP dans JSON
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    La vérification des entrées avec un schéma permet de protéger facilement des vulnérabilités mass assignment https://cheatsheetseries.owasp.org/c...eat_Sheet.html

    Si on utiliser REST.JON pour la conversion en objet Delphi, les propriétés non définies dans l'objet Delphi sont ignorées.
    Par contre, lors d'un test intrusion, il est attendu que le web service renvoie une erreur "bad request". Mais à aucun moment Delphi n'indique que l'entrée ne correspond pas à ce qui est attendu.
    (en regardant le code, Delphi parcours les propriétés de l'objet à créer et recherche les paires dans le JSON, donc il ne "voit" pas qu'il y a des propriété en plus).

    Nos webservices ne sont pas sensible à cette attaque grâce à une isolation des objets de l'interface par rapport aux objets manipulés dans les services.
    Par contre comme ils ne renvoient pas "Bad Request" on se fait insulter lors des tests d'intrusion (erreur critique)

    Je ne suis pas très "composant TJSONShema qui trainent sur github" . La sécurité est un point critique, je me serais attendu a quelque chose d'intégré à Delphi et que Delphi permette de facilement respecter un maximum de recommandations OWASP.

    Citation Envoyé par Paul TOTH Voir le message
    oh mon dieu !

    je me doutais bien que quelqu'un avait du faire ça...quand on bouffe du XML / XDS à longueur de journée, JSON semble doux et apaisant à côté...il fallait donc bien que quelqu'un réimplémente la lourdeur du SOAP dans JSON
    C'est vrai que sans validation des entrées on évite bcp de lourdeur !

  5. #5
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    oh mon dieu !

    je me doutais bien que quelqu'un avait du faire ça...quand on bouffe du XML / XDS à longueur de journée, JSON semble doux et apaisant à côté...il fallait donc bien que quelqu'un réimplémente la lourdeur du SOAP dans JSON
    à l'occasion d'une journée calme et ensoleillée où tu n'as personne à maudire, jette un oeil aux specs de JSON LD

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Zatoobux Voir le message
    La vérification des entrées avec un schéma permet de protéger facilement des vulnérabilités mass assignment https://cheatsheetseries.owasp.org/c...eat_Sheet.html

    Si on utiliser REST.JON pour la conversion en objet Delphi, les propriétés non définies dans l'objet Delphi sont ignorées.
    Par contre, lors d'un test intrusion, il est attendu que le web service renvoie une erreur "bad request". Mais à aucun moment Delphi n'indique que l'entrée ne correspond pas à ce qui est attendu.
    (en regardant le code, Delphi parcours les propriétés de l'objet à créer et recherche les paires dans le JSON, donc il ne "voit" pas qu'il y a des propriété en plus).

    Nos webservices ne sont pas sensible à cette attaque grâce à une isolation des objets de l'interface par rapport aux objets manipulés dans les services.
    Par contre comme ils ne renvoient pas "Bad Request" on se fait insulter lors des tests d'intrusion (erreur critique)

    Je ne suis pas très "composant TJSONShema qui trainent sur github" . La sécurité est un point critique, je me serais attendu a quelque chose d'intégré à Delphi et que Delphi permette de facilement respecter un maximum de recommandations OWASP.



    C'est vrai que sans validation des entrées on évite bcp de lourdeur !
    tu n'as pas besoin que le JSON soit schématisé pour valider les entrées...d'ailleurs Let's Encrypt ajoute délibérément un membre aléatoire dans une réponse JSON pour s'assurer que le client supporte les variations de structures

    personnellement j'utilise mon unité JSON qui converti un Record en JSON ou alimente un Record d'après une chaîne JSON, le record étant typé, soit je peux lire la valeur, soit j'ai une erreur de type que je peux capturer pour retourner un Bad Request...et ensuite je fais un contrôle de validité des données (comme avec tout ce qui vient du net).

    alors en effet, tu peux utiliser un schema pour contraindre les données et t'éviter ce travail...mais appliquer un schema ça implique un moteur de schema, et si je regarde les XDS, c'est une horreur à parser...les outils de l'ANS en Java prennent plusieurs dizaines de secondes pour valider une seule requête...je ne sais pas si c'est aussi lourd en JSON

    si tu le fais par code, tu peux très bien utiliser des attributs ou d'autres techniques qui t'évitent de tout coder à chaque fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type
      TRequest = record
        [NotNull]
        id: Cardinal;
        [NotEmpty]
        Name: UTF8String;
        [BeforeNow]
        Date: TDate;
        [CountBetween(1, 10)]
        Items: TArray<TItem>;
      end;
    oui ça veux dire que tu codes cette logique sous Delphi d'un côté, et si l'autre côté est dans un autre langage c'est à lui de coder la chose...mais à la rigueur on peut imaginer un générateur de schéma à partir des attributs Delphi ... et en théorie du pourrais avoir un générateur d'attributs à partir du Schéma... c'est ce que propose Delphi pour SOAP de façon plus ou moins heureuse car tu peux mettre vraiment n'importe quoi dans un WSDL, et le formaliser dans une structure de programmation c'est parfois coton, même à la main
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    oui pour le contenu de chaque membre pas vraiment de problème.

    Par contre je suis étonnée de la remarque à propos Let's Encrypt qui ajoute un membre aléatoire pour d'assurer qu'un changement est supporté. En effet un test d'application avec appScan considère comme une vulnérabilité (mass assignment) du plus haut niveau le support d'un membre aléatoire.

    Par contre mes déclarations d'entrée sont basées sur des descendants de TObject. La lecture ce fait avec TJSON.JsonToObject().

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ACME is designed to be extensible by adding new JSON fields, which should be ignored by clients that do not understand them.

    https://community.letsencrypt.org/t/...irectory/33417
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    La non conformité obtenu pour ce point peut être justifié auprès du client car nous respectons une partie des préconisations OWASP et CWE (des objets de transfert non lié au code; ça nous semble même le plus important et j'ai l'impression que nous nous rejoignons sur ce point).

    Je cherche à ce que mon serveur (pas le client) soit conforme a ce qu'attend appScan pour éviter les discussions pas toujours agréables

    Les 2 suggèrent une liste de champs autorisés parmi les corrections.

    Sommes bon pour rédiger un document justifiant l'absence de risque de notre fonctionnement et le ressortir à chaque test d'intrusion (de plus en plus fréquents)

    je vais conserver le lien vers letsencrypt. Il sera a mettre dans la balance des discussions.

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    alors justement, voilà comment je traite ce genre de requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    procedure processAddUser(const Params: string);
    type
      TAddUser = record
        userid: string;
        password: string;
        email: string;
      end;
    var
      request: TAddUser;
      user: TUser;
    begin
      try
        JSON.fromJSON(request, Params);
      except
        BadRequest;
        Exit;
      end;
      if (request.userid = '') or (request.password = '') then
      begin
        BadRequest;
        Exit;
      end;
      user := Defaul(TUser);
      user.userid := request.userid;
      user.password := request.password; 
      user.email := request.email;
      userService.add(user);
    end;
    enfin la gestion des exceptions est normalement à un plus haut niveau mais peu importe.

    Et dans mon cas, isAdmin est ignoré, car je considère que JSON permet justement plus de souplesse...mais on pourrais imaginer une exception EFieldNotFound qui retournerai une BadRequest
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. [MySQL] Technique pour tester si une entrée existe avec PDO
    Par student_php dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/10/2010, 15h26
  2. [XSD] Validation une instance XML avec schéma(plusieurs fichiers XSD)
    Par ttttnht dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 07/09/2009, 15h16
  3. Valider une entrée par tty
    Par psjylife dans le forum Administration système
    Réponses: 1
    Dernier message: 17/04/2007, 07h54
  4. valider une page html avec Dom
    Par harold63 dans le forum Langage
    Réponses: 3
    Dernier message: 02/06/2006, 08h34
  5. Valider un fichier XML avec un Schema
    Par Groove dans le forum Valider
    Réponses: 4
    Dernier message: 09/11/2005, 08h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo