{"id":231148,"date":"2022-12-09T10:47:00","date_gmt":"2022-12-09T07:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231148"},"modified":"2022-12-07T11:58:50","modified_gmt":"2022-12-07T08:58:50","slug":"invio-sicuro-del-modulo-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/invio-sicuro-del-modulo-wordpress\/","title":{"rendered":"Invio sicuro del modulo WordPress"},"content":{"rendered":"\n<p>Anni fa, ho scritto un post in cui condividevo una funzione pubblica per determinare se l&#8217;utente disponeva delle autorizzazioni per salvare le informazioni nel database di WordPress. Puoi vedere l&#8217;essenza originale in tutta la sua antica gloria (insieme ai commenti solidi) <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/4468321\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qui<\/a><\/strong> (ha anche cinque anni, wow).<\/p>\n<p>Come per qualsiasi cosa relativa alla programmazione, il tempo passa, le cose si perfezionano e [si spera] le cose migliorino di prima.<\/p>\n<p>Sebbene io continui a utilizzare e raccomandare una variante della <strong>funzione user_can_save<\/strong> (o <strong>userCanSave<\/strong> ), penso anche che sia importante seguire il processo di separazione del processo di verifica della richiesta.<\/p>\n<p>Quindi ora non si tratta solo di determinare se l&#8217;utente ha i permessi, ma si tratta di verificare le informazioni di sicurezza provenienti dal client, sia tramite un post sul server o una richiesta effettuata tramite Ajax, e farlo utilizzando buone tecniche di programmazione che si allineano sia con WordPress che con PHP.<\/p>\n<p>Per essere chiari, si tratta pi\u00f9 di un invio sicuro di moduli WordPress da una pagina delle opzioni o da una pagina delle impostazioni che, ad esempio, un modulo proveniente da un modello. Questo \u00e8 un altro post per un&#8217;altra volta.<\/p>\n<p>Tuttavia, ci sono molti di noi che lavorano alla creazione di applicazioni su WordPress e ci\u00f2 richiede quanto segue.<\/p>\n<h2>Invio sicuro del modulo WordPress<\/h2>\n<p>In questo post, non mi preoccuper\u00f2 di esaminare i dettagli per determinare se qualcosa \u00e8 un <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_is_post_autosave\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">salvataggio automatico<\/a><\/strong> o una <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_is_post_revision\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">revisione del post.<\/a><\/strong><\/p>\n<\/p>\n<p>Tuttavia, illustrer\u00f2 il processo di assunzione di una funzione responsabile della convalida delle informazioni in entrata e di farlo utilizzando un approccio moderno utilizzando pratiche orientate agli oggetti e sia le API di WordPress che le funzioni PHP.<\/p>\n<h3>1 A partire da un livello generico<\/h3>\n<p>Dal livello di base, supponiamo che esista una classe base da cui ci sono altre sottoclassi che sfruttano questa funzione. Questo ci dice che dobbiamo usare il modificatore di visibilit\u00e0 protetta.<\/p>\n<p>Sappiamo anche che avremo a che fare con un valore nonce di WordPress e un&#8217;azione correlata. Ci\u00f2 significa che la <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-00-function-signature-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">firma della funzione sar\u00e0 simile a questa<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nprotected function verifyRequest($nonce, $action);<\/code><\/pre>\n<h3>2 Sanifica i dati, verifica il nonce<\/h3>\n<p>Come per tutto ci\u00f2 che viene pubblicato sul server, sappiamo che dovremo verificare che i dati siano impostati e, in tal caso, dovremo disinfettare le informazioni.<\/p>\n<p>Ci\u00f2 significa che avremo bisogno delle seguenti funzioni:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.isset.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e8 impostato<\/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\">strisce<\/a><\/strong><\/li>\n<\/ul>\n<p>E sappiamo anche che avremo bisogno di verificare il nonce, quindi avremo anche bisogno di <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 Un primo passaggio di lavoro<\/h3>\n<p>Un primo passaggio funzionante di questa funzione potrebbe assomigliare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-00-verify-request-1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo:<\/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>Ma cosa succede se qualcuno condivide i dati che hanno inviato una richiesta <strong>POST<\/strong> (rispetto a una richiesta <strong>GET<\/strong> )? Quindi potremmo modificare la funzione in modo che assomigli a qualcosa del <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-02-verify-request-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">genere:<\/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>E questo sarebbe sufficiente. Ma se vogliamo davvero che una determinata funzione sia il pi\u00f9 pura possibile, allora potremmo suddividerla ulteriormente.<\/p>\n<h3>4 Una funzione per ogni scopo<\/h3>\n<p>Dato il codice sopra, sappiamo che dobbiamo gestire sia le richieste GET che le richieste POST. PHP offre una funzione <strong>filter_input<\/strong> che \u00e8 utile, pi\u00f9 facile da leggere (beh, questo \u00e8 soggettivo), ma supera anche diversi controlli sulla qualit\u00e0 del codice.<\/p>\n<p>Inoltre, possiamo usare una <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Factory_method_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">semplice<\/a><\/strong> funzione di fabbrica per separare la logica in funzioni separate come questa:<\/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=\"Invio sicuro del modulo WordPress\" ><\/a><\/p>\n<p>Innanzitutto, dobbiamo scrivere due funzioni separate: una <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-03-verify-post-request-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">per una richiesta POST:<\/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>E uno <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-04-verify-get-request-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">per una richiesta GET:<\/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>Quindi possiamo legarlo insieme nella <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1eac5df600177b7beb423477ccceee6#file-05-verify-request-factory-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funzione originale in questo modo:<\/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>Gestire in modo pulito le richieste in arrivo<\/h2>\n<p>Forse questo sembra un modo complicato per gestire una soluzione semplice dato il set iniziale di codice condiviso.<\/p>\n<p>Questo \u00e8 certamente possibile soprattutto se sei nei limiti del tempo o non ti interessa tanto rompere le cose nei pi\u00f9 piccoli componenti atomici (o anche testabili) possibili.<\/p>\n<p>Ma se stai cercando di scrivere codice orientato agli oggetti con il massimo grado di precisione, forse questo processo ti aiuter\u00e0 esattamente in questo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <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 tratta pi\u00f9 di un invio sicuro di moduli WordPress da una pagina delle opzioni o da una pagina delle impostazioni che da un modulo proveniente da un modello.<\/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":[896,804,844,865],"tags":[1168],"class_list":["post-231148","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231148"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231148\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236238"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}