Information importante : Faille de sécurité Prestashop
Nous avons découvert que des milliers sites Prestashop étaient vulnérables à une faille de sécurité. Nous vous conseillons de vérifier si votre site est impacté.
Pré-requis
- Prestashop 1.4.17 (stable) ou supérieur
- La réécriture d’URL activée
- PHP 5.3.x (ou inférieur si patchée)
- Des connaissances en XML, HTTP, REST, …
Patcher Prestashop pour PHP 5.2 et antérieur
A sa sortie, cette fonctionnalité a connue quelques bugs.
Si vous utilisez Prestashop 1.4.0.17 sur un serveur équipé de PHP 5.2 ou antérieur, vous risquez donc de rencontrer le bug PSCFI-1187 que nous avons signalé à l’équipe de Prestashop.
Si c’est le cas, pas de panique, nous avons le patch qui va avec.
- Ouvrez le fichier « webservice/dispatcher.php »
- Allez à la ligne 67
- Remplacez le code suivant :
1 |
$result = $class_name::getInstance()->fetch($key, $method, $_GET['url'], $params, $bad_class_name, $input_xml); |
Par :
1 2 |
$class_instance = call_user_func(array($class_name,'getInstance')); $result = $class_instance->fetch($key, $method, $_GET['url'], $params, $bad_class_name, $input_xml); |
Cette solution permet de ne plus utiliser le Late Static Bindings qui est disponible uniquement sur PHP 5.3
Configuration et activation du webserivce
Réécriture d’URL
Les ressources d’un service web sont identifiées grâce à l’URL utilisée. Avant d’autoriser la publication de webservices, vous devez donc préalablement activer la réécriture d’URL (URL Rewriting).
Activation des webservices
Les webservices de Prestashop permettent à une autre système autorisé, d’avoir accès aux informations de votre site e-commerce en lecture et/ou en écriture. Par défaut, cette fonctionnalité est désactivée. Vous devez donc l’activer pour pouvoir les utiliser.
Création d’un compte d’accès (génération d’une clé)
Une fois activé, le webservice reste fermé à l’ensemble des utilisateurs.
Vous devez créer un compte d’accès au webservice en générant une clé unique.
Configuration des droits (permissions)
Vous devez ensuite ajouter des droits pour chaque entité de votre boutique.
Nous allons donc faire un compte ayant accès aux produits et aux tags en lecture uniquement (pas de modification possible) :
Cliquez sur Enregistrer
En retournant sur la page webservice, nous pouvons maintenant voir que notre clé est bien activée :
Nous attirons votre attention sur la confidentialité de cette clé. Toute personne en possession de cette clé pourra récupérer les informations de votre boutique (suivant les droits attribués). De plus, afin d’éviter que cette clé soit interceptée par un hacker, il est vivement recommandé d’activer le protocole HTTPS
Tester le webservice
Il ne nous reste plus qu’à essayer d’accéder aux informations de notre plateforme à travers ce nouveau webservice.
Pour cela, nous allons simplement essayer quelques requêtes depuis notre navigateur.
Tout d’abord, nous allons lister les services auxquels nous avons le droit grâce à notre clé.
Rendez-vous sur votre boutique Prestashop et ajoutez simplement api à la fin de l’adresse :
Un fenêtre va vous demander de vous identifier. Vous devez indiquer votre clé dans le champ « Login » en laissant le mot de passe vide.
Si tout ce passe bien,vous devez voir un retour XML contenant la liste des méthodes autorisées :
Si vous ne voyez pas le XML, essayez d’afficher le code source de votre navigateur.
Ce premier document correspond à la liste des ressources accessibles grâce à cette clé. Vous pouvez voir dans notre exemple que nous avons accès aux ressources suivantes :
Utilisation du webservice produits
En lisant les actualités au sujet de cette fonctionnalité, j’avais cru comprendre que le webservice était de type SOAP.
Vous pouvez maintenant voir que ça ne semble pas du tout être le cas. Il n’y a pas de WSDL, pas d’enveloppe, …
Nous avons à faire à un webservice de type REST.
Le but de cette article n’est pas de vous faire une cours sur REST. Il faut simplement retenir que l’interrogation du service REST se base sur l’URL demandée et la réponse contient les données formatées. Dans le cas de Prestashop, le retour est sous la forme d’une document XML.
En vous rendant sur :
Vous pouvez voir que vous retrouvez bien la liste des identifiants de plusieurs produits.
Maintenant que vous avez les ID des produits, vous pouvez récupérer toutes les informations d’un produit :
Rechercher et filtrer les résultats
Maintenant que l’on a testé que le service fonctionne, on peut avoir envie de faire une vrai requête. Voici quelques exemples de paramètres permettant de rechercher dans vos produits (ou dans toutes autres ressources)
Lister les produits ayant des identifiants compris entre 1 et 20 :
Récupérer les ID des produits ayant une référence commençant par WEB :
Récupérer les ID et les références des produits ayant une référence commençant par WEB :
N’afficher que 100 résultats :
N’afficher que 100 résultats en triant par ID décroissant (les 100 derniers créés):
Pour trier, il suffit de passer le paramètre sort avec l’identifiant à trier et le suffixe _asc (croissant) ou _desc (dcroissant)
Rechercher les produits contenant dans leur description, le mot « Zelda »
Le caractère % est utilisé comme joker. Dans cet exemple, il permet de rechercher les articles qui contiennent Zelda sans forcement commencer ou terminer par Zelda.
Récupère les produits de la catégorie n°4
Certains paramètres ne sont pas filtrable. Ils sont identifiés par la propriété not_filterable= »true
Conclusion
Vous l’aurez compris, cette fonctionnalité est un grand pas en avant pour Prestashop. Grâce aux web-services, vous allez pouvoir étendre considérablement les possibilités de votre boutique. Cela vous permettra par exemple d’offrir la possibilité à vos partenaires de consulter vos stocks, à vos fournisseurs de récupérer des statistiques, à des applications mobiles (iPad, iPhone, Android …) d’accéder à votre catalogue de produit, …
Le potentiel est là ! Il ne reste plus qu’à trouver des experts pour automatiser les traitements et mettre en place les interconnexions nécessaires. N’hésitez pas à nous contacter si vous souhaitez être accompagné dans la mise en place de webservices.
Votre article aidera de nombreuses personnes dans le monde!
j’ai fais des multiples recherches pour utiliser l’API, votre article est le plus complet!
Merci Patrice,
Nous espérons effectivement que cet article accompagnera ceux qui souhaite découvrir les Webservices de Prestashop.
Nous venons d’ailleurs de mettre à jour l’article qui datait de la sortie de Prestashop 1.4
Si vous avez des remarques ou des questions, n’hésitez pas à nous contacter.
A bientot
Bonjour,
Votre article est parfait pour créer un WS d’une ressource déjà existante « produit, client… », mais dans mon cas, je veux ajouter un nouveau objet et le partager avec le WS.
Est-ce qu’il existe un article ou bien un tuto pour cela!!
Merci d’avance.
Bonjour,
Effectivement, l’article ci-dessus présente l’utilisation des webservices proposés par Prestashop nativement. Si vous avez besoin d’enrichir le webservice pour publier autre chose, vous devez le faire développer. Ceci revient à faire du sur-mesure.
N’hésitez pas à contacter notre équipe si vous avez besoin de développeurs pour réaliser cette tâche.
Cordialement
Très intéressant ce billet merci!
Merci, si ça peut aider :)
Bonjour,
Je débute sur prestashop et je voudrais pouvoir importer en masse via le web service des articles. Est-ce que c’est possible ou bien est-ce que je suis obligé d’envoyer 1 par 1 mes articles en POST?
Cordialement
Bonjour,
Les webservices Prestashop fournissent des méthodes unitaires. Vous n’avez donc pas de traitement par lot.
Pour l’importation de produits, vous devez donc importer tous les éléments dépendants (attributs, catégories, etc) et ensuite, importer vos produits un à un.
Un petit conseil si vous vous lancez dans ce chantier seul, la création de produit peut être assez fastidieuse au départ car si certaines valeurs attendues par Prestashop ne sont pas définie, vous risquez d’avoir des articles importés de manière partiel (introuvable dans les recherches, pas de prix, déclinaisons manquantes, etc)
Bonjour, je tombe sur votre article par hasard que j’ai lu en diagonal. Je réponds précisément à la question posée. Je ne usis pas d’accord avec vous. Sans modifier le code de Prestashop, j’ai déjà posté plusieurs ressources en une seule requête, en java. Il n’y a pas de raison que cela ne soit pas possible en PHP!
Bonjour Onasus,
Merci pour cette précision. L’article est sortie il y a quasiment 2 ans et parlais des webservices de la version 1.4. Les choses ont surement évoluées depuis.
N’hésitez pas à mettre un peu plus de détails pour expliquer a François le fonctionnement de l’ajout multiple de produits.
Merci
Bonjour j’ai suivis ton tuto mais quand je rentre ma clé pour l’authentification ça ne marche pas.
Bonjour,
La clé doit être rentré dans le champs « Login » et non dans mot de passe. Si cela ne fonctionne pas c’est que vous n’avez pas les droits ou que votre clé n’est pas valide.
Je ne vois pas d’autres explications comme ça.
Alors, Prestashop propose une authentification « HTTP », techniquement la plus simple mais aussi la moins sécurisée car la clé est visible lors de la requête HTTP (à moins d’un bon certificat SSL).
Vous pouvez aussi accéder à l’API avec une URL de la forme :
« http://[CLE]@votreboutique.com/api/tags »
Mais l’API de Prestashop tel quel est vraiment .. nulle, on ne peut même pas lister ces produits sans faire 100 requêtes … donc attention à la base de données derrière ;-(
Merci Thomas pour ce retour d’expérience.
La technique :
« http://[CLE]@votreboutique.com/api/tags » n’est vraiment pas conseillée car la clé peut se retrouver à divers endroit : Logs du serveur, proxy, Google analytics, etc.
Effectivement, l’API est comme beaucoup de fonctionnalité Prestashop : « inachevée ».
Nous n’avons pas encore rencontré un développement avec l’API ou tout c’est passé comme prévu. Nous avons du à chaque fois corriger nous même l’API pour continuer.
Bonjour,
est il possible de créer un service web pour un module créé au préalable ?
Merci
Bonjour,
Tout est possible, Prestashop est développé en PHP donc si vous maitrisez PHP, il n’y a pas vraiment de limite. N’hésitez pas à nous contacter si besoin.
Super article ! Ca parait incroyable que l’authentification repose sur un simple token de 32 chars à passer en clair ….
J’ai du (encore..) recoder tout ça pour gérer une signature de l’URL afin de ne jamais passer en clair ce token, si ça intéresse quelqu’un envoyez moi un MP !
Effectivement, c’est d’ailleurs la première chose que j’ai signalé à l’équipe de développement de Prestashop le soir le la sortie de cette fonctionnalité.
Il est fortement recommandé d’utiliser une connexion HTTPS pour exploiter les webservices de Prestashop
Bonjour,
Qu’avez vous modifié exactement?
Est-ce possible d’avoir la source?
merci
Bonjour,
Si je comprends bien, je voudrais faire l’inverse de ce qui est expliqué… En fait, je désire que prestashop intérroge un serveur en local avec un service wsdl afin de récupérer des chose simples comme prix, stock,…
et les afficher sur mon webshop.
Est-ce qu’une bonne âme pourrait m’éclairer svp?
Merci.
Bonjour,
Tout est possible, notre équipe a déjà mis en place des interactions dans les deux sens.
Voici les possibilités :
Il faut que vous identifiez quelques sont les éléments à synchroniser, dans quels sens et également quelles sont les actions qui lanceront la synchronisation. Si cela doit être fait à intervalle régulier, ce n’est pas la même chose que si la synchronisation se fait à chaque commande par exemple.
Dans tous les cas, tout est possible si vous avez les compétences pour le faire.
En ce qui me concerne l’idée de mon logiciel m’est venue juste à la sortie de Prestashop 1.4. Je voulais développer le backoffice PS en service web dans le langage où je me sentais le mieux. Mais j’ai très vite abandonné l’API pour les raisons que vous évoquez ici. Du coup, j’ai tout re-développé cette fois ci en SOAP pour garder tout le contrôle de mon logiciel. Pour le fun, je développe un petit client Excel VBA disponible un jour sur github, voir https://github.com/Onasusweb/prestashop-excel-web-services. J’ai dans ma roadmap de rendre disponible en open source un framework en VBA, en java puis en C#.
C’est intéressant. Le problème n’est pas vraiment REST ou SOAP, c’est surtout qu’en interne, Prestashop n’utilise pas les mêmes méthodes que les webservices. Du coup, il y a des différences dans le fonctionnement et des manques au niveau de l’API.
N’hésitez pas à nous informer dès que sortira votre API SOAP
Bonjour,
Je débute sur prestashop et je trouve très intéressant ce tutoriel sur le web-service de prestashop.
J’ai juste un souci je n’arrive pas à aller sur la page /prestashop/api pour avoir la page au format xml.
Je précise que je suis en local, j’ai réussi a l’afficher en allant sur http://localhost/prestashop/webservice/dispatcher.php/
D’où vient le souci ?
Merci
Bonjour,
Je pense que vous n’avez pas activé la réécriture d’URL. Cette option permet de créer des URL simplifiées en réécrivant les chemins vers les fichiers du serveur.
Vous trouverez cette option dans l’interface d’administration de Prestashop. Cette option créée un fichier .htaccess sur votre boutique, il faut donc que votre serveur puisse le prendre en compte (module apache activés).
Bonjour,
Merci de votre réponse. Le problème était bien le module rewrite qui n’était pas activé sur Apache
Cdlt
Hello,
Pour ceux qui sont intéressés ou plus familiarisés avec les Webservices SOAP, un module Webservice SOAP pour prestashop est disponible sur GitHub.
https://github.com/mika75/prestasoap
Cdt
Salut,
J’ai téléchargé prestasoap, néanmoins, je n’ai pas compris comment le faire fonctionner.
J’ai décompressé l’archive dans /modules/ et modifier le config.
Je pensais que le module serai présent dans le BO mais non, c’est peut etre normal !
En passant par le navigateur http://www.monsite/modules/prestasoap/ j’ai bien le choix entre SOAP REST ALL , REST fonctionne bien mais pas le soap qui d ailleur ne me demande meme pas la clé , c ‘est peut etre normal encore une fois, ha oui j’ai oublié de préciser que je suis un gros noob en la matiere .
PS c est normal qu il n y est pas de fichier wsdl à la racine de prestasoap ?
Bonjour,
Cet article est plutôt intéressant et je vous en remercie. Je débute sur Prestashop et je voudrais vous poser une petite question. Je voudrais que mes clients puissent s’authentifier sur un logiciel que je vends en téléchargement sur ma boutique avec leurs logins de Prestashop. Et-ce possible avec les webservices de Prestashop 1.6 ? SI oui, comment (^^) et si non, que doit-on mettre en place (parce que deux mots de passe et deux identifiants, c’est pas super, pour l’utilisateur…) ? Merci d’avance.
Bonjour,
Les mots de passe des clients sont chiffrés avant d’être inséré en base de données. Pour que cela puisse fonctionner avec leurs identifiants, vous devez utiliser le même système de hashage afin de comparer les chaines obtenues.
Cela étant, je ne suis même pas sur que le champs passwd soit retourné par le webservice.
Il est toujours possible de faire du SSO mais dans votre cas, cela semble assez complexe. Je vous conseille de le mettre en place avec un développeur expérimenté.
Cordialement
Bonjour, et merci pour cette réponse !
Au final, c’est ce que nous avons fait, on a farfouillé dans prestashop pour savoir quel algorithme de chiffrement était utilisé et on l’a comparé, c’est maintenant un souci réglé, je vous remercie vraiment, vous nous avez bien aidé (:
Bonne journée !
Bonjour, j’ai un petit problème si quelqu’un pourrai bien m’aider. En fait je n’arrive pas à accéder à une entité précise de certains services. Par exemple jusqu’à « http://prestashop/api/carriers » pas de problème mais quand je veut accéder à l’entité d’ID 1 par exemple, c’est à dire « http://prestashop/api/carriers/1 » on m’affiche l’erreur « Fatal error: Class name must be a valid object or a string in C:\wamp\www\… ». Alors comment résoudre ce problème?
PS : C’est juste le cas pour certains services et non par pour tous
Merci
Bonjour,
Il se peut que l’API de Prestashop de votre version ne soit pas « terminée ». Nous avons déja rencontré des soucis comme ça sur des version 1.5 avec des méthodes qui n’étaient pas implémentée par Prestashop.
Par exemple, dans une veille version, il n’était pas possible de créer des tags sur des produits, nous l’avons corrigé (et partagé) pour que Prestashop soit capable de le faire.
Bonjour,
Je lis avec bcp d’interet votre page, j’espère que vous pourrez m’aider. J’ai contacté le support OVH qui m’a renvoyé à une doc et le support Prestashop qui me dit ne pas pouvoir m’aider.
J’ai activé le webservice et suivi ce que l’on me demande. Prestashop 1.6.
Lorsque je tape l’adresse de mon site /API il me demande sans cesse un id et un mot de passe. Je lui rentre le code généré mais rien à faire le xml ne se génère pas.
Cela fait 2 semaines qu eje parcours tous les sites mais je n’y arrive pas.
Pouvez vous m’aider svp ? je me tiens à dispo pour tous renseignements
Merci
Bonjour,
Voici un cas de figure dont j’espère avoir de l’aide. Supposons qu’on a une application qui gère un stock (article, quatité,…) et on veut utiliser Prestashop pour une boutique en ligne. Ma question est la suivante, peut-on envoyer de notre application via un webservice tous les produits vers la SGBD de Prestashop afin de faire une mise à jour des produits de ce dernier ?
Merci
Bonjour,
C’est effectivement un des buts premier de cette API. Chez Wixiweb, nous avons d’ailleurs développé des connecteurs spécifiques à certains ERP (à leur demande) pour être capable de piloter Prestashop à distance.
Attention tout de même, tout n’est pas possible avec l’API Prestashop et il arrive parfois que l’on soit obligé de développer de nouvelles méthodes, voir même, une nouvelle API.
A votre disposition
Bonjour,
j’aimerai savoir s’il était possible avec une seule requête via le WS de récupérer les données des tables liés , je prend notamment l’exemple d’un produit, j’ai récupérer également les valeurs présentes dans les tables associés (product_features et product_feature_values) , j’ai bien les id des différentes entrée dans ces tables mais pas leur valeurs;
après moultes essais je n’arrive pas arriver à mes fins…
j’ai beau décortiquer le code, notamment celui du getSQLRetrieveFilter,
je n’ai pas trouvé mon bonheur, votre aide me serait très précieuse.
Merci.
Bonjour,
L’accès par Webservice permet de récupérer des « entités » indépendante et ne permet pas de faire des requêtes en croisant des données comme vous pourriez le faire en SQL. Si vous voulez des méthodes directement prêtes à l’emploi, vous devrez surement développer votre propre API, ce que nous avons déjà fait pour certains projets spécifiques.
Bon courage pour votre projet !
Bonjour ,
Ma question est simple est il possible en saisissant une requête HTTP de mettre à jour une ressource ? (EX : le stock)
du style
http:///api/products/?filter%5Bid%5D=%5B1,20%5D set stock-available=2
Quel est la syntaxe ?
Bonjour,
J’ai bien compris comment récupérer des données via « requête » http du style http:///api/products/?limit=100&sort=id_desc
Maintenant pour aller plus loin, quel est la syntaxe pour mettre à jour des données ou en ajouter ?
Par exemple passé une commande en « en cours de livraison »
Quel est la syntaxe de la requête http à saisir ?
Merci par avance
Bonjour,
Lorsque vous effectuée une requête depuis votre navigateur (Barre d’adresse), elle est envoyée en GET.
Pour créer/Modifier une ressource, vous devez changer le type :
Vous pouvez utiliser un formulaire HTML ou même installer une extension Firefox / Chrome pour envoyer ce type de requête.
Amusez-vous bien !
Bonjour,
Merci pour cet article fort intéressant :-)
J’ai une question par rapport à la requête suivante :
http://<VOTRE_BOUTIQUE_PRESTASHOP>/api/products/?filter%5Bid%5D=%5B1,20%5D
J’utilisais exactement cette requête et cela fonctionnait parfaitement, mais plus depuis que j’ai dû changer la version de PHP sur l’hébergement mutualisé OVH que j’utilise. Je suis maintenant en PHP 5.5 sur un Prestashop 1.5.
Est-ce qu’il existe une autre syntaxe en PHP 5.5 ?
Merci d’avance pour votre aide !
Bonjour
Je suie au début de ma création boutique et je dois sans cesse m identifier à chaque modification 6…7… ou 10 fois… c’est une horreur !
Du téléphone idem
Internet idem
Chrome idem
Merci de me venir en aide.