Contexto: estoy desarrollando un complemento público para WP. Tiene un formulario colocado en el tablero de WP. Solo los administradores pueden acceder a la página del formulario.
Problema: el formulario tiene mucha lógica de validación y, por lo tanto, uno está duplicado en el lado de PHP y JS. Quiero usar la validación lateral de JS solo para simplificar la gestión del código. No es posible deshacerse de la validación de JS (como enviar una solicitud de validación de AJAX al hacer clic en el botón "Guardar"), ya que los campos de formulario se procesan en función de los valores de otros campos y JS fallará si la validación no se realiza después de cada evento de cambio de entrada.
Posible solución: cree un token único en la carga de la página del formulario y guárdelo en la sesión del usuario + agregue <input type="hidden" name="token" value={token}> al formulario. El formulario también tendrá un <input type="hidden" name="is_valid" value="{1 or 0}"> . El backend solo realizará la desinfección de etiquetas HTML. WP también realiza una desinfección de inyección SQL bajo el capó. El manejo de páginas de formulario también se implementará solo para administradores, se ignorarán otros usuarios (para evitar solicitudes POST falsas).
Por qué espero que funcione:
Los tokens deberían evitar los ataques CSRF. Incluso si se engaña al administrador para que haga clic en "enviar" en el formulario falso que se coloca en el sitio malicioso e incluso si el encabezado de origen es falso, los atacantes no sabrán el token.
Y es obvio que el administrador del sitio no intentará piratear el formulario manualmente y no enviará solicitudes POST falsas con token correcto y datos maliciosos.
Por qué no estoy seguro:
No será un gran problema si el código puede ser visto por el equipo de 2 personas (que ya tienen acceso a todas las bases de datos, base de código, servidor, etc.). Pero como dije, el complemento es público. Para que cualquiera pueda ver el código.
Conclusión: ¿Puede decirme cómo se puede piratear la solución sugerida? ¿Y hay alguna otra solución más simple/más segura para el problema descrito?