Problema form
Problema form postato il 23/09/2014 17:28:21 nel forum programmazione, open source e hosting
Salve a tutti, volevo sapere come rimediale al caso in cui un utente cliccasse più vole sul submit di un form e si spediscono più volte i dati.
Voi come rimediate a questo inconveniente? (preferibilmente vorrei una soluzione lato server).
Pagine → 1
23/09/2014 17:53:37 e modificato da kasa il 23/09/2014 17:55:55
Non ho molte conoscenze in materia e sicuramente il mio consiglio vale molto poco rispetto a quello d'altri utenti del portale.
Tuttavia...
Una risoluzione al tuo problema può essere il seguente adattamento, sempre se riesce a combaciare con i tuoi scopi.
<input type="submit" onclick="this.disabled=true;" value="Invia" />
La succitata funzione "onclick" dovrebbe disabilitare il submit ed impedire il multiplo invio di dati.
23/09/2014 18:51:32
non invia il form facendo come mi hai detto :/
23/09/2014 18:56:19 e modificato da alfonso cavallieri il 23/09/2014 19:05:49
ecco come è strutturato il form :
<form action="main.php?page=servizi_mercato&dir=<?php echo $_REQUEST['dir'];?>" method="post">
<input type="hidden" name="id_oggetto" value="<?php echo $row['id_oggetto']?>" />
<input type="hidden" name="costo" value="<?php echo $row['costo']?>" />
<input type="hidden" name="cariche" value="<?php echo $row['cariche']?>" />
<input type="hidden" name="numero" value="<?php echo $row['numero']?>" />
<input type="hidden" name="op" value="buy" />
<div class='form_label'>
<?php echo $row['costo'].' '.$PARAMETERS['names']['currency']['short']; ?>
</div>
<div class='form_submit'>
<input type="submit"
name="butt"
onclick="this.disabled=true;"
<?php if ($money<$row['costo']){ echo 'disabled ';}?>
value="<?php echo gdrcd_filter('out',$MESSAGE['interface']['market']['buy']); ?>"
/>
</div>
<select name="acquisto">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
</form>
24/09/2014 11:00:04
Ciao Alfonso, ecco la soluzione che, secondo me, è la più comoda e semplice per il tuo problema:
- Ho utilizzato JavaScript, di modo che il tuo pulsante venga disabilitato una volta premuto dall'utente:
//Io ho messo Class, tu puoi anche mettere Id, decidi tu
<input type="submit" value="Procedi" class="click" />
//Se hai messo id devi mettere getElementById
<form action="esempio.php" method="post"
onsubmit="document.getElementByClass('click').disabled=true;
document.getElementByClass('click').value='Procedo, attendere...';"
>
Provalo e, in caso di problemi, fammi sapere :-)
24/09/2014 13:10:13 e modificato da leoblacksoul il 24/09/2014 13:15:49
Secondo me il metodo migliore per impedire questi errori è lo stesso metodo utilizzato di solito per impedire attacchi replay/CSRF sui siti web.
La tecnica consiste nell'inserire nel form un input hidden che contiene un codice generato in modo casuale dal server. Ogni volta che il form viene visualizzato il server inserisce in codice diverso e se lo memorizza da qualche parte (per esempio nella sessione). Quando l'utente invia il form, il server non deve fare altro che controllare se il codice inviato dall'utente corrisponda a quello generato in precedenza. Se corrisponde, permette di eseguire l'operazione e cancella il codice in modo che una richiesta successiva con lo stesso codice (che sia involontaria dell'utente o un attacco al sito web) non abbia buon fine perchè il codice non c'è più.
Per un esempio di codice, ho trovato questo mini articolo su internet che ti illustra molto velocemente il funzionamento: http://fralette.wordpress.com/2013/08/05/php-e-sicurezza-csrf-ovvero-cross-site-request-forgery ↗
24/09/2014 15:56:25
leo, la tua soluzione sembra efficiente... ma non ho capito ancora come usarla .-.
24/09/2014 17:23:25
provo a rispiegarti quello che è spiegato nell'articolo che ti ho linkato:
Prendo come esempio una semplice pagina web con un form:
<?php
session_start();
?>
<form method="post">
<!--inserisci qui i vari input che ti servono -->
<input type="hidden" name="check_token" value="<?php
//Genero un nuovo token
$t=md5(uniqid(mt_rand(), true);
//Lo salvo nella sessione
$_SESSION['token']=$t;
//E lo inserisco nel form
echo $t;?>" />
<input type="submit" value="Invia" />
</form>
In questo form ho messo un codice generato in modo casuale che cambia ogni volta che apro il form. L'ho anche salvato, per poterlo confrontare dopo che l'utente invia il form
Questo invece è il codice che gestisce i dati che arrivano dal form sopra
if(!empty($_POST['check_token']) and $_POST['check_token']==$_SESSION['token']){
//Gestisci i dati del form
}
else{
echo 'ERRORE';
}
unset($_SESSION['token']);
In questo codice ricevo i dati dal form, incluso il codice casuale. Non faccio altro che controllarlo e vedere se è uguale a quello che ho salvato. Se è uguale vuol dire che il form è valido. Subito dopo aver gestito i dati cancello il codice dalla memoria.
Se l'utente accidentalmente clicca due volte sul bottone di invio del form solo una delle due richieste andrà a buon fine perchè la seconda troverà che la variabile $_SESSION['token'] è vuota e quindi visualizzerà il messaggio di errore
24/09/2014 18:03:58
nada, ho provato ma il problema persiste .-.
24/09/2014 18:30:21
Prova cortesemente la mia soluzione :)
24/09/2014 20:08:31
leoblacksoul ha scritto: Secondo me il metodo migliore per impedire questi errori è lo stesso metodo utilizzato di solito per impedire attacchi replay/CSRF sui siti web.
Non centro nulla, ma grazie per questa risposta molto utile non solo per risolvere il problema ma anche per una maggior sicurezza. 👋
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Wuthering Waves ↗
AlterEgo ↗
Hero Wars ↗
CRSED: F.O.A.D. ↗
Tiles Survive ↗
Cafuné ↗
RAID Shadow Legends ↗
Raja Dunia ↗
The Coven ↗
War Thunder ↗