{"id":2235,"date":"2025-10-23T11:32:32","date_gmt":"2025-10-23T09:32:32","guid":{"rendered":"https:\/\/hoper.dnsalias.net\/atdc\/?p=2235"},"modified":"2025-10-23T11:32:32","modified_gmt":"2025-10-23T09:32:32","slug":"claude-wordpress-magie","status":"publish","type":"post","link":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/2025\/10\/23\/claude-wordpress-magie\/","title":{"rendered":"Claude, WordPress, Magie"},"content":{"rendered":"<p>Hier j&rsquo;ai d\u00e9couvert plusieurs commentaires en attente de validation sur ce blog. Des commentaires importants, qui auraient du \u00eatre valid\u00e9s en moins d&rsquo;une journ\u00e9e, voir m\u00eame plus vite. Je me suis donc demand\u00e9 comment recevoir des notifications lorsqu&rsquo;un nouveau commentaire \u00e9tait publi\u00e9 ou en attende de validation. Alors oui, je vais faire un peu de pub \u00e0 l&rsquo;IA, et \u00e0 Claude en particulier. Mais si ce point vous d\u00e9range, je vous invite \u00e0 aller lire la derni\u00e8re partie de ce billet.<\/p>\n<p>Je pr\u00e9cise que je ne connais pas grand chose \u00e0 php, et absolument rien au d\u00e9veloppement de plugin wordpress.<\/p>\n<p>Etape 1 : On demande \u00e0 <a href=\"http:\/\/claude.ai\">Claude<\/a> ce qu&rsquo;il en pense, sachant que mon abonnement chez Free me permet de recevoir des SMS via une API. Il me propose comme pr\u00e9vu d&rsquo;\u00e9crire un plugin. Quelques lignes de code plus tard, tout fonctionne. Du premier coup.<\/p>\n<p>Etape 2 : Je lui fait part de mes inqui\u00e9tudes en terme de s\u00e9curit\u00e9, notamment parce que ce plugin traite des donn\u00e9es non contr\u00f4l\u00e9es en entr\u00e9e (le nom de l&rsquo;auteur du commentaire).<\/p>\n<p>Sa r\u00e9ponse :<\/p>\n<blockquote>\n<p class=\"whitespace-normal break-words\">Excellente question ! Et vous avez raison d&rsquo;\u00eatre vigilant. Analysons les risques de s\u00e9curit\u00e9 :<\/p>\n<h4 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Les points d&rsquo;entr\u00e9e non contr\u00f4l\u00e9s<\/h4>\n<ol class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-2.5 pl-7\">\n<li class=\"whitespace-normal break-words\"><strong><code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">$comment-&gt;comment_author<\/code><\/strong> &#8211; Le nom saisi par l&rsquo;auteur du commentaire<\/li>\n<li class=\"whitespace-normal break-words\"><strong><code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">get_bloginfo('name')<\/code><\/strong> &#8211; Le nom de votre blog (moins risqu\u00e9 car contr\u00f4l\u00e9 par vous)<\/li>\n<\/ol>\n<h4 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Les risques potentiels<\/h4>\n<h5 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">1. <strong>Injection dans l&rsquo;URL de l&rsquo;API<\/strong><\/h5>\n<p class=\"whitespace-normal break-words\">Le vrai risque ici, c&rsquo;est que <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">$comment-&gt;comment_author<\/code> est ins\u00e9r\u00e9 directement dans l&rsquo;URL via <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">http_build_query()<\/code>. Un utilisateur malveillant pourrait tenter d&rsquo;injecter des caract\u00e8res sp\u00e9ciaux.<\/p>\n<p class=\"whitespace-normal break-words\"><strong>Heureusement<\/strong>, <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">http_build_query()<\/code> encode automatiquement les param\u00e8tres URL (via <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">urlencode()<\/code>), ce qui neutralise ce risque. Les caract\u00e8res sp\u00e9ciaux comme <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">&amp;<\/code>, <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">=<\/code>, <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">?<\/code> sont \u00e9chapp\u00e9s.<\/p>\n<h5 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">2. <strong>Limitations de l&rsquo;API Free Mobile<\/strong><\/h5>\n<p class=\"whitespace-normal break-words\">L&rsquo;API Free Mobile a des limitations strictes :<\/p>\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-2.5 pl-7\">\n<li class=\"whitespace-normal break-words\">Maximum <strong>160 caract\u00e8res<\/strong> par SMS<\/li>\n<li class=\"whitespace-normal break-words\">Certains caract\u00e8res sp\u00e9ciaux peuvent poser probl\u00e8me<\/li>\n<li class=\"whitespace-normal break-words\">Pas de validation du retour de l&rsquo;API dans le code actuel<\/li>\n<\/ul>\n<h5 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">3. <strong>Spam\/Flood de SMS<\/strong><\/h5>\n<p class=\"whitespace-normal break-words\">Si un bot spam envoie 100 commentaires d&rsquo;un coup, vous recevrez 100 SMS ! L&rsquo;API Free Mobile est limit\u00e9e \u00e0 environ <strong>200 SMS\/jour<\/strong>, mais c&rsquo;est quand m\u00eame g\u00eanant.<\/p>\n<\/blockquote>\n<p>Enfin il me propose des modifications pour durcir le code. Modifications que j&rsquo;ai bien sur int\u00e9gr\u00e9es. Alors pour ceux qui voudraient faire la m\u00eame chose, tout ce que vous avez \u00e0 faire est de cr\u00e9er un r\u00e9pertoire contenant un fichier .php dans wp-content\/plugin. Copier <a href=\"https:\/\/hoper.dnsalias.net\/public\/plugin_comment_sms.txt\">ce code<\/a> \u00e0 l\u2019int\u00e9rieur. Mettez vos informations (identifiant et clef api) puis activez le plugin dans l&rsquo;IHM de wordpress.<\/p>\n<p>Et c&rsquo;est fini. Maintenant chaque fois qu&rsquo;un commentaire est publi\u00e9 ou en attente, vous recevez un SMS. Honn\u00eatement, il \u00e0 du s&rsquo;\u00e9couler moins de 10 minutes entre le moment ou j&rsquo;ai pos\u00e9 ma premi\u00e8re question \u00e0 Claude et la mise en place de la derni\u00e8re version. C&rsquo;est quand m\u00eame un peu magique non ?<\/p>\n<h3>Les IA c&rsquo;est mal<\/h3>\n<p>Je comprend les probl\u00e8mes \u00e9cologiques que \u00e7a pose. Et plus grave \u00e0 mes yeux, la vitesse \u00e0 laquelle on se dirige vers le monde d\u00e9crit dans le film Idiocratie. Mais le probl\u00e8me n&rsquo;est pas l&rsquo;outil, c&rsquo;est la fa\u00e7on avec laquelle on s&rsquo;en sert !<\/p>\n<p>J&rsquo;utilise Claude de plus en plus. Et je n&rsquo;ai pas l&rsquo;impression de devenir stupide. Au contraire, j&rsquo;apprends \u00e9norm\u00e9ment de choses. Avant quand j&rsquo;avais des messages d&rsquo;erreurs sur mon serveur linux, je faisais surement comme tout le monde : Rien. Parce qu&rsquo;il fallait des jours de recherche sur le net pour comprendre chacun de ces messages \u00ab\u00a0probablement inoffensif\u00a0\u00bb. Maintenant je demande \u00e0 Claude, et j&rsquo;apprends. J&rsquo;apprends comment fonctionne un bus PCI, j\u2019apprends comment param\u00e9trer l\u2019ordonnanceur d&rsquo;\u00e9criture de linux, j\u2019apprends \u00e0 quoi servent les diff\u00e9rents niveau d&rsquo;encodage h264 (main 4.0 etc). Je d\u00e9couvre des options sur la commande rsync qui divisent par trois le temps n\u00e9cessaire \u00e0 la r\u00e9alisation de mes sauvegardes externes (les backups principaux \u00e9tant assur\u00e9es par borg). Je (re)d\u00e9couvre que dans chaque domaine de l&rsquo;informatique, m\u00eame ceux que je croyais le mieux maitriser, je ne connais finalement qu&rsquo;une infime partie de ce qui me rendrait pourtant service au quotidien.<\/p>\n<p>Et le mieux dans tout \u00e7\u00e0 ? J&rsquo;apprends de la meilleur fa\u00e7on possible, \u00e0 savoir en m&rsquo;amusant. Petit extrait d&rsquo;une de mes derni\u00e8res conversation. Je demandai \u00e0 Claude de m&rsquo;aider \u00e0 analyser les informations smart d&rsquo;un disque dur reconditionn\u00e9 que je venais de recevoir. Et apr\u00e8s lui avoir fait part des mes pr\u00e9occupations, voila comment il a termin\u00e9 sa conclusion :<\/p>\n<blockquote>\n<p class=\"whitespace-normal break-words\">Votre disque est en <strong>tr\u00e8s bon \u00e9tat<\/strong>. C&rsquo;est m\u00eame une excellente affaire pour un reconditionn\u00e9 :<\/p>\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-2.5 pl-7\">\n<li class=\"whitespace-normal break-words\">Disque enterprise quasi neuf<\/li>\n<li class=\"whitespace-normal break-words\">Aucun signe de d\u00e9faillance<\/li>\n<li class=\"whitespace-normal break-words\">Les variations de compteurs Seagate sont normales<\/li>\n<\/ul>\n<p class=\"whitespace-normal break-words\"><strong>Conseil<\/strong> : Gardez-le, mais surveillez quand m\u00eame le SMART mensuellement. Si la valeur normalis\u00e9e du Seek_Error_Rate descend vers 50-55, l\u00e0 il faudra s&rsquo;inqui\u00e9ter. Pour l&rsquo;instant, vous avez un excellent disque professionnel \u00e0 peine utilis\u00e9.<\/p>\n<p class=\"whitespace-normal break-words\">Combien l&rsquo;avez-vous pay\u00e9, si ce n&rsquo;est pas indiscret ?<\/p>\n<\/blockquote>\n<p>Genre Claude r\u00e9fl\u00e9chit pour s&rsquo;acheter des disques&#8230; Juste LOL !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hier j&rsquo;ai d\u00e9couvert plusieurs commentaires en attente de validation sur ce blog. Des commentaires importants, qui auraient du \u00eatre valid\u00e9s en moins d&rsquo;une journ\u00e9e, voir m\u00eame plus vite. Je me suis donc demand\u00e9 comment recevoir des notifications lorsqu&rsquo;un nouveau commentaire \u00e9tait publi\u00e9 ou en attende de validation. Alors oui, je vais faire un peu de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2239,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-2235","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geekitude"],"_links":{"self":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/2235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/comments?post=2235"}],"version-history":[{"count":6,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/2235\/revisions"}],"predecessor-version":[{"id":2247,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/2235\/revisions\/2247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/media\/2239"}],"wp:attachment":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/media?parent=2235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/categories?post=2235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/tags?post=2235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}