Estoy creando un editor frontal que usa AJAX para actualizar el contenido de la página.
Se actualiza utilizando JS para tomar fragmentos de componentes HTML y guardarlos en el contenido de la página, envueltos en etiquetas <!-- wp:html --> .
La función solo está disponible si el usuario ha iniciado sesión y se ha seleccionado la opción de editor frontal (opción de tema personalizado).
El código AJAX es:
function scedPage(post_id) { var pageComs = ["<!-- wp:html -->"]; jQuery('section component').each(function () { $this0 = jQuery(this)[0].outerHTML; pageComs.push($this0); }); pageComs.push("<!-- /wp:html -->"); pageHtml = pageComs.join(' '); console.log(pageHtml); jQuery.ajax({ type: "POST", url: ajax_object.ajaxurl, async: true, data: { action: 'sced_page', post_content: pageHtml, postId: post_id }, success: function (data) { location.reload(); }, error: function (error) { console.log(error) } }); };El PHP es:
function sced_page() { $dev_sced = get_option('scale_opt_field2'); if (current_user_can('editor') || current_user_can('administrator')) { if ($dev_sced !== "1") { } else if ($dev_sced == "1") { $post_id = $_POST['postId']; $post_content = $_POST['post_content']; $the_post = array(); $the_post['ID'] = $post_id; $the_post['post_content'] = $post_content; $post_id = wp_update_post($the_post); wp_die(); add_action( 'wp_ajax_sced_page', 'sced_page' ); } } };¿La publicación de grandes bloques de HTML sin escapar/sin filtrar representa un problema? Me doy cuenta de que tendré que agregar nonce allí.
Gracias por tu ayuda.
¿La publicación de grandes bloques de HTML sin escapar/sin filtrar representa un problema?
TLDR ;
Sí, existe la posibilidad de que su código sea explotado por usuarios maliciosos, por lo que desinfectaría la entrada del usuario usando wp_kses_posts() antes de guardarlo en la base de datos (o antes de mostrar el contenido en el sitio web).
Dado que está comprobando las capacidades de los usuarios y espera que sean editores o administradores, que son roles que normalmente asigna a las personas en las que confía, en teoría podría sonar bien guardar lo que envíen en la base de datos.
Sin embargo, la experiencia me ha enseñado, y muchos otros seguramente dirán lo mismo, que nunca debes confiar en la entrada del usuario. Desinfecte/escape los datos siempre que sea posible. Haz de este tu mantra personal como desarrollador y ahórrate algunos problemas a tu Future Self.
$post_content = wp_kses_post($_POST['post_content']);No está relacionado con su pregunta original, pero quería señalar un par de cosas sobre su código si está bien:
if no está haciendo nada. ¿Es ese código incompleto o...?add_action( 'wp_ajax_sced_page', 'sced_page' ); nunca se ejecutará: nada después de wp_die(); va a ser ejecutado por el servidor.$_POST['postId'] y $_POST['post_content'] están configurados usando isset() antes de intentar acceder a ellos.