{"id":421,"date":"2008-11-24T08:00:07","date_gmt":"2008-11-24T07:00:07","guid":{"rendered":"http:\/\/nyams.planbweb.com\/blog\/?p=421"},"modified":"2008-11-24T08:00:07","modified_gmt":"2008-11-24T07:00:07","slug":"detournement-des-entetes-http-en-ajax","status":"publish","type":"post","link":"https:\/\/nyamsprod.com\/blog\/detournement-des-entetes-http-en-ajax\/","title":{"rendered":"D\u00e9tournement des ent\u00eates HTTP en Ajax"},"content":{"rendered":"<div class=\"message warning\">\n<p><strong>Attention:<\/strong> Les informations de ce billet sont susceptibles d'&ecirc;tre obsol&egrave;tes car vieux de plus 2 ans.<\/p>\n<p><strong>Warning: <\/strong> The information you are reading may be obsolete, this post was published more than 2 years ago.<\/p>\n<\/div><p>Il existe 3 mani\u00e8res d&#8217;utiliser l&#8217;objet <code>XMLHTTPRequest<\/code> pour \u00e9changer des informations avec votre serveur.\u00a0On peut utiliser le support historique qu&#8217;est le <em>XML<\/em>. Le probl\u00e8me \u00e9tant qu&#8217;ensuite il faut parser le fichier <em>XML<\/em> via <em>javascript<\/em> avant de pouvoir en utiliser le contenu. Dire que cela est laborieux est un euph\u00e9misme, c&#8217;est tout\u00a0simplement chiant \u00e0 faire. C&#8217;est \u00e0 cause de la complexit\u00e9 de ce traitement que l&#8217;utilisation de la notation <em>JSON<\/em> a gagn\u00e9\u00a0en popularit\u00e9. <!--more--><a title=\"Tout sur la notation JSON\" href=\"http:\/\/www.json.org\/js.html\">Avec le <\/a><em><a title=\"Tout sur la notation JSON\" href=\"http:\/\/www.json.org\/js.html\">JSON<\/a><\/em> plus besoin de parser le <em>XML<\/em>, les donn\u00e9es sont accessibles directement en <em>javascript<\/em> via\u00a0la fonction <code>eval<\/code> de mani\u00e8re natif. Dans le cas o\u00f9 vous ne faites pas confiance \u00e0 la source de votre flux d&#8217;information,\u00a0le recours \u00e0 un parser <em>JSON<\/em> est recommand\u00e9. Le probl\u00e8me de cette approche et que si vous ne d\u00e9sirez modifier qu&#8217;un \u00e9l\u00e9ment\u00a0de votre page contenant plus ou moins beaucoup d&#8217;informations, il vous faudra exceller en <abbr title=\"Document Object Model\"><acronym title=\"Document Object Model\">DOM<\/acronym><\/abbr> pour mettre \u00e0 jour\u00a0l&#8217;affichage de votre page. C&#8217;est dans ce dernier cas que la 3\u00e8me et derni\u00e8re technique l&#8217;<abbr title=\"Asynchrone Html And HTTP\"><acronym title=\"Asynchrone Html And HTTP\">AHAH<\/acronym><\/abbr> (Asynchrone Html And HTTP)\u00a0est appropri\u00e9. Tr\u00e8s simple d&#8217;utilisation, <a title=\"Explication du fonctionnement de l'Asynchrone HTML and HTTP\" href=\"http:\/\/ajax.phpmagazine.net\/2005\/11\/ahah_asychronous_html_and_http.html\">l&#8217;<\/a><em><a title=\"Explication du fonctionnement de l'Asynchrone HTML and HTTP\" href=\"http:\/\/ajax.phpmagazine.net\/2005\/11\/ahah_asychronous_html_and_http.html\">AHAH<\/a><\/em><a title=\"Explication du fonctionnement de l'Asynchrone HTML and HTTP\" href=\"http:\/\/ajax.phpmagazine.net\/2005\/11\/ahah_asychronous_html_and_http.html\"> combine l&#8217;objet l&#8217;<\/a><code><a title=\"Explication du fonctionnement de l'Asynchrone HTML and HTTP\" href=\"http:\/\/ajax.phpmagazine.net\/2005\/11\/ahah_asychronous_html_and_http.html\">XMLHTTPRequest<\/a><\/code><a title=\"Explication du fonctionnement de l'Asynchrone HTML and HTTP\" href=\"http:\/\/ajax.phpmagazine.net\/2005\/11\/ahah_asychronous_html_and_http.html\"> et la m\u00e9thode <\/a><code><a title=\"Explication du fonctionnement de l'Asynchrone HTML and HTTP\" href=\"http:\/\/ajax.phpmagazine.net\/2005\/11\/ahah_asychronous_html_and_http.html\">innerHTML<\/a><\/code>. La modification\u00a0d&#8217;une partie et\/ou de l&#8217;enti\u00e8ret\u00e9 de votre page se fait d\u00e8s lors quasi instantan\u00e9ment. En r\u00e9sum\u00e9 :<\/p>\n<ol>\n<li>Vous construisez c\u00f4t\u00e9 serveur la partie <em>HTML<\/em> que vous d\u00e9sirez ajouter \u00e0 votre page;<\/li>\n<li>Vous la r\u00e9cup\u00e9rez via <code>XMLHTTPRequest<\/code> dans votre page;<\/li>\n<li>Vous l&#8217;incluez dans l&#8217;\u00e9l\u00e9ment de votre choix via <code>innerHTML<\/code><\/li>\n<\/ol>\n<p>&#8230;et hop c&#8217;est dans la bo\u00eete. Et voici un exemple pour illustrer mon propos :<\/p>\n<p>Exemple simplifi\u00e9 d&#8217;une page PHP c\u00f4t\u00e9 serveur appel\u00e9 via <code>XMLHTTPRequest<\/code><\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">&lt;?php\nheader(&#039;content-type : text\/plain&#039;);\n$ajax = &#039;&lt;div&gt;&lt;p&gt;&lt;strong&gt;This is changed via Ajax&lt;\/strong&gt;&lt;\/p&gt;&lt;\/div&gt;&#039;;\necho $ajax;\n?&gt;<\/pre>\n<p>C\u00f4t\u00e9 client on r\u00e9cup\u00e8re via l&#8217;objet <code>XMLHTTPRequest<\/code> le contenu du fichier PHP en l&#8217;occurence $ajax.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\/\/soit XHR l&#039;objet XMLHTTPRequest\nif (XHR.readyState === 4) {\nif (XHR.status === 200) { \u00a0\/\/ On a recu une reponse correcte du serveur\ndocument.getElementById(&#039;content&#039;).innerHTML = XHR.responseText\n\/\/ XHR.responseText correspond \u00e0 la valeur de la variable PHP $ajax;\n}\n}<\/pre>\n<p>Le probl\u00e8me avec l&#8217;<em>AHAH<\/em> c&#8217;est qu&#8217;on ne peut modifie qu&#8217;un \u00e9l\u00e9ment de la page par requ\u00eate. Que se passe-t-il si l&#8217;on veut\u00a0modifier 2 ou 3 \u00e9l\u00e9ments ind\u00e9pendants du site via une une requ\u00eate HTTP ? Une solution,\u00a0pour contourner le probl\u00e8me serait de modifier l&#8217;enti\u00e8ret\u00e9 de la page&#8230; Mais cela r\u00e9duit \u00e0 n\u00e9ant l&#8217;avantage de \u00a0l&#8217;utilisation de l&#8217;<em>Ajax<\/em>. En fait, ce serait bien de combiner la simplicit\u00e9 du <em>AHAH<\/em> avec une certaine flexibilit\u00e9 que l&#8217;on\u00a0retrouve avec l&#8217;utilisation du <em>JSON<\/em> ou du <em>XML<\/em>, alors comment faire ?<\/p>\n<p>En regardant de plus pr\u00e8s l&#8217;objet <code>XMLHTTPRequest<\/code> on se rend compte que celui-ci poss\u00e8de 2 m\u00e9thodes m\u00e9connues :<\/p>\n<ul>\n<li><code>setResponseHeader<\/code>, capable de cr\u00e9er et d&#8217;envoyer des ent\u00eates HTTP;<\/li>\n<li><code>getResponseHeader<\/code>, capable de recevoir et de lire les ent\u00eates HTTP.<\/li>\n<\/ul>\n<p>D&#8217;o\u00f9 l&#8217;id\u00e9e totalement immonde de <a title=\"Ce \u00e0 quoi peuvent servir r\u00e9ellement les ent\u00eates HTTP\" href=\"http:\/\/www.php-experts.org\/developpement-web\/php-developpement-web\/erreur-404-redirection-301-headers-et-codes-de-reponse-http-courants-24\">d\u00e9tourner les ent\u00eates HTTP<\/a> pour envoyer des informations suppl\u00e9mentaires qui me\u00a0permettraient de changer d&#8217;autres aspects de ma page tout en gardant la facilit\u00e9 d&#8217;utilisation de la m\u00e9thode <code>AHAH<\/code>.<\/p>\n<p>Je sais les puristes me diront que les ent\u00eates HTTP ne servent pas \u00e0 \u00e7a, certains m&#8217;ont m\u00eame dit :<\/p>\n<blockquote><p>le respect des RFC en mati\u00e8res de proxy HTTP, c&#8217;est un peu comme le respect des standards du XHTML strict par les\u00a0d\u00e9veloppeurs web.<\/p><\/blockquote>\n<p>Sachant que ma technique est un peu barbare, je me suis restreins dans l&#8217;utilisation de celle-ci. C&#8217;est d\u00e9j\u00e0 assez mal de\u00a0le faire alors je ne l&#8217;utilise que pour envoyer vers mon client des informations minimales de type :<\/p>\n<ul>\n<li>pseudo boole\u00e9ns (ex: &#8216;t\/f&#8217; ou &#8216;KO\/OK&#8217;);<\/li>\n<li>des nombres;<\/li>\n<\/ul>\n<p>Mais rien n&#8217;emp\u00eacherait un esprit mal intentionn\u00e9 d&#8217;envoyer encore plus d&#8217;informations via cette m\u00e9thode&#8230;\u00a0bien que je ne le recommande pas. Encore une fois je le dis, <a title=\"La RFC qui d\u00e9finie le r\u00f4le des RFC\" href=\"http:\/\/www.w3.org\/Protocols\/rfc2616\/rfc2616.html\">les requ\u00eates HTTP \u00e7a sert pas \u00e0 \u00e7a<\/a>. \u00a0Avec mes requ\u00eates HTTP &#8220;fait maison&#8221; j&#8217;envoie donc des donn\u00e9es pouvant entrainer des changements locaux contr\u00f4ler par\u00a0javascript en suivant la m\u00e9thode suivante :<\/p>\n<p>C\u00f4t\u00e9 serveur, on aura :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">&lt;?php\nheader(&#039;content-type :text\/plain&#039;);\n$ajax = &#039;&lt;div&gt;&lt;p&gt;&lt;strong&gt;This is changed via Ajax&lt;\/strong&gt;&lt;\/p&gt;&lt;\/div&gt;&#039;;\n\/\/ $condition est la r\u00e9sultante de ce que le serveur a recu comme requete via Ajax\n$http_header = ($condition === true) ? &#039;OK&#039; : &#039;KO&#039;;\nheader(&#039;x-sajax-condition :&#039; . $http_header, true);\necho $ajax;\n?&gt;<\/pre>\n<p>et au niveau de mon javascript je r\u00e9cup\u00e8re l&#8217;information tr\u00e8s simplement<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\/\/soit HR l&#039;objet XMLHTTPRequest\nif (XHR.readyState === 4) {\nif ( HR.status === 200) { \u00a0\/\/ On a recu une reponse correcte du serveur\nvar cond = HR.getResponseHeader(&#039;x-sajax-condition&#039;);\nif (\/OK\/.test(cond)) {\n\/\/changement si la condition est OK\n} else {\n\/\/changement si la condition est KO\n}\ndocument.getElementById(&#039;content&#039;).innerHTML = HR.responseText;\n}\n}<\/pre>\n<p>Et voila, que pensez-vous de cela&#8230; C&#8217;est mal, je sais, pensez-vous qu&#8217;il existe une autre mani\u00e8re pour obtenir la m\u00eame\u00a0fl\u00e9xibilit\u00e9 tout en utilisant l&#8217;<em>AHAH<\/em> ? Si oui, je suis preneur \ud83d\ude09 .<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comment d\u00e9tourner les informations envoy\u00e9es via les HTTP Headers pour augmenter les capacit\u00e9s d&#8217;\u00e9change d&#8217;informations via Ajax<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5],"tags":[29,31,258,259,292,306,412,581],"class_list":["post-421","post","type-post","status-publish","format-standard","hentry","category-web","tag-ahah","tag-ajax","tag-http","tag-http-headers","tag-javascript","tag-json","tag-php","tag-xml"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts\/421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/comments?post=421"}],"version-history":[{"count":0,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/posts\/421\/revisions"}],"wp:attachment":[{"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/media?parent=421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/categories?post=421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nyamsprod.com\/blog\/wp-json\/wp\/v2\/tags?post=421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}