Come usare nonce con il modulo di invio front-end?
Grazie a diversi post qui presenti sono riuscito a mettere insieme un modulo di invio front-end. Dopo circa 24 ore di modifiche sono finalmente riuscito a far funzionare tutto, incluso il reindirizzamento a una pagina di 'successo' dopo l'invio, ma non ho idea di come gestire il nonce.
Ecco la pagina del modulo: http://pastebin.com/YWyXL3jY
Ed ecco la pagina di successo: http://pastebin.com/3Usu0Pt6
Sono entrambi template di pagina personalizzati (so che la formattazione è un po' disordinata al momento poiché parti diverse provengono da fonti diverse, e penso che non userò la funzione di caricamento file poiché preferirei utilizzare un plugin per una migliore sicurezza).
Il nonce deve essere elaborato prima che l'utente venga reindirizzato alla pagina di successo? Non ho alcuna esperienza con i nonce e sono un programmatore PHP che lavora per 'copia e incolla', quindi per favore siate gentili!
Grazie mille per qualsiasi consiglio possiate darmi :)

Utilizza il seguente codice appena prima del tag nel tuo codice front-end.
wp_nonce_field('name_of_your_action', 'name_of_your_nonce_field');
Il codice sopra genererà due campi input nascosti all'interno del tuo tag form. Ora puoi verificare il tuo nonce nel backend dove elaborerai il tuo form. Utilizza il seguente codice per verificare il nonce che hai appena creato sopra.
if(wp_verify_nonce($_REQUEST['name_of_your_nonce_field'], 'name_of_your_action')){
// Il nonce corrisponde ed è valido. Ora puoi fare quello che vuoi.
} else {
// Nonce non valido. Puoi generare un errore qui.
}
Una nota importante: osserva attentamente come "name_of_your_action" è il primo argomento della funzione 'wp_nonce_field()' ed è il secondo argomento della funzione 'wp_verify_nonce()'. :) Quindi, non usarlo come primo argomento in entrambe le funzioni. Molte persone commettono questo errore, quindi ho voluto menzionarlo.

Per aggiungere un nonce a un modulo puoi utilizzare la seguente funzione:
wp_nonce_field($action, $name, $referer, $echo)
- $action = (opzionale) è una stringa che rappresenta il nome dell'azione
- $name = (opzionale) è una stringa che rappresenta il nome del nonce. Se lasci questo campo vuoto WordPress utilizzerà "_wpnonce" come valore predefinito
Esempio:
Frontend:
<form action="" method="post">
<?php wp_nonce_field('my_delete_action'); ?>
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="text" name="rec_name" value="<?php echo $name; ?>" />
<input type="submit" value="Elimina" />
</form>
Backend:
$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_action')) die('Controllo di sicurezza fallito');
Fonte: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

Utilizza questo per la generazione e verifica del nonce.
wp_nonce_field('test_action', 'submit_post');
Questo genererà il campo nonce e puoi verificarlo con il codice seguente.
if(wp_verify_nonce($_REQUEST['test_action'], 'submit_post')){
/// esegui il tuo lavoro
}else{
/// restituisci un errore
}

Inizia da questa pagina: http://codex.wordpress.org/WordPress_Nonces
Poi guarda l'utilizzo di wp_verify_nonce
e l'esempio di utilizzo di wp_nonce_field
, devi verificare il risultato della verifica e decidere cosa fare (tipicamente terminare l'esecuzione, ma nel tuo caso probabilmente mostrare un messaggio di errore con echo
). Potresti probabilmente usare la verifica come tuo "controllo se il form è stato inviato" alla riga 8:
if ( empty($_POST) || wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') === false ) {
/* fallimento */
} else {
/* successo, elaborazione, redirect */
}
Assumendo che la risposta sia positiva, allora puoi eseguire la tua prossima azione - come mostrare un messaggio di conferma, o nel tuo caso reindirizzare la pagina. Assicurati solo di fare il redirect prima che qualsiasi output venga stampato.
Una cosa da considerare - http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/ - anche se in questo caso visto che stai creando contenuti credo che il tizio menzioni che sia "corretto" usare i nonce.
