{"id":230370,"date":"2022-12-09T11:15:00","date_gmt":"2022-12-09T08:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230370"},"modified":"2022-12-07T11:58:55","modified_gmt":"2022-12-07T08:58:55","slug":"saeker-wordpress-formulaerinlaemning","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/saeker-wordpress-formulaerinlaemning\/","title":{"rendered":"S\u00e4ker WordPress-formul\u00e4rinl\u00e4mning"},"content":{"rendered":"\n<p>F\u00f6r flera \u00e5r sedan skrev jag ett inl\u00e4gg d\u00e4r jag delade en offentlig funktion f\u00f6r att avg\u00f6ra om anv\u00e4ndaren hade beh\u00f6righet att spara information i WordPress-databasen. Du kan se den ursprungliga k\u00e4rnan i all sin \u00e5ldrade h\u00e4rlighet (tillsammans med de solida kommentarerna) <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/4468321\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r<\/a><\/strong> (det \u00e4r fem \u00e5r gammalt, till och med \u2013 wow).<\/p>\n<p>Som med allt relaterat till programmering g\u00e5r tiden, saker f\u00f6rfinas och saker blir [f\u00f6rhoppningsvis] b\u00e4ttre \u00e4n de var tidigare.<\/p>\n<p>\u00c4ven om jag fortfarande anv\u00e4nder och rekommenderar en variant av <strong>funktionen user_can_save<\/strong> (eller <strong>userCanSave<\/strong> ), tycker jag ocks\u00e5 att det \u00e4r viktigt att g\u00e5 igenom processen f\u00f6r att separera processen f\u00f6r att verifiera beg\u00e4ran.<\/p>\n<p>S\u00e5 nu handlar det inte bara om att avg\u00f6ra om anv\u00e4ndaren har beh\u00f6righeter, utan det handlar om att verifiera s\u00e4kerhetsinformationen som kommer fr\u00e5n klienten \u2013 vare sig det \u00e4r via ett inl\u00e4gg tillbaka till servern eller en f\u00f6rfr\u00e5gan gjord via Ajax \u2013 och att g\u00f6ra det med hj\u00e4lp av bra programmeringstekniker som passar ihop b\u00e5de med WordPress och med PHP.<\/p>\n<p>F\u00f6r att vara tydlig handlar det h\u00e4r mer om s\u00e4ker inl\u00e4mning av WordPress-formul\u00e4r fr\u00e5n en alternativsida eller en inst\u00e4llningssida \u00e4n om det till exempel \u00e4r ett formul\u00e4r som kommer fr\u00e5n en mall. Det \u00e4r ett annat inl\u00e4gg f\u00f6r en annan g\u00e5ng.<\/p>\n<p>Men \u00e4nd\u00e5 \u00e4r vi m\u00e5nga som jobbar med att bygga applikationer p\u00e5 WordPress och som kr\u00e4ver f\u00f6ljande.<\/p>\n<h2>S\u00e4ker WordPress-formul\u00e4rinl\u00e4mning<\/h2>\n<p>I det h\u00e4r inl\u00e4gget t\u00e4nker jag inte bry mig om att g\u00e5 igenom detaljerna f\u00f6r att avg\u00f6ra om n\u00e5got \u00e4r en <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_is_post_autosave\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">autospara<\/a><\/strong> eller en postrevision <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_is_post_revision\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">.<\/a><\/strong><\/p>\n<\/p>\n<p>Jag kommer dock att g\u00e5 igenom processen att ta en funktion som \u00e4r ansvarig f\u00f6r att validera inkommande information och g\u00f6ra det med ett modernt tillv\u00e4gag\u00e5ngss\u00e4tt med hj\u00e4lp av objektorienterade metoder och b\u00e5de WordPress API:er och PHP-funktioner.<\/p>\n<h3>1 B\u00f6rjar p\u00e5 en allm\u00e4n niv\u00e5<\/h3>\n<p>Fr\u00e5n grundniv\u00e5n, l\u00e5t oss anta att det finns en basklass fr\u00e5n vilken det finns andra underklasser som utnyttjar denna funktion. Detta talar om f\u00f6r oss att vi m\u00e5ste anv\u00e4nda den skyddade synlighetsmodifieraren.<\/p>\n<p>Vi vet ocks\u00e5 att vi kommer att ha att g\u00f6ra med ett WordPress nonce-v\u00e4rde och en relaterad \u00e5tg\u00e4rd. Detta betyder att <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-00-function-signature-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funktionens signatur kommer att se ut ungef\u00e4r s\u00e5 h\u00e4r<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nprotected function verifyRequest($nonce, $action);<\/code><\/pre>\n<h3>2 Rensa data, verifiera nonce<\/h3>\n<p>Som per allt som l\u00e4ggs upp p\u00e5 servern vet vi att vi kommer att beh\u00f6va verifiera att data \u00e4r inst\u00e4llda och i s\u00e5 fall kommer vi att beh\u00f6va sanera informationen.<\/p>\n<p>Det betyder att vi kommer att beh\u00f6va f\u00f6ljande funktioner:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.isset.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">isset<\/a><\/li>\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><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">streckstreck<\/a><\/strong><\/li>\n<\/ul>\n<p>Och vi vet ocks\u00e5 att vi kommer att beh\u00f6va verifiera nonce, s\u00e5 vi kommer ocks\u00e5 att beh\u00f6va <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_verify_nonce\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_verify_nonce<\/a><\/strong>.<\/p>\n<h3>3 A Working First Pass<\/h3>\n<p>Ett fungerande f\u00f6rsta pass av den h\u00e4r funktionen kan se ut ungef\u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-00-verify-request-1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nprotected function verifyRequest($nonce, $action)\n{\n    return isset($_GET[$nonce]) &amp;&amp;\n           wp_verify_nonce(strip_tags(stripslashes($_GET[$nonce])), $action);\n}\n<\/code><\/pre>\n<p>Men vad h\u00e4nder om n\u00e5gon delar data som har skickat en <strong>POST<\/strong> &#8211; beg\u00e4ran (mot en <strong>GET<\/strong> )-beg\u00e4ran? Sedan kan vi \u00e4ndra funktionen s\u00e5 att den ser <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-02-verify-request-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nprotected function verifyRequest($nonce, $action)\n{\n    return (isset($_GET[$nonce]) &amp;&amp;\n            wp_verify_nonce(strip_tags(stripslashes($_GET[$nonce])), $action)) || (isset($_POST[$nonce]) &amp;&amp;\n            wp_verify_nonce(strip_tags(stripslashes($_POST[$nonce])), $action)\n        );\n}\n<\/code><\/pre>\n<p>Och detta skulle vara tillr\u00e4ckligt. Men om vi verkligen vill att en given funktion ska vara s\u00e5 ren som m\u00f6jligt, s\u00e5 skulle vi kunna bryta upp detta ytterligare.<\/p>\n<h3>4 En funktion f\u00f6r varje \u00e4ndam\u00e5l<\/h3>\n<p>Med tanke p\u00e5 koden ovan vet vi att vi m\u00e5ste hantera b\u00e5de GET-f\u00f6rfr\u00e5gningar och POST-f\u00f6rfr\u00e5gningar. PHP erbjuder en <strong>filter_input-<\/strong> funktion som \u00e4r anv\u00e4ndbar, l\u00e4ttare att l\u00e4sa (ja, detta \u00e4r subjektivt), men som ocks\u00e5 klarar flera kodkvalitetsinspektioner.<\/p>\n<p>Dessutom kan vi anv\u00e4nda en <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Factory_method_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">enkel fabriksliknande<\/a><\/strong> funktion f\u00f6r att separera logiken till att separera funktioner s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162230-61e73927a6ca8.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162230-61e73927a6ca8.png\" alt=\"S\u00e4ker WordPress-formul\u00e4rinl\u00e4mning\" ><\/a><\/p>\n<p>F\u00f6rst m\u00e5ste vi skriva tv\u00e5 separata funktioner &#8211; en <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-03-verify-post-request-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r en POST-beg\u00e4ran:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nprivate function verifyPostRequest($nonce, $action)\n{\n    return\n        isset($_POST[$nonce]) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes(filter_input(INPUT_POST, $nonce))), $action);\n}<\/code><\/pre>\n<p>Och en <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-04-verify-get-request-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r en GET-f\u00f6rfr\u00e5gan:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nprivate function verifyGetRequest($nonce, $action)\n{\n    return\n        isset($_GET[$nonce]) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes(filter_input(INPUT_GET, $nonce))), $action);\n}<\/code><\/pre>\n<p>Sedan kan vi knyta ihop det i <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-05-verify-request-factory-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den ursprungliga funktionen s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nprotected function verifyRequest($nonce, $action)\n{\n    switch (strtolower($_SERVER['REQUEST_METHOD'])) {\n        case 'post':\n            return $this-&gt;verifyPostRequest($nonce, $action);\n            break;\n        case 'get':\n            return $this-&gt;verifyGetRequest($nonce, $action);\n            break;\n        default:\n            return false;\n            break;\n    }\n}<\/code><\/pre>\n<h2>Hantera inkommande f\u00f6rfr\u00e5gningar rent<\/h2>\n<p>Kanske ser detta ut som ett komplicerat s\u00e4tt att hantera en enkel l\u00f6sning med tanke p\u00e5 den f\u00f6rsta upps\u00e4ttningen kod som delades.<\/p>\n<p>Det \u00e4r s\u00e4kert m\u00f6jligt, s\u00e4rskilt om du \u00e4r under tidsbegr\u00e4nsning eller inte bryr dig s\u00e5 mycket om att bryta upp saker i minsta m\u00f6jliga atom\u00e4ra (eller till och med testbara) komponenter.<\/p>\n<p>Men om du funderar p\u00e5 att skriva objektorienterad kod med h\u00f6gsta precision, kanske den h\u00e4r processen hj\u00e4lper till med just det.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det h\u00e4r handlar mer om s\u00e4ker WordPress-formul\u00e4rinl\u00e4mning fr\u00e5n en alternativsida eller en inst\u00e4llningssida \u00e4n det \u00e4r, ett formul\u00e4r som kommer fr\u00e5n en mall.<\/p>\n","protected":false},"author":1,"featured_media":236238,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,807,868],"tags":[1173],"class_list":["post-230370","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-php-9","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230370"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230370\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236238"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}