{"id":2342,"date":"2023-07-05T10:00:00","date_gmt":"2023-07-05T15:00:00","guid":{"rendered":"http:\/\/racmanuel.dev\/?p=2342"},"modified":"2023-06-28T17:58:37","modified_gmt":"2023-06-28T22:58:37","slug":"uso-de-nonces-para-mejorar-la-seguridad-al-programar-un-plugin-en-wordpress","status":"publish","type":"post","link":"https:\/\/racmanuel.dev\/en\/uso-de-nonces-para-mejorar-la-seguridad-al-programar-un-plugin-en-wordpress\/","title":{"rendered":"Using nonces to improve security when programming a WordPress plugin"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"introduccion\">Introducci\u00f3n:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En el desarrollo de plugins de WordPress, una medida de seguridad clave para proteger tu sitio contra ataques malintencionados, como la falsificaci\u00f3n de solicitudes entre sitios (CSRF), es el uso de &#8220;nonces&#8221;. Nonces, acr\u00f3nimo de &#8220;Numbers Used Once&#8221; (n\u00fameros utilizados una vez), aseguran que una acci\u00f3n espec\u00edfica proviene de una fuente aut\u00e9ntica y de confianza, y evita solicitudes duplicadas o malintencionadas. En este tutorial, te guiare a trav\u00e9s del proceso de utilizaci\u00f3n de nonces en el desarrollo de un plugin de WordPress.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1880\" height=\"1253\" src=\"http:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700.jpeg\" alt=\"settings android tab\" class=\"wp-image-2344\" title=\"\" srcset=\"https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700.jpeg 1880w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700-600x400.jpeg 600w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700-300x200.jpeg 300w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700-1024x682.jpeg 1024w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700-768x512.jpeg 768w, https:\/\/racmanuel.dev\/wp-content\/uploads\/pexels-photo-270700-1536x1024.jpeg 1536w\" sizes=\"(max-width: 1880px) 100vw, 1880px\" \/><figcaption class=\"wp-element-caption\">Photo by Pixabay on <a href=\"https:\/\/www.pexels.com\/photo\/settings-android-tab-270700\/\" rel=\"nofollow noopener\" target=\"_blank\">Pexels.com<\/a><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creacion-de-nonces-en-wordpress\">Creaci\u00f3n de Nonces en WordPress:<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Crear un nonce:<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Para crear un nonce en WordPress, la funci\u00f3n <code>wp_create_nonce()<\/code> se utiliza generalmente. Esta funci\u00f3n necesita una cadena (string) como argumento, que se usa para generar el nonce:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$nonce = wp_create_nonce( 'my_action' );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, &#8216;my_action&#8217; es un identificador \u00fanico para la acci\u00f3n que est\u00e1s protegiendo y el nonce generado se asigna a la variable <code>$nonce<\/code>.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Adjuntar el nonce a un formulario:<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Luego de generar el nonce, puedes anexarlo a un formulario utilizando un campo oculto. De este modo, cuando el formulario se env\u00ede, el nonce se enviar\u00e1 junto con \u00e9l:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">echo '&lt;input type=\"hidden\" name=\"my_nonce\" value=\"' . esc_attr( $nonce ) . '\"&gt;';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, el nonce se inserta en un campo de formulario oculto llamado &#8216;my_nonce&#8217;.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Crear un campo de formulario nonce:<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, WordPress proporciona una funci\u00f3n <code>wp_nonce_field()<\/code> para simplificar la creaci\u00f3n de campos de formulario nonce:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">wp_nonce_field( 'my_action', 'my_nonce', true, true );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, &#8216;my_action&#8217; es la acci\u00f3n que se protege, &#8216;my_nonce&#8217; es el nombre del campo de formulario nonce. Los dos argumentos booleanos finales indican que se debe incluir un campo de referer y que el campo del formulario se debe mostrar directamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"verificacion-de-nonces-en-wordpress\">Verificaci\u00f3n de Nonces en WordPress:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que se ha enviado el formulario y se ha recibido el nonce, debes verificarlo para asegurarte de que es v\u00e1lido.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Recuperar el nonce:<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes recuperar el nonce enviado a trav\u00e9s de la superglobal <code>$_POST<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$nonce = $_POST['my_nonce'];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed, se recupera el nonce del campo de formulario &#8216;my_nonce&#8217;.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><span style=\"color: var(--theme-palette-color-2, #25ff00);\" class=\"stk-highlight\">Verificar el nonce:<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Para verificar la validez del nonce, puedes usar la funci\u00f3n <code>wp_verify_nonce()<\/code>. Esta funci\u00f3n necesita dos argumentos: el nonce que se est\u00e1 verificando y el identificador \u00fanico de la acci\u00f3n para la cual se cre\u00f3 el nonce:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">if ( ! wp_verify_nonce( $nonce, 'my_action' ) ) {\n    die( 'Security check failed!' );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si la verificaci\u00f3n del nonce falla, la ejecuci\u00f3n del script se detiene y se muestra un mensaje de error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusi\u00f3n:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El uso correcto de nonces en WordPress es esencial para la protecci\u00f3n de tu sitio contra solicitudes maliciosas. Al usar nonces en tu plugin de WordPress, puedes asegurarte de que todas las acciones provienen de una fuente confiable y se utilizan una sola vez, reforzando as\u00ed la seguridad general de tu sitio. Siempre recuerda probar tus nonces en un entorno de desarrollo antes de implementarlos en tu sitio en producci\u00f3n.<\/p>\n\n\n<style><\/style><style><\/style>\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading has-large-font-size\" id=\"necesitas-ayuda-con-un-proyecto-web\">\u00bfNecesitas ayuda con un proyecto web?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Si \u00bfNecesitas ayuda con alg\u00fan proyecto web? No dudes en contactarme desarrollo soluciones completas y personalizadas con WordPress y PHP, con herramientas y procesos modernos, utilizando HTML, CSS, SCSS, PHP, JavaScript, Bootstrap y m\u00e1s\u2026 Si \u00bfEst\u00e1s listo? \u00a1Env\u00edame un mensaje y hablemos de tu proyecto web!<\/p>\n\n\n<div class=\"wp-block-groundhogg-forms\">\n\t<div class=\"gh-form-wrapper\"><form method=\"post\" class=\"gh-form gh-form-v2\" target=\"_parent\" enctype=\"multipart\/form-data\" name=\"Formulario de Contacto\" id=\"gh-form-24\" data-id=\"24\"><div class=\"gh-form-fields\"><div class=\"gh-form-column col-1-of-2\"><label for=\"first_name\">Nombre <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"text\" name=\"first_name\" id=\"first_name\" class=\"gh-input gh-first-name\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-2\"><label for=\"last_name\">Apellido(s) <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"text\" name=\"last_name\" id=\"last_name\" class=\"gh-input gh-last-name\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"email\">Correo electr\u00f3nico <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"email\" name=\"email\" id=\"email\" class=\"gh-input gh-email\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"primary_phone\">Tel\u00e9fono o WhatsApp <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><input type=\"tel\" name=\"primary_phone\" id=\"primary_phone\" class=\"gh-input\" value=\"\" required\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"nombre_de_tu_negocio_o_empresa\">Nombre de tu Negocio o Empresa<\/label><div class=\"gh-form-input-field\"><input type=\"text\" name=\"nombre_de_tu_negocio_o_empresa\" id=\"nombre_de_tu_negocio_o_empresa\" class=\"gh-input\" value=\"\"\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"link_de_tu_pagina_web\">Link de tu pagina web<\/label><div class=\"gh-form-input-field\"><input type=\"url\" name=\"link_de_tu_pagina_web\" id=\"link_de_tu_pagina_web\" class=\"gh-input\" value=\"\" placeholder=\"Si tu negocio o empresa tiene p\u00e1gina web ingresa aqu\u00ed el link.\"\/><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"question_type\">\u00bfQu\u00e9 tipo de pregunta tienes? <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><select name=\"question_type\" id=\"question_type\" class=\"gh-input\" required><option value=\"Cotizaci\u00f3n\">Cotizaci\u00f3n<\/option><option value=\"General\">General<\/option><option value=\"Soporte\">Soporte<\/option><\/select><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><label for=\"message\">Pregunta <span class=\"required\">*<\/span><\/label><div class=\"gh-form-input-field\"><textarea name=\"message\" id=\"message\" class=\"gh-input\" rows=\"7\" placeholder=\"Tu pregunta o duda...\" type=\"text\" required><\/textarea><\/div><\/div><div class=\"gh-form-column col-1-of-1\"><div class=\"consent gh-gdpr\" id=\"gdpr_consent\"><div ><label class=\"gh-checkbox-label\"><input type=\"checkbox\" name=\"data_processing_consent\" id=\"data-processing-consent\" class=\"\" value=\"yes\" required\/><span class=\"checkbox-label\">I agree to racmanuel.dev&#8217;s storage and processing of my personal data. <span class=\"required\">*<\/span><\/span><\/label><\/div><div ><label class=\"gh-checkbox-label\"><input type=\"checkbox\" name=\"marketing_consent\" id=\"marketing-consent\" class=\"\" value=\"yes\"\/><span class=\"checkbox-label\">I agree to receive marketing offers and updates from racmanuel.dev.<\/span><\/label><\/div><\/div><\/div><div class=\"gh-form-column col-1-of-3\"><button type=\"submit\" class=\"gh-submit gh-button primary\" value=\"\">\u00a1P\u00f3ngase en contacto!<\/button><\/div><\/div><\/form><\/div><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>En el desarrollo de plugins de WordPress, una medida de seguridad clave para proteger tu sitio contra ataques malintencionados, como la falsificaci\u00f3n de solicitudes entre sitios (CSRF), es el uso de &#8220;nonces&#8221;. Nonces, acr\u00f3nimo de &#8220;Numbers Used Once&#8221; (n\u00fameros utilizados una vez), aseguran que una acci\u00f3n espec\u00edfica proviene de una fuente aut\u00e9ntica y de confianza, y evita solicitudes duplicadas o malintencionadas. En este tutorial, te guiare a trav\u00e9s del proceso de utilizaci\u00f3n de nonces en el desarrollo de un plugin de WordPress.<\/p>","protected":false},"author":1,"featured_media":2344,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"categories":[11],"tags":[42],"niveles":[38],"class_list":["post-2342","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categorizar","tag-wordpress","niveles-intermedio"],"blocksy_meta":[],"acf":[],"_links":{"self":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/2342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/comments?post=2342"}],"version-history":[{"count":3,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/2342\/revisions"}],"predecessor-version":[{"id":2346,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/posts\/2342\/revisions\/2346"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media\/2344"}],"wp:attachment":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media?parent=2342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/categories?post=2342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/tags?post=2342"},{"taxonomy":"niveles","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/niveles?post=2342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}