Bien sûr, le titre était un peu aguicheur, tous les persers json ne sont pas mauvais, et dans la plupart des cas, le problème évoqué ici n’est pas limitant.
Cependant, je pense que le souci du déni de service et de la faille de sécurité peuvent être réels. En tout cas, il est bon que les développeurs soient au courant des limitations des bibliothèques utilisées et des erreurs qui peuvent être levées. Beaucoup de bibliothèques ne mentionnent pas cette limitation de niveaux d’imbrication, et ne lèvent pas une erreur du bon type lorsque le cas se présente.
Par exemple, en python, pour parser du JSON et catcher une erreur éventuelle, on fait:
Un tel code donne l'impression qu'aucune erreur ne pourra être levée même sur une chaîne de caractères qui contient du JSON invalide. Pourtant, json.loads peut retourner une RecursionError qui n'est pas une JSONDecodeError, et planter.
Et bien sûr, on peut refaire les parsers en utilisant une pile explicite, mais on se retrouve avec du code encore moins compréhensible. Et quand on voit par exemple le parser de python, il y a déjà tellement de cas à traiter et de micro-optimisations que le code n'est pas très clair. Je pense que la bonne solution est d'utiliser des générateurs de parser, qui ont une grammaire explicite et claire, et qui peuvent générer des parsers non-récursifs.
[^] # Re: Pas convaincu
Posté par lovasoa (site web personnel) . En réponse au journal Tous les parsers JSON sont mauvais. Évalué à 7.
Bien sûr, le titre était un peu aguicheur, tous les persers json ne sont pas mauvais, et dans la plupart des cas, le problème évoqué ici n’est pas limitant.
Cependant, je pense que le souci du déni de service et de la faille de sécurité peuvent être réels. En tout cas, il est bon que les développeurs soient au courant des limitations des bibliothèques utilisées et des erreurs qui peuvent être levées. Beaucoup de bibliothèques ne mentionnent pas cette limitation de niveaux d’imbrication, et ne lèvent pas une erreur du bon type lorsque le cas se présente.
Par exemple, en python, pour parser du JSON et catcher une erreur éventuelle, on fait:
Un tel code donne l'impression qu'aucune erreur ne pourra être levée même sur une chaîne de caractères qui contient du JSON invalide. Pourtant,
json.loadspeut retourner uneRecursionErrorqui n'est pas uneJSONDecodeError, et planter.Et bien sûr, on peut refaire les parsers en utilisant une pile explicite, mais on se retrouve avec du code encore moins compréhensible. Et quand on voit par exemple le parser de python, il y a déjà tellement de cas à traiter et de micro-optimisations que le code n'est pas très clair. Je pense que la bonne solution est d'utiliser des générateurs de parser, qui ont une grammaire explicite et claire, et qui peuvent générer des parsers non-récursifs.