So verhindern Sie die mehrfache Formularübermittlung bei mehreren Klicks in PHP

Lesezeit: 5 Minuten

So verhindern Sie die mehrfache Formularübermittlung bei mehreren Klicks in PHP

  • Da sich die Frage auf das serverseitige Verhalten (PHP) bezieht, würde ich empfehlen, sich die folgende Frage anzusehen: stackoverflow.com/questions/218907/…

    – Kel

    6. Januar 2011 um 10:49 Uhr

  • <input type="submit" onclick="this.disabled='disabled'"/>

    – karim79

    6. Januar 2011 um 10:50 Uhr


  • Ist der Javascript-Ansatz schneller als Autoclicker mit > 1000 Klicks pro Sekunde?

    – 4 Deckung verlassen

    14. Februar 2017 um 2:28 Uhr

  • Mögliches Duplikat von How to handle multiple submissions server-side

    – Adam

    26. Juli 2019 um 14:19 Uhr

So verhindern Sie die mehrfache Formularubermittlung bei mehreren Klicks in
Arch

Verwenden Sie ein eindeutiges Token, das jedes Mal generiert wird, wenn Sie ein Formular anzeigen, und das nur einmal verwendet werden kann. es ist auch nützlich zu verhindern CSRF und Wiederholung Anschläge. Ein kleines Beispiel:

<?php
session_start();

/**
 * Creates a token usable in a form
 * @return string
 */
function getToken(){
  $token = sha1(mt_rand());
  if(!isset($_SESSION['tokens'])){
    $_SESSION['tokens'] = array($token => 1);
  }
  else{
    $_SESSION['tokens'][$token] = 1;
  }
  return $token;
}

/**
 * Check if a token is valid. Removes it from the valid tokens list
 * @param string $token The token
 * @return bool
 */
function isTokenValid($token){
  if(!empty($_SESSION['tokens'][$token])){
    unset($_SESSION['tokens'][$token]);
    return true;
  }
  return false;
}

// Check if a form has been sent
$postedToken = filter_input(INPUT_POST, 'token');
if(!empty($postedToken)){
  if(isTokenValid($postedToken)){
    // Process form
  }
  else{
    // Do something about the error
  }
}

// Get a token for the form we're displaying
$token = getToken();
?>
<form method="post">
  <fieldset>
    <input type="hidden" name="token" value="<?php echo $token;?>"/>
    <!-- Add form content -->
  </fieldset>
</form>

Kombinieren Sie es mit einer Umleitung, damit Sie ein perfektes Vorwärts- und Rückwärtsverhalten beibehalten. Siehe die POST / Umleitung / GET Muster für weitere Informationen über die Weiterleitung.

  • Kennt jemand irgendwelche Probleme, wie zB Sicherheitsprobleme, mit diesem Code?

    – Zeit zu fliegen

    27. Februar 2013 um 19:45 Uhr

  • Ich denke, der Filter fehlt auf $postedToken = filter_input(INPUT_POST, ‘token’);

    – zeckdude

    12. Februar 2015 um 3:55 Uhr

Sie könnten die Schaltfläche nach dem ersten Klick deaktivieren (mit JavaScript) und auch das Backend überprüfen (nur für den Fall, dass sie ihr JavaScript deaktiviert haben), das überprüft, ob sie erst kürzlich gesendet haben.

Es gibt verschiedene Möglichkeiten, die Überprüfung im Backend durchzuführen. Eine Möglichkeit wäre, eine Sitzungsvariable festzulegen, wenn sie zum ersten Mal darauf klicken, wodurch das System wissen kann, dass es verarbeitet wird. Wenn sie ein zweites, drittes oder viertes Mal klicken, kann sie einfach die Sitzungsvariable überprüfen, und wenn dies anzeigt, dass sie bereits angeklickt wurde, wird sie nicht verarbeitet.

Das ist nur ein Beispiel – Sie könnten das als Anfang verwenden.

Ich rate davon ab, die Submit-Schaltfläche zu deaktivieren, da der Benutzer im Falle eines vorübergehenden Netzwerkproblems (dh die Anfrage ist überhaupt nicht durchgegangen) die Submission abbrechen kann (Esc-Taste/Stopp-Schaltfläche), wenn er einmal im Netzwerk ist Der Dienst wurde wiederhergestellt und muss stattdessen die Seite neu laden und ausfüllen alle die Formulareinträge erneut.

Sie könnten so etwas hinzufügen

<input type="hidden" name="form-token" value="someRandomNumber">

Dann haben Sie im Back-End eine sichere Möglichkeit, mehrere Formularübermittlungen zu identifizieren. Diese Lösung hat natürlich etwas Ballast, da Sie Formular-Token löschen müssen, von denen Sie wissen, dass sie fertig verarbeitet sind, usw.

In den meisten Fällen reicht ein deaktiviertes Formular aus, indem beispielsweise entweder die Schaltfläche deaktiviert oder hinzugefügt wird return false zum Form-Submit-Event (nicht sicher, ob das ohne jQuery funktioniert).

Kannst du die Schaltfläche beim Klicken einfach ausblenden? Es würde die Formularverarbeitung nicht beeinflussen (wie ich weiß, besteht das Problem darin, die Schaltfläche sofort zu deaktivieren), aber es würde im Wesentlichen dasselbe tun. Wenn Sie sich darüber wirklich Sorgen machen, können Sie sogar einfach eine andere Schaltfläche anzeigen, die eigentlich nichts tut. Könnte eine unkonventionelle Problemumgehung sein, aber dennoch eine Problemumgehung.

  • Was ist, wenn der Benutzer das Formular durch Drücken der Eingabetaste oder durch ein in der Anwendung integriertes JavaScript (z form.submit())? Um sicherzustellen, dass das Formular nicht gleichzeitig zweimal (oder mehrmals) erneut eingereicht wird, sollte man Kennungen für die Einreichungen haben und ihre Vollständigkeit verfolgen. Wenn Sie eine ID generieren möchten, würde ich diese API vorschlagen (api.cloudianos.com/genToken), bekannt für die Bereitstellung eindeutiger (für mittlere bis kurze Perioden) int + char-Strings.

    – nicht definiert

    13. Mai 2019 um 11:21 Uhr

1646317448 778 So verhindern Sie die mehrfache Formularubermittlung bei mehreren Klicks in
Robert Sinclair

Ich mache folgendes auf der action.php

if($_SESSION && isset($_SESSION['already_submitted'])) {

  # If already submitted just redirect to thank you page

} else {

    # If first submit then assign session value and process the form
    $_SESSION['already_submitted'] = true;

    # Process form

}

Hinweis: Initiieren Sie Ihre Sitzungen immer im Header mit session_start();

  • Was ist, wenn der Benutzer das Formular durch Drücken der Eingabetaste oder durch ein in der Anwendung integriertes JavaScript (z form.submit())? Um sicherzustellen, dass das Formular nicht gleichzeitig zweimal (oder mehrmals) erneut eingereicht wird, sollte man Kennungen für die Einreichungen haben und ihre Vollständigkeit verfolgen. Wenn Sie eine ID generieren möchten, würde ich diese API vorschlagen (api.cloudianos.com/genToken), bekannt für die Bereitstellung eindeutiger (für mittlere bis kurze Perioden) int + char-Strings.

    – nicht definiert

    13. Mai 2019 um 11:21 Uhr

1646317448 948 So verhindern Sie die mehrfache Formularubermittlung bei mehreren Klicks in
äh StackExchange

Sie können dies auch verhindern, indem Sie ein eindeutiges Feld wie E-Mail/Benutzername oder Registrierungsnummer haben. Testen Sie dann das neue Feld gegen das vorhandene Feld in der Datenbank, und wenn es übereinstimmt, hat sich der Benutzer zuvor registriert, und das Senden des Formulars sollte beendet werden, andernfalls das Senden des Formulars fortsetzen.

924290cookie-checkSo verhindern Sie die mehrfache Formularübermittlung bei mehreren Klicks in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy