{"id":229972,"date":"2022-12-01T15:53:00","date_gmt":"2022-12-01T12:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229972"},"modified":"2022-11-09T19:31:52","modified_gmt":"2022-11-09T16:31:52","slug":"oczyszczanie-adresow-url-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/oczyszczanie-adresow-url-w-wordpress\/","title":{"rendered":"Oczyszczanie adres\u00f3w URL w WordPress"},"content":{"rendered":"\n<p>Praca z polami zorientowanymi na u\u017cytkownika w WordPress \u2013 takimi jak <code>input<\/code>elementy, <code>textarea<\/code>elementy lub dowolny rodzaj pola, w kt\u00f3rym u\u017cytkownik mo\u017ce poda\u0107 w\u0142asne warto\u015bci, to miejsce, kt\u00f3re zawsze powinno by\u0107 celem sanityzacji.<\/p>\n<p>Na szcz\u0119\u015bcie API WordPressa zapewnia <strong><a href=\"https:\/\/codex.wordpress.org\/Validating_Sanitizing_and_Escaping_User_Data\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">szereg funkcji<\/a><\/strong>, kt\u00f3re mog\u0105 w tym pom\u00f3c. W zale\u017cno\u015bci od przypadku u\u017cycia mo\u017ce by\u0107 konieczne wykonanie jednej z nast\u0119puj\u0105cych czynno\u015bci:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/sanitize_text_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sanitize_text_field<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/esc_url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esc_url<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/sanitize_textarea_field\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sanitize_textarea_field<\/a><\/li>\n<li>lub <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/formatting.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wi\u0119cej<\/a><\/strong><\/li>\n<\/ul>\n<p>I to wszystko jest dobre i dobre, ale s\u0105 te\u017c sposoby, w jakie mo\u017cesz pracowa\u0107 nad oczyszczaniem danych za pomoc\u0105 funkcji dostarczanych przez PHP.<\/p>\n<p>Jasne, czasami wyra\u017cenia regularne s\u0105 dobrym rozwi\u0105zaniem, ale innym razem mo\u017cesz chcie\u0107 u\u017cy\u0107 funkcji wbudowanych w j\u0119zyk, \u0142atwiejszych do zrozumienia i \u0142atwiejszych do na\u015bladowania.<\/p>\n<p>Pisz\u0105c w\u0142asny kod (i recenzuj\u0105c inne) staram si\u0119 o tym pami\u0119ta\u0107. Maj\u0105c to na uwadze, oto proces, kt\u00f3rego mo\u017cesz u\u017cy\u0107, kt\u00f3ry mo\u017ce u\u0142atwi\u0107 Ci prac\u0119 z adresami URL w WordPress.<\/p>\n<p>Je\u015bli nie masz ochoty na pe\u0142n\u0105 dyskusj\u0119 na ten temat, mo\u017cesz przej\u015b\u0107 do nag\u0142\u00f3wka na dole postu, kt\u00f3ry przedstawia kod i spos\u00f3b jego wykorzystania w pracy.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce masz otwarty <code>input<\/code>element i chcesz zezwoli\u0107 u\u017cytkownikowi na podanie adresu URL, kt\u00f3ry ostatecznie zostanie wyrenderowany w interfejsie u\u017cytkownika, by\u0107 mo\u017ce w postaci linku, w jakim\u015b schemacie lub po prostu bez zmian.<\/p>\n<p>Mo\u017cna by\u0107 naprawd\u0119 agresywnym i po prostu zrobi\u0107 co\u015b w stylu \u201eJe\u015bli to nie jest prawid\u0142owy adres URL, nie zapisuj go&quot;.<\/p>\n<p>I, \u017ceby by\u0142o jasne, nie m\u00f3wi\u0119, \u017ce prawid\u0142owy adres URL nie zwraca b\u0142\u0119du 404 (poniewa\u017c czasami strony istniej\u0105, a lata p\u00f3\u017aniej nie). Prawid\u0142owy adres URL definiuj\u0119 jako taki, kt\u00f3ry jest poprawnie sformatowany i nie zawiera \u017cadnych zb\u0119dnych informacji.<\/p>\n<p>Powiedzmy, \u017ce dla tego prostego przyk\u0142adu oferujesz pole tekstowe, kt\u00f3re ostatecznie zostanie zapisane w tabeli metadanych postu. Co wi\u0119cej, usuniesz wszystko, co jest nielegalne w adresie URL, i pozostawisz tylko to, co utworzy poprawny adres URL.<\/p>\n<p>W tym celu najbardziej przydatne s\u0105 dla mnie nast\u0119puj\u0105ce funkcje:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strip-tags.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">paski_tags<\/a>. Usu\u0144 tagi HTML i PHP z ci\u0105gu.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">paski uko\u015bniki<\/a>. Usuwa cudzys\u0142owy ci\u0105g w cudzys\u0142owie.<\/li>\n<li><a href=\"https:\/\/secure.php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">filtr_zmienna<\/a>. Filtruje zmienn\u0105 z okre\u015blonym filtrem.<\/li>\n<\/ul>\n<p>To ostatnie brzmi troch\u0119 myl\u0105ce, poniewa\u017c opiera si\u0119 na za\u0142o\u017ceniu, \u017ce rozumiesz, czym w\u0142a\u015bciwie s\u0105 filtry. W PHP filtry mo\u017cna podzieli\u0107 na dwa przypadki u\u017cycia:<\/p>\n<ol>\n<li>Walidacja<\/li>\n<li>Sanityzacja<\/li>\n<\/ol>\n<p>S\u0105 to w zasadzie gotowe sposoby przetwarzania danych w taki spos\u00f3b, aby przetwarza\u0107 dane w celu okre\u015blenia, czy jest to typ informacji, zwykle \u0142a\u0144cuch lub tablica, kt\u00f3rej szukamy.<\/p>\n<h3>Oddanie go do pracy<\/h3>\n<p>Maj\u0105c to na uwadze, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-00-saving-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oto jak mo\u017cesz spr\u00f3bowa\u0107<\/a><\/strong> zapisa\u0107 informacje w bazie danych bez \u017cadnego rodzaju sanityzacji (co jest z\u0142e):<\/p>\n<pre><code>&lt;?php\n$data['url'] = 'https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;';\n<\/code><\/pre>\n<p>Za pomoc\u0105 powy\u017cszego kodu u\u017cytkownik mo\u017ce dos\u0142ownie wpisa\u0107 wszystko w pole i zapisa\u0107 to w bazie danych. W\u0142a\u015bnie dlatego sanityzacja jest wa\u017cna. Bez tego u\u017cytkownik mo\u017ce sia\u0107 spustoszenie w do\u015bwiadczeniu u\u017cytkownika lub ca\u0142ej instalacji WordPressa.<\/p>\n<p>Jak wi\u0119c wygl\u0105da zastosowanie powy\u017cszego kodu podczas oczyszczania adres\u00f3w URL? Generalnie <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-01-serializing-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wygl\u0105da to tak<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\nif (!isset($data['url']) {\n   return '';\n}\n\n$url = $data['url'];\n$data['url'] = strip_tags(\n  stripslashes(\n    filter_var($url, FILTER_VALIDATE_URL)) );\n<\/code><\/pre>\n<p>Najpierw kod jest uruchamiany przez filtr PHP, kt\u00f3ry sprawdza poprawno\u015b\u0107 adresu URL. Je\u015bli ci\u0105g przekazany do funkcji filtruj\u0105cej nie dzia\u0142a nawet jako adres URL, funkcja zwr\u00f3ci <code>false<\/code>.<\/p>\n<p>Z drugiej strony, je\u015bli dzia\u0142a jako prawid\u0142owy adres URL, mo\u017cemy usun\u0105\u0107 wszelkie niepotrzebne uko\u015bniki. Oznacza to, \u017ce mo\u017cemy \u201eusun\u0105\u0107 cudzys\u0142\u00f3w z dowolnych ci\u0105g\u00f3w w cudzys\u0142owie&#8221;. Dok\u0142adniej, spowoduje to usuni\u0119cie pierwszego kolejnego uko\u015bnika odwrotnego (poniewa\u017c w PHP uko\u015bniki odwrotne s\u0105 u\u017cywane do ucieczki przed uko\u015bnikiem odwrotnym). Jasne?<\/p>\n<p>Na koniec decydujemy si\u0119 usun\u0105\u0107 tagi, poniewa\u017c chcemy tylko samego adresu URL. Nie chcemy \u017cadnych znacznik\u00f3w, tag\u00f3w ani niczego, co mog\u0142oby sabotowa\u0107 dane zapisywane do bazy danych. Oznacza to, \u017ce je\u015bli zdecydujesz si\u0119 uruchomi\u0107 co\u015b takiego:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;<\/code><\/pre>\n<p>Pozostanie ci:<\/p>\n<pre><code>\"https:\/\/tommcfarlin.com\/alert('hello world!');\"<\/code><\/pre>\n<p>Tak wi\u0119c sk\u0142adaj\u0105c ca\u0142y powy\u017cszy kod razem za pomoc\u0105 tego ci\u0105gu:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;'<\/code><\/pre>\n<p>Wynikiem b\u0119dzie nast\u0119puj\u0105cy wynik:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/alert('hello world!');<\/code><\/pre>\n<p>Oczywi\u015bcie nie jest to prawid\u0142owy adres URL, ale jest czysty, bezpieczny i umo\u017cliwia wykonanie wszelkich innych czynno\u015bci, kt\u00f3re mog\u0105 by\u0107 konieczne do sprawdzenia, czy adres URL jest bezpieczny dla u\u017cytkownika.<\/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>Trzy funkcje, kt\u00f3rych mo\u017cesz u\u017cy\u0107 w po\u0142\u0105czeniu ze sob\u0105, aby odpowiednio oczy\u015bci\u0107 adresy URL w WordPressie przed zapisaniem ich w bazie danych.<\/p>\n","protected":false},"author":1,"featured_media":163470,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,805,845,866],"tags":[1169],"class_list":["post-229972","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-php-7","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229972","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=229972"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229972\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/163470"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}