{"id":228709,"date":"2022-10-31T20:12:00","date_gmt":"2022-10-31T17:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228709"},"modified":"2022-11-09T03:57:39","modified_gmt":"2022-11-09T00:57:39","slug":"co-to-znaczy-uzywac-wordpressa-jako-proxy","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/co-to-znaczy-uzywac-wordpressa-jako-proxy\/","title":{"rendered":"Co to znaczy u\u017cywa\u0107 WordPressa jako proxy?"},"content":{"rendered":"\n<p>Je\u015bli pracowa\u0142e\u015b z WordPressem przez d\u0142u\u017cszy czas, zw\u0142aszcza je\u015bli chodzi o korzystanie z pewnego rodzaju funkcji Ajax, prawdopodobnie w pewnym momencie s\u0142ysza\u0142e\u015b wyra\u017cenie \u201eu\u017cyj WordPressa jako proxy&quot;.<\/p>\n<p>I nawet je\u015bli nie masz szans, \u017ce faktycznie to zrobi\u0142e\u015b, s\u0105 do\u015b\u0107 wysokie.<\/p>\n<p>Chocia\u017c my\u015bl\u0119, \u017ce wraz z up\u0142ywem czasu zobaczymy, \u017ce REST API zast\u0105pi tradycyjne sposoby, w jakie u\u017cywali\u015bmy Ajax, ale to prawdopodobnie inna historia na inny czas.<\/p>\n<p>Wi\u0119c co to znaczy u\u017cywa\u0107 WordPressa jako proxy za ka\u017cdym razem, gdy pracujesz z \u017c\u0105daniami Ajax? Wymaga troch\u0119 zrozumienia \u017c\u0105da\u0144 mi\u0119dzy witrynami, sposobu dzia\u0142ania routingu \u017c\u0105dania przez WordPress, a nast\u0119pnie przeanalizowania odpowiedzi.<\/p>\n<h2>U\u017cyj WordPressa jako proxy<\/h2>\n<p>To troch\u0119 d\u0142ugi post, prawda? Zamiast tego postaram si\u0119 opisa\u0107 to w kr\u00f3tszych terminach, aby\u015b m\u00f3g\u0142 je przeczyta\u0107, a nast\u0119pnie wr\u00f3ci\u0107 do pracy.<\/p>\n<h3>Jako pe\u0142nomocnik<\/h3>\n<p>Najpierw we\u017amy <a href=\"https:\/\/www.google.com\/search?q=define%3A+proxy&#038;oq=define%3A+proxy&#038;aqs=chrome..69i57j69i58.1706j0j7&#038;sourceid=chrome&#038;ie=UTF-8\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">definicj\u0119 proxy<\/a> :<\/p>\n<blockquote>\n<p>upowa\u017cnienie do reprezentowania kogo\u015b innego, zw\u0142aszcza w g\u0142osowaniu<\/p>\n<\/blockquote>\n<p>Je\u015bli klikniesz powy\u017cszy link, zauwa\u017cysz, \u017ce istnieje kilka innych definicji, ale \u017cadna z nich nie wystarczy. Zamiast tego lubi\u0119 my\u015ble\u0107 o nich nieco bardziej abstrakcyjnie, przynajmniej je\u015bli chodzi o oprogramowanie.<\/p>\n<p>Na potrzeby tego posta za\u0142\u00f3\u017cmy, \u017ce WordPress jest serwerem proxy dla \u017c\u0105dania, co oznacza, \u017ce \u200b\u200bodpowiada za po\u015bredniczenie mi\u0119dzy pocz\u0105tkiem \u017c\u0105dania a odpowiedzi\u0105 na nie.<\/p>\n<p>W skr\u00f3cie,<\/p>\n<blockquote>\n<p>WordPress s\u0142u\u017cy jako proxy, kieruj\u0105c \u017c\u0105danie do innej us\u0142ugi i przechwytuj\u0105c jej odpowied\u017a.<\/p>\n<\/blockquote>\n<p>Mo\u017ce s\u0142ysza\u0142e\u015b co\u015b podobnego, a mo\u017ce nie. Niezale\u017cnie od tego tak mog\u0142oby wygl\u0105da\u0107 na wysokim poziomie:<\/p>\n<p>Teraz, gdy musisz wykona\u0107 \u017c\u0105danie asynchroniczne (lub \u017c\u0105danie Ajax, jak b\u0119d\u0119 u\u017cywa\u0142 w dalszej cz\u0119\u015bci tego postu), masz jedn\u0105 z dw\u00f3ch opcji:<\/p>\n<ol>\n<li>skierowa\u0107 \u017c\u0105danie do strony istniej\u0105cej w WordPressie,<\/li>\n<li>prze\u015blij \u017c\u0105danie do strony, kt\u00f3ra istnieje w innej domenie.<\/li>\n<\/ol>\n<p>Je\u015bli wysy\u0142asz \u017c\u0105dania do stron, kt\u00f3re istniej\u0105 w Twojej aplikacji (czytaj: w WordPress), nie b\u0119dziesz mie\u0107 problemu.<\/p>\n<h3>O bezpiecze\u0144stwie wniosk\u00f3w<\/h3>\n<p>Ale wysy\u0142anie \u017c\u0105da\u0144 Ajax poza w\u0142asn\u0105 domen\u0105 nie jest mo\u017cliwe. Dzieje si\u0119 tak, poniewa\u017c ma chroni\u0107 <a href=\"https:\/\/www.owasp.org\/index.php\/Cross-site_Scripting_(XSS)\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">XSS<\/a> i <a href=\"https:\/\/www.owasp.org\/index.php\/Cross-Site_Request_Forgery_(CSRF)\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CSRF<\/a>.<\/p>\n<p>W skr\u00f3cie, ka\u017cdy z nich odnosi si\u0119 odpowiednio do:<\/p>\n<blockquote>\n<p>Ataki XSS wyst\u0119puj\u0105, gdy atakuj\u0105cy u\u017cywa aplikacji internetowej do wys\u0142ania z\u0142o\u015bliwego kodu, zazwyczaj w postaci skryptu po stronie przegl\u0105darki, do innego u\u017cytkownika ko\u0144cowego<\/p>\n<\/blockquote>\n<p>oraz:<\/p>\n<blockquote>\n<p>Cross-Site Request Forgery (CSRF) to atak, kt\u00f3ry wymusza na u\u017cytkowniku ko\u0144cowym wykonanie niechcianych akcji w aplikacji sieci Web, w kt\u00f3rej jest on aktualnie uwierzytelniony.<\/p>\n<\/blockquote>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, musimy u\u017cywa\u0107 WordPressa jako proxy. Naturalnie jednak rodzi si\u0119 pytanie, w jaki spos\u00f3b?<\/p>\n<h3>Korzystanie z WordPressa jako proxy<\/h3>\n<p>Aby to zrobi\u0107, potrzebujesz kilku rzeczy:<\/p>\n<ol>\n<li>\u00a0stron\u0119, kt\u00f3r\u0105 mo\u017ce wys\u0142a\u0107 zapytanie Ajax,<\/li>\n<li>funkcja do przechwycenia \u017c\u0105dania ajax i wys\u0142ania go pod w\u0142a\u015bciwy adres URL,<\/li>\n<li>spos\u00f3b na przetworzenie odpowiedzi przez stron\u0119 serwera,<\/li>\n<li>funkcja zwracaj\u0105ca dane do oryginalnej funkcji Ajax.<\/li>\n<\/ol>\n<p>Znowu, ze wzgl\u0119du na miejsce, nie podam szczeg\u00f3\u0142owego przyk\u0142adu tego, ale to powinno wystarczy\u0107, aby zacz\u0105\u0107.<\/p>\n<p>Po pierwsze, musisz upewni\u0107 si\u0119, \u017ce masz ustawion\u0105 funkcj\u0119 do przechwycenia twojego \u017c\u0105dania Ajax. W Kodeksie jest ju\u017c mn\u00f3stwo dokumentacji na ten temat. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/833c1d1819b8863697aea00a716b2116#file-01_get_columns-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Prosty przyk\u0142ad<\/a> wygl\u0105da\u0142by tak:<\/p>\n<pre><code>var _get_columns = function() {\n\n    \/\/ Don't forget to use a nonce or security value here.\n    var data = {\n        'action':   'get_all_columns'\n            'security': '&lt;?php echo wp_create_nonce( \"acme-security-ajax-nonce\" ); ?&gt;'\n    };\n\n    \/\/ TODO Check for error logging if the response value doesn't exist.\n    $.get( ajaxurl, data, function( response) {\n\n        response = $.parseJSON( response );\n        \/\/ Your custom functionality here\n    });\n};\n<\/code><\/pre>\n<p>Nast\u0119pnie potrzebujesz strony na serwerze, aby wys\u0142a\u0107 \u017c\u0105danie do adresu URL zawieraj\u0105cego Twoje dane. Mo\u017cna to zrobi\u0107 za pomoc\u0105 <a href=\"https:\/\/curl.haxx.se\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cURL<\/a>, mo\u017cna to zrobi\u0107 za pomoc\u0105 <a href=\"https:\/\/php.net\/manual\/en\/function.file-get-contents.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">file_get_contents<\/a>, a mo\u017cna to zrobi\u0107 w inny spos\u00f3b.<\/p>\n<p>Poniewa\u017c nie wiem i nie chc\u0119 poda\u0107 nakazowego przyk\u0142adu, podziel\u0119 si\u0119 bardzo prostym demo, jak to mo\u017ce dzia\u0142a\u0107 (<a href=\"https:\/\/gist.github.com\/tommcfarlin\/833c1d1819b8863697aea00a716b2116#file-02-wp_ajax_get_all_data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przynajmniej na wczesnych etapach<\/a> ):<\/p>\n<pre><code>&lt;?php\n\nadd_action( 'wp_ajax_get_all_data', 'get_all_data' );\n\/**\n * Retrieves the requested data from the specified URL \n * returns the values in JSON.\n *\/\nfunction get_all_data() {\n\n  \/\/ Note $url is up to you.\n  $curl = curl_init( $url );\n\n  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );                         \n  curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY );                    \n  curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );                          \n  curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );                           \n\n  $response     = curl_exec( $curl );                                          \n  $resultStatus = curl_getinfo( $curl );                                   \n\n  if( 200 !== $resultStatus['http_code']) {\n    echo 'Call Failed '.print_r( $result_status );                         \n  }\n  curl_close( $curl );\n\n  echo json_encode( utf8_encode( $response) ); \n  wp_die();\n}\n<\/code><\/pre>\n<p>Po otrzymaniu odpowiedzi mo\u017cesz zdecydowa\u0107 si\u0119 na jej przeanalizowanie po stronie serwera (co polecam) i zwr\u00f3ci\u0107 j\u0105 przy u\u017cyciu lekkiego formatu do oryginalnej funkcji JavaScript, jak pokazano powy\u017cej. Zauwa\u017c, \u017ce w powy\u017cszym kodzie u\u017cywam <a href=\"https:\/\/php.net\/manual\/en\/function.json-encode.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">json_encode .<\/a><\/p>\n<p>Stamt\u0105d mo\u017cesz zrobi\u0107 wszystko, co musisz zrobi\u0107 na danej stronie, korzystaj\u0105c z posiadanych danych. Zwr\u00f3\u0107 uwag\u0119, \u017ce informacje s\u0105 zawarte w obiekcie odpowiedzi i mo\u017ce by\u0107 konieczne sprawdzenie, co zawiera, aby prawid\u0142owo je obs\u0142u\u017cy\u0107. Jest to realizowane i demonstrowane w powy\u017cszym kodzie.<\/p>\n<p>Ale szczeg\u00f3\u0142y tego b\u0119d\u0105 w du\u017cej mierze zale\u017ce\u0107 od tego, co chcesz osi\u0105gn\u0105\u0107.<\/p>\n<h2>WordPress jako proxy<\/h2>\n<p>Ostatecznie przep\u0142yw kontroli wygl\u0105da mniej wi\u0119cej tak:<\/p>\n<p>Celem powy\u017cszego jest zapewnienie nieco t\u0142a, dlaczego mo\u017cesz zobaczy\u0107 cz\u0119\u015b\u0107 kodu, kt\u00f3ry wykonujesz, a tak\u017ce dlaczego musisz ustrukturyzowa\u0107 sw\u00f3j kod w ten spos\u00f3b.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wi\u0119c co to znaczy u\u017cywa\u0107 WordPressa jako proxy za ka\u017cdym razem, gdy pracujesz z \u017c\u0105daniami Ajax? Sprawd\u017a te przyk\u0142ady.<\/p>\n","protected":false},"author":1,"featured_media":223885,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,845,866],"tags":[1169],"class_list":["post-228709","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228709"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228709\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223885"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}