{"id":1116,"date":"2019-02-07T12:30:18","date_gmt":"2019-02-07T18:30:18","guid":{"rendered":"https:\/\/www.emanuelpaxtian.com\/?p=1116"},"modified":"2025-08-04T22:30:13","modified_gmt":"2025-08-05T04:30:13","slug":"detectar-peticion-ajax-con-php","status":"publish","type":"post","link":"https:\/\/emanuelpaxtian.com\/blog\/detectar-peticion-ajax-con-php\/","title":{"rendered":"Detectar petici\u00f3n AJAX con PHP"},"content":{"rendered":"\nEn el desarrollo web moderno, a menudo necesitamos distinguir entre peticiones regulares y solicitudes AJAX para mejorar la seguridad o implementar comportamientos espec\u00edficos. Veamos c\u00f3mo hacer esta verificaci\u00f3n de manera efectiva.\n\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nif(\n   !empty($_SERVER&#x5B;&#039;HTTP_X_REQUESTED_WITH&#039;]) &amp;&amp;\n   strtolower($_SERVER&#x5B;&#039;HTTP_X_REQUESTED_WITH&#039;]) == &#039;xmlhttprequest&#039;\n){\n   # Aqu\u00ed van las operaciones que se mostraran mediante una petici\u00f3n ajax\n}else{\n   # Ejecutamos las instrucciones si no es Ajax\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 es importante esta comprobaci\u00f3n?<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Seguridad<\/strong>: Puedes restringir ciertas operaciones sensibles solo a llamadas AJAX desde tu propia aplicaci\u00f3n.<\/li>\n\n\n\n<li><strong>Experiencia de usuario<\/strong>: Permite ofrecer respuestas diferentes (JSON vs HTML completo) seg\u00fan c\u00f3mo se acceda.<\/li>\n\n\n\n<li><strong>Prevenci\u00f3n de acceso directo<\/strong>: Evita que usuarios accedan directamente a endpoints pensados para ser usados v\u00eda AJAX.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo funciona<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>$_SERVER['HTTP_X_REQUESTED_WITH']<\/code>\u00a0es una cabecera HTTP que los frameworks JavaScript como jQuery env\u00edan autom\u00e1ticamente en peticiones AJAX.<\/li>\n\n\n\n<li>Verificamos que no est\u00e9 vac\u00eda (<code>!empty<\/code>).<\/li>\n\n\n\n<li>Convertimos a min\u00fasculas (<code>strtolower<\/code>) para comparaci\u00f3n case-insensitive.<\/li>\n\n\n\n<li>Comprobamos que el valor sea exactamente &#8220;xmlhttprequest&#8221;.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Limitaciones a considerar<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>No es 100% confiable<\/strong>: Las cabeceras HTTP pueden ser falsificadas.<\/li>\n\n\n\n<li><strong>No todos los clientes AJAX la env\u00edan<\/strong>: Algunas librer\u00edas modernas podr\u00edan no incluirla por defecto.<\/li>\n\n\n\n<li><strong>Debe complementarse con otras medidas<\/strong>: Como tokens CSRF y validaci\u00f3n de origen.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>En el desarrollo web moderno, a menudo necesitamos distinguir entre peticiones regulares y solicitudes AJAX para mejorar la seguridad o implementar comportamientos espec\u00edficos. Veamos c\u00f3mo hacer esta verificaci\u00f3n de manera&hellip;<\/p>\n","protected":false},"author":1,"featured_media":383,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"_links":{"self":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/1116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/comments?post=1116"}],"version-history":[{"count":3,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/1116\/revisions"}],"predecessor-version":[{"id":1147,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/1116\/revisions\/1147"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media\/383"}],"wp:attachment":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media?parent=1116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/categories?post=1116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/tags?post=1116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}