{"id":230650,"date":"2022-12-01T15:33:00","date_gmt":"2022-12-01T12:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230650"},"modified":"2022-11-09T23:22:23","modified_gmt":"2022-11-09T20:22:23","slug":"url-osoitteiden-puhdistaminen-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/url-osoitteiden-puhdistaminen-wordpressissae\/","title":{"rendered":"URL-osoitteiden puhdistaminen WordPressiss\u00e4"},"content":{"rendered":"\n<p>Ty\u00f6skentely WordPressin k\u00e4ytt\u00e4j\u00e4keskeisten kenttien kanssa \u2013 kuten <code>input<\/code>elementtien, <code>textarea<\/code>elementtien tai mink\u00e4 tahansa tyyppisten kenttien kanssa, joihin k\u00e4ytt\u00e4j\u00e4 voi sy\u00f6tt\u00e4\u00e4 omia arvojaan, on aina oltava desinfioinnin kohde.<\/p>\n<p>Onneksi WordPress API tarjoaa <strong><a href=\"https:\/\/codex.wordpress.org\/Validating_Sanitizing_and_Escaping_User_Data\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">useita toimintoja<\/a><\/strong>, jotka auttavat t\u00e4ss\u00e4. K\u00e4ytt\u00f6tapauksestasi riippuen saatat joutua tekem\u00e4\u00e4n jonkin seuraavista:<\/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\">desinfioi_teksti_kentt\u00e4<\/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>tai <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/formatting.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">enemm\u00e4n<\/a><\/strong><\/li>\n<\/ul>\n<p>Ja ne ovat kaikki hyvi\u00e4, mutta on my\u00f6s tapoja, joilla voit ty\u00f6skennell\u00e4 tietojen puhdistamiseksi PHP:n tarjoamien toimintojen avulla.<\/p>\n<p>Toki joskus s\u00e4\u00e4nn\u00f6lliset lausekkeet ovat oikea tapa, mutta toisinaan saatat haluta k\u00e4ytt\u00e4\u00e4 kieleen sis\u00e4\u00e4nrakennettuja, helpommin ymm\u00e4rrett\u00e4vi\u00e4 ja helpompia seurata ominaisuuksia.<\/p>\n<p>Kun kirjoitan omaa koodiani (ja arvostellessani muita) yrit\u00e4n pit\u00e4\u00e4 sen mieless\u00e4. T\u00e4st\u00e4 huolimatta t\u00e4ss\u00e4 on prosessi, jota voit k\u00e4ytt\u00e4\u00e4 ja joka voi helpottaa URL-osoitteiden k\u00e4sittely\u00e4 WordPressiss\u00e4.<\/p>\n<p>Jos et halua k\u00e4yd\u00e4 koko keskustelua t\u00e4st\u00e4, voit hyp\u00e4t\u00e4 viestin alareunassa olevaan otsikkoon, jossa kerrotaan koodista ja sen k\u00e4ytt\u00e4misest\u00e4 ty\u00f6ss\u00e4si.<\/p>\n<p>Oletetaan, ett\u00e4 sinulla on avoin <code>input<\/code>elementti ja haluat antaa k\u00e4ytt\u00e4j\u00e4n tarjota URL-osoitteen, joka lopulta hahmonnetaan k\u00e4ytt\u00f6liittym\u00e4ss\u00e4, ehk\u00e4 linkiss\u00e4, jonkin tyyppisess\u00e4 skeemassa tai yksinkertaisesti sellaisenaan.<\/p>\n<p>On mahdollista olla todella aggressiivinen ja tehd\u00e4 jotain kuten &quot;Jos t\u00e4m\u00e4 ei ole kelvollinen URL-osoite, \u00e4l\u00e4 tallenna sit\u00e4.&quot;<\/p>\n<p>Ja selvyyden vuoksi en v\u00e4it\u00e4, ett\u00e4 kelvollinen URL-osoite ei palauta 404:\u00e4\u00e4 (koska joskus sivuja on olemassa ja vuosia my\u00f6hemmin niit\u00e4 ei). M\u00e4\u00e4rit\u00e4n kelvollisen URL-osoitteen sellaiseksi, joka on muotoiltu oikein ja joka ei sis\u00e4ll\u00e4 ylim\u00e4\u00e4r\u00e4isi\u00e4 tietoja.<\/p>\n<p>Sano siis, ett\u00e4 t\u00e4m\u00e4n yksinkertaisen esimerkin vuoksi tarjoat tekstikent\u00e4n, joka lopulta tallennetaan julkaisun metatietotaulukkoon. Lis\u00e4ksi poistat URL-osoitteesta kaiken laittoman ja j\u00e4t\u00e4t vain sen, mik\u00e4 luo kelvollisen URL-osoitteen.<\/p>\n<p>Mielest\u00e4ni seuraavat toiminnot ovat hy\u00f6dyllisimpi\u00e4 t\u00e4t\u00e4 varten:<\/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\">strip_tags<\/a>. Poista HTML- ja PHP-tunnisteet merkkijonosta.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">viiltoja<\/a>. Poistaa lainausmerkit lainatun merkkijonon.<\/li>\n<li><a href=\"https:\/\/secure.php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">filter_var<\/a>. Suodattaa muuttujan m\u00e4\u00e4ritetyll\u00e4 suodattimella.<\/li>\n<\/ul>\n<p>J\u00e4lkimm\u00e4inen kuulostaa hieman h\u00e4mment\u00e4v\u00e4lt\u00e4, koska se perustuu ajatukseen, ett\u00e4 ymm\u00e4rr\u00e4t, mit\u00e4 suodattimet todellisuudessa ovat. PHP:ss\u00e4 suodattimet voidaan jakaa kahteen k\u00e4ytt\u00f6tapaukseen:<\/p>\n<ol>\n<li>Validointi<\/li>\n<li>Puhdistus<\/li>\n<\/ol>\n<p>Ja ne ovat pohjimmiltaan valmiita tapoja, joilla voimme k\u00e4sitell\u00e4 tietoja siten, ett\u00e4 ne k\u00e4sittelev\u00e4t tietoja sen m\u00e4\u00e4ritt\u00e4miseksi, onko kyseess\u00e4 etsim\u00e4mme tietotyyppi, yleens\u00e4 merkkijono vai taulukko.<\/p>\n<h3>Laittaminen t\u00f6ihin<\/h3>\n<p>T\u00e4ss\u00e4 mieless\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-00-saving-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voit yritt\u00e4\u00e4<\/a><\/strong> tallentaa tietoja tietokantaan ilman mink\u00e4\u00e4nlaista desinfiointia (mik\u00e4 on huono asia):<\/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>Yll\u00e4 olevalla koodilla k\u00e4ytt\u00e4j\u00e4 voi kirjaimellisesti kirjoittaa mit\u00e4 tahansa kentt\u00e4\u00e4n ja tallentaa sen tietokantaan. Siksi desinfiointi on t\u00e4rke\u00e4\u00e4. Ilman sit\u00e4 k\u00e4ytt\u00e4j\u00e4 voi tuhota k\u00e4ytt\u00f6kokemuksen tai koko WordPress-asennuksen.<\/p>\n<p>Milt\u00e4 sitten n\u00e4ytt\u00e4\u00e4 k\u00e4ytt\u00e4\u00e4 koodia ylh\u00e4\u00e4lt\u00e4, kun desinfioidaan URL-osoitteita? Yleisesti ottaen se <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/590bbb593f01fe95ce0b11106e7e86cb#file-01-serializing-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4<\/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>Ensin koodi ajetaan PHP-suodattimen l\u00e4pi, joka vahvistaa URL-osoitteen. Jos suodatinfunktioon v\u00e4litetty merkkijono ei toimi edes URL-osoitteena, funktio palauttaa <code>false<\/code>.<\/p>\n<p>Jos se toisaalta toimii kelvollisena URL-osoitteena, voimme poistaa kaikki tarpeettomat vinoviivat. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 voimme &quot;poistaa lainausmerkityt merkkijonot&quot;. Tarkemmin sanottuna t\u00e4m\u00e4 poistaa ensimm\u00e4isen per\u00e4kk\u00e4isen kenoviivan (koska PHP:ss\u00e4 kenoviivaa k\u00e4ytet\u00e4\u00e4n kenoviivan v\u00e4ltt\u00e4miseen). Asia selv\u00e4? \ud83d\ude42<\/p>\n<p>Lopuksi p\u00e4\u00e4t\u00e4mme poistaa tunnisteet, koska haluamme vain URL-osoitteen. Emme halua mit\u00e4\u00e4n merkint\u00f6j\u00e4, tunnisteita tai mit\u00e4\u00e4n, mik\u00e4 voisi sabotoida tietokantaan kirjoitettavaa tietoa. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 jos p\u00e4\u00e4t\u00e4t suorittaa jotain, kuten:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;<\/code><\/pre>\n<p>Sinulle j\u00e4\u00e4:<\/p>\n<pre><code>\"https:\/\/tommcfarlin.com\/alert('hello world!');\"<\/code><\/pre>\n<p>Joten koota kaikki yll\u00e4 oleva koodi k\u00e4ytt\u00e4m\u00e4ll\u00e4 t\u00e4t\u00e4 merkkijonoa:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/&lt;script type=\"text\/javascript\"&gt;alert('hello world!');&lt;\/script&gt;'<\/code><\/pre>\n<p>Tuloksena on seuraava tulos:<\/p>\n<pre><code>https:\/\/tommcfarlin.com\/alert('hello world!');<\/code><\/pre>\n<p>T\u00e4m\u00e4 ei tietenk\u00e4\u00e4n ole kelvollinen URL-osoite, mutta se on puhdas, turvallinen ja antaa sinun suorittaa kaikki muut toimet, joita saatat tarvita varmistaaksesi, ett\u00e4 URL-osoite on turvallinen k\u00e4ytt\u00e4j\u00e4lle.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kolme toimintoa, joita voit k\u00e4ytt\u00e4\u00e4 yhdess\u00e4 muiden kanssa puhdistaaksesi URL-osoitteet oikein WordPressiss\u00e4 ennen niiden kirjoittamista tietokantaan.<\/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":[895,843,803,864],"tags":[1166],"class_list":["post-230650","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koodi","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230650"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/163470"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}