{"id":228572,"date":"2022-10-23T15:54:00","date_gmt":"2022-10-23T12:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228572"},"modified":"2022-11-09T03:04:15","modified_gmt":"2022-11-09T00:04:15","slug":"solicitudes-remotas-con-wp_safe_remote_get","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/solicitudes-remotas-con-wp_safe_remote_get\/","title":{"rendered":"Solicitudes remotas con wp_safe_remote_get"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/es\/solicitudes-remotas-con-wp_remote_get\/\" title=\"Ayer\" >Ayer<\/a>, compart\u00ed una publicaci\u00f3n sobre c\u00f3mo usar <code>wp_remote_get<\/code>, pero omit\u00ed una funci\u00f3n alternativa: <code>wp_safe_remote_get<\/code>. El objetivo original era usar la primera publicaci\u00f3n para mostrar:<\/p>\n<ol>\n<li>Lo que acepta la funci\u00f3n original,<\/li>\n<li>C\u00f3mo usar la funci\u00f3n original,<\/li>\n<li>Lo que devuelve la funci\u00f3n original,<\/li>\n<li>C\u00f3mo se ve una implementaci\u00f3n.<\/li>\n<\/ol>\n<p>Y luego iba a echar un vistazo a <code>wp_safe_remote_get<\/code>. Pero hay un desaf\u00edo: tengo amigos inteligentes. Poco despu\u00e9s de publicar la publicaci\u00f3n, recibo una respuesta de <a href=\"https:\/\/twitter.com\/royboy789\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Roy<\/a> :<\/p>\n<p>\u00a1Gracias, Roy! (Aseg\u00farate de <a href=\"https:\/\/hiroy.club\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">decirle &quot;\u00a1Hola!&quot;<\/a>. \ud83d\ude42<\/p>\n<p>Pero en serio, el seguimiento de la publicaci\u00f3n de ayer es exactamente eso: <code>wp_safe_remote_get<\/code>. Y es c\u00f3mo determinar la diferencia en las dos funciones y cu\u00e1ndo usar\u00edas una sobre la otra.<\/p>\n<h2>wp_safe_remote_get<\/h2>\n<p>Directamente de los documentos de la API, <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_safe_remote_get\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aprendemos<\/a> :<\/p>\n<blockquote>\n<p>Esta funci\u00f3n es ideal cuando la solicitud HTTP se realiza a una URL arbitraria. La URL se valida para evitar redirecci\u00f3n y solicitar ataques de falsificaci\u00f3n.<\/p>\n<\/blockquote>\n<p>Y al igual que su contraparte, acepta una URL y una serie de argumentos que pueden especificar c\u00f3mo se realiza la solicitud.<\/p>\n<p>Adem\u00e1s, al igual que <code>wp_remote_get<\/code>, tambi\u00e9n devuelve una matriz de los datos de respuesta o una instancia de <code>WP_Error<\/code>si la solicitud falla.<\/p>\n<p>El uso de esta funci\u00f3n no es diferente al uso de la anterior, pero plantea la pregunta:<\/p>\n<p>\u00bfCu\u00e1ndo usamos uno sobre el otro? M\u00e1s espec\u00edficamente, \u00bfcu\u00e1ndo usamos <code>wp_remote_get<\/code>versus <code>wp_safe_remote_get<\/code>?<\/p>\n<h3>Leer la fuente<\/h3>\n<p>Cuando te enfrentas a una situaci\u00f3n como esta, lo mejor que puedes hacer es leer la fuente:<\/p>\n<ol>\n<li><a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/4.7\/src\/wp-includes\/http.php#L168\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>wp_remote_get<\/code><\/a><\/li>\n<li><a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/4.7\/src\/wp-includes\/http.php#L67\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>wp_safe_remote_get<\/code><\/a><\/li>\n<\/ol>\n<p>Si lee los enlaces anteriores, notar\u00e1 que este \u00faltimo rechaza las &quot;URL no seguras&quot; que determina <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_http_validate_url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_http_validate_url<\/a> a trav\u00e9s de una serie de comprobaciones avanzadas.<\/p>\n<h3>Pero a\u00fan as\u00ed, \u00bfcu\u00e1l uso?<\/h3>\n<p>Esto todav\u00eda deja la pregunta sin respuesta, \u00bfno es as\u00ed? Creo que es f\u00e1cil hacer la declaraci\u00f3n general de que siempre debe usar wp_safe_remote_get (o wp_safe_remote_post, para el caso).<\/p>\n<p>Sin embargo, todos los proyectos son diferentes.<\/p>\n<p>Por ejemplo, si est\u00e1 trabajando en un complemento que solo se usar\u00e1 en una intranet y tiene control sobre, digamos, una lista blanca de URL que se puede pasar a la funci\u00f3n, entonces est\u00e1 bien usar el primero.<\/p>\n<p>Sin embargo, si est\u00e1 exponiendo este \u00faltimo a los usuarios, use siempre la versi\u00f3n segura de la funci\u00f3n.<\/p>\n<h2>En breve<\/h2>\n<p>Mi regla general es esta (y es similar a la desinfecci\u00f3n):<\/p>\n<p>Si los usuarios van a interactuar con la funci\u00f3n, aseg\u00farese de que est\u00e9n interactuando con la versi\u00f3n m\u00e1s segura posible del c\u00f3digo.<\/p>\n<p>De lo contrario, hay demasiado en riesgo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si no est\u00e1 seguro de cu\u00e1ndo usar wp_remote_get o wp_safe_remote_get, tal vez esta publicaci\u00f3n lo ayude a determinar cu\u00e1ndo es mejor.<\/p>\n","protected":false},"author":1,"featured_media":168025,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,810,716,861],"tags":[1172],"class_list":["post-228572","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=228572"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228572\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/168025"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}