{"id":229815,"date":"2022-11-04T10:44:00","date_gmt":"2022-11-04T07:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229815"},"modified":"2022-11-09T16:30:13","modified_gmt":"2022-11-09T13:30:13","slug":"invio-di-richieste-ajax-sicure-in-wordpress-con-nonces","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/invio-di-richieste-ajax-sicure-in-wordpress-con-nonces\/","title":{"rendered":"Invio di richieste Ajax sicure in WordPress (con Nonces)"},"content":{"rendered":"\n<p>So che l&#8217; <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API REST<\/a> \u00e8 un enorme argomento di conversazione in WordPress in questo momento, e giustamente, ma ci sono ancora momenti in cui dobbiamo usare <a href=\"https:\/\/codex.wordpress.org\/AJAX_in_Plugins\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">admin-ajax<\/a> (come sta per essere conosciuto) per una serie di motivi.<\/p>\n<ul>\n<li>Forse \u00e8 un&#8217;applicazione,<\/li>\n<li>Forse il tempo non consente di creare gli endpoint necessari,<\/li>\n<li>Forse sei pi\u00f9 a tuo agio con admin-ajax,<\/li>\n<li>E cos\u00ec via.<\/li>\n<\/ul>\n<p>Indipendentemente dai motivi per cui lo usi (cosa che faccio ancora, per qualsiasi cosa funzioni), penso che sia importante assicurarci di inviare richieste Ajax sicure in WordPress usando nonce proprio come faresti se stessi inviando i dati dei moduli tradizionali .<\/p>\n<p>Legittima ripresa dal vivo dei cavi che trasportano la tua richiesta dell&#8217;Ajax.<\/p>\n<p>Se cerchi sul Web risultati su come farlo, otterrai una variet\u00e0 di risposte e questa sar\u00e0 solo un&#8217;altra goccia nel proverbiale secchio.<\/p>\n<p>Ma se sei curioso di una ricetta su come gestirlo, ecco come lo faccio ogni volta.<\/p>\n<h2>Richieste Ajax sicure in WordPress<\/h2>\n<p>Il processo per l&#8217;invio di richieste Ajax sicure per WordPress segue questa procedura:<\/p>\n<ol>\n<li>accoda il tuo file JavaScript e usa <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_localize_script\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_localize_script<\/a> ,<\/li>\n<li>assicurati che il tuo JavaScript stia inviando il nonce di sicurezza,<\/li>\n<li>controlla il valore di sicurezza nella tua richiamata e gestiscilo in modo appropriato.<\/li>\n<\/ol>\n<p>Detto questo, ecco alcuni suggerimenti per ciascuno dei precedenti che, si spera, ti portino a scrivere un codice basato su Ajax pi\u00f9 sicuro.<\/p>\n<h3>1 Accoda JavaScript, Localizza il tuo script<\/h3>\n<p>So che questo sembra un primo passo strano considerando che dovresti scriverlo prima di metterlo in coda. E dovresti, ovviamente. Ma per questo post, volevo mostrare il codice necessario prima di saltare nei dettagli.<\/p>\n<p>Ci sono alcuni modi in cui le persone scelgono di accodare admin-ajax.php, ma <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a53a5c982b9e6826369e2f37914ad77b#file-00-wp-localize-script-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo \u00e8 il processo<\/a> che seguo sia per accodare il mio file che per aggiungere admin-ajax.php:<\/p>\n<pre><code>&lt;?php\n\nwp_enqueue_script(\n  'acme-security',\n  $this-&gt;plugin_url. 'assets\/js\/plugin.js',\n  [ 'jquery' ],\n  false,\n  true\n);\n\nwp_localize_script(\n  'acme-security',\n  'acme_ajax_object',\n  [\n    'ajax_url'  =&gt; admin_url( 'admin-ajax.php' ),\n    'security'  =&gt; wp_create_nonce( 'acme-security-nonce' ),\n  ]\n);<\/code><\/pre>\n<p>Nota nel codice sopra, la chiamata a <a href=\"https:\/\/www.google.com\/url?sa=t&#038;rct=j&#038;q=&#038;esrc=s&#038;source=web&#038;cd=1&#038;ved=0ahUKEwjA9NijppDUAhVIWSYKHTzDAVYQFggnMAA&#038;url=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_enqueue_script%2F&#038;usg=AFQjCNEAqOC2ehwxSG7UntToWhDVHXLVUA&#038;sig2=7VfQ0cL4-Pt1e8oV0mDKRg&#038;cad=rjt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_enqueue_script<\/a> appare esattamente come ti aspetteresti.<\/p>\n<p>Ma <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_localize_script\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_localize_script<\/a> \u00e8 leggermente diverso. Ecco cosa sta facendo:<\/p>\n<ol>\n<li>Segue la call to enqueue script (e l&#8217;ordine conta),<\/li>\n<li>utilizza lo stesso identificatore, ovvero <strong>acme-security<\/strong> ,<\/li>\n<li>Definisce un oggetto che possiamo usare nel nostro codice JavaScript chiamato <strong>acme_ajax_object<\/strong> e definisce due propriet\u00e0.<\/li>\n<li>La\u00a0 propriet\u00e0 <strong>ajax_url<\/strong> mantiene il percorso di admin-ajax.php.<\/li>\n<li>La\u00a0 propriet\u00e0 <strong>security<\/strong> mantiene un valore restituito da <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_create_nonce\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_create_nonce<\/a>.<\/li>\n<\/ol>\n<p>Quindi, come possiamo sfruttare tutto questo nel contesto del nostro JavaScript?<\/p>\n<h3>2 Utilizzo di queste informazioni in JavaScript<\/h3>\n<p>Innanzitutto, quando si effettua una chiamata Ajax, dobbiamo assicurarci di utilizzare la\u00a0 propriet\u00e0 <strong>ajax_url<\/strong> dell&#8217;oggetto che abbiamo definito nel codice sopra. Cio\u00e8, l&#8217;URL della richiesta deve essere inviato a <strong>acme_ajax_object.ajax_url<\/strong>.<\/p>\n<p>Quindi definisci la funzione che vuoi chiamare. In questo caso, \u00e8 <strong>get_custom_date<\/strong> che esamineremo tra poco.<\/p>\n<p>Ma la parte pi\u00f9 importante viene dopo: ci assicuriamo di inviare un valore di sicurezza che \u00e8 mantenuto dalla propriet\u00e0 di <strong>sicurezza di<\/strong> <strong>acme_ajax_object<\/strong>.<\/p>\n<pre><code>$.get( acme_ajax_object.ajax_url, {\n\n    action:   'get_custom_data',\n    security: acme_ajax_object.security\n\n}, function( response) {\n\n  if (undefined !== response.success &amp;&amp; false === response.success) {\n    return;\n  }\n\n  \/\/ Parse your response here.\n\n});<\/code><\/pre>\n<p>Si noti che nella funzione di risposta, controlliamo che la risposta abbia esito positivo, la gestiamo in modo appropriato e quindi andiamo avanti con il nostro codice.<\/p>\n<p>Quindi, come appare il codice lato server per questo?<\/p>\n<h3>3 Verifica della sicurezza<\/h3>\n<p>Successivamente, nella tua funzione di callback (che abbiamo opportunamente chiamato <strong>get_custom_data<\/strong>, dobbiamo prima controllare il valore di sicurezza prima di fare qualsiasi altra cosa.<\/p>\n<p>Se il valore passa, siamo a posto; in caso contrario, dobbiamo inviare un errore.<\/p>\n<pre><code>&lt;?php\n\npublic function get_custom_data() {\n\n  if (! check_ajax_referer( 'acme-security-nonce', 'security', false)) {\n\n    wp_send_json_error( 'Invalid security token sent.' );\n    wp_die();\n  }\n\n  \/\/ The rest of the function that does actual work.\n\n}<\/code><\/pre>\n<p>Si noti che quando chiamiamo <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/check_ajax_referer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">check_ajax_referer<\/a>, utilizziamo la chiave del valore definito in wp_create_nonce e il nome della propriet\u00e0 dell&#8217;oggetto che abbiamo definito nel primo passaggio.<\/p>\n<p>Se non viene verificato, inviamo un errore JSON che possiamo leggere in JavaScript come abbiamo visto sopra. Questo dovrebbe sempre essere il primo passo prima di fare il lavoro vero e proprio.<\/p>\n<p>Se tutto \u00e8 a posto, siamo a posto.<\/p>\n<h2>\u00c8 davvero sicuro?<\/h2>\n<p>Questa \u00e8 la domanda inevitabile, vero? Ad essere onesti, non voglio promettere che questo sia completamente infallibile perch\u00e9 non sono un esperto di sicurezza.<\/p>\n<p>Ma avere un valore nonce che sfrutter\u00e0 le funzioni di sicurezza integrate di WordPress \u00e8 meglio che inviare dati alla cieca senza alcun modo per verificare l&#8217;origine di ci\u00f2 che viene inviato.<\/p>\n<p>Naturalmente occorre anche sanificare i dati prima di interrogarli, utilizzarli, salvarli eventualmente e cos\u00ec via. Ma questo \u00e8 il contenuto di un altro post.<\/p>\n<p>Questo, invece, fornisce una ricetta per assicurarti di inviare richieste Ajax sicure in WordPress.<\/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>I tre passaggi descritti qui forniscono una ricetta per assicurarti di inviare richieste Ajax sicure in WordPress.<\/p>\n","protected":false},"author":1,"featured_media":166665,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,720,865],"tags":[1168],"class_list":["post-229815","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229815","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=229815"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229815\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/166665"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}