Springe zum Hauptinhalt
Universitäts­rechen­zentrum
Absicherung von Webformularen
Universitäts­rechen­zentrum 

Absicherung von Webformularen

Schützen Sie öffentlich erreichbare Webformulare gegen sog. CSRF-Angriffe (Cross Site Request Forgery) und „Formular-Spamming“. Dabei senden Programme automatisiert Webformulare ab, um damit unliebsame Aktionen auszulösen, z. B. E-Mails zu senden oder Datenbanken mit sinnlosen Einträgen zu füllen.

Häufig werden zum Schutz sog. Captchas verwendet, die meist jedoch nicht barrierefrei sind. Wir stellen hier einfache Varianten vor, die Sie als Webautor der TU Chemnitz zum Schutz Ihrer Webformulare verwenden können.

Gesicherte Webformulare in 3 Schritten

1. Initialisieren

Hier binden Sie den PHP-Code ein und wählen eine Methode aus. Wichtig: Unbedingt vor der tucal-Funktion seite()!

<?php
require_once('php/secform.inc');
$secform = new tucal_secform(0);     # 0, 1, oder 2
seite(__FILE__);
Folgende Schutzmethoden sind derzeit umgesetzt:
  • 0 – unsichtbares Token
  • 1 – Token und Zeitprüfung – „unsichtbar“
  • 2 – Token, Zeitprüfung und JavaScript-Checkbox: Ich bin ein Mensch – sichtbar, JavaScript erforderlich
Im Normalfall sollte die Methode 1 ausreichend sein. Alle Varianten schützen auch vor CSRF-Angriffen und verhindern das mehrfache Absenden des Formulars.

2. Geheimnis im Formular unterbringen

Geben Sie den HTML-Code, die die PHP-Funktion get_token() liefert, in Ihrem HTML-Formular aus:

<form action="mod_secform.php" method="post" class="form-horizontal">
 ...
  <?php echo $secform->get_token(); ?> 
  <button type="submit" class="btn btn-default" style="margin:1em">Absenden</button>
   </div>
</form>

3. Prüfen in der Formularauswertung

Verwenden Sie die Funktion check_token(min, max), um die Schutzmethode zu überprüfen. min, max sind Zahlenwerte in Sekunden. In diesem Zeitbereich sollte der menschliche Benutzer das Formular ausfüllen können. Die Verwendung sehen Sie im Beispiel:

<?php
  # Auswertung des Formulars
  # Zeit zum Ausfüllen des Formulars durch den Benutzer - hier:
  # mindestens 5 Sekunden, maximal 900 Sekunden = 15 Minuten
  # Verwenden Sie $secform->check_token(0, 0); um die Zeitprüfung abzuschalten
  list($ok, $reason) = $secform->check_token(5, 900);
  if ($ok) {
      # normale Formularauswertung
  } else {
      # Fehler, z. B. $reason ausgeben, und/oder einfach Formular nochmal anzeigen
      echo 'Fehler: ' . htmlspecialchars($reason);
  }

Beispiele

Antworten auf häufig gestellte Fragen

Sind diese Verfahren wirklich sicher?

Nein, absolut sichere Varianten für öffentlich zugreifbare Formulare – dazu noch barrierefreie – wird es wohl kaum geben. Die umgesetzten Methoden erfordern jedoch ein „menschliches Verhalten“ in einem realen Webbrowser:

  • 0 – Das Formular muss vorm Absenden vom Webbrowser geladen werden und kann nicht mehrfach abgesendet werden.
  • 1 – Das Formular muss zudem in einem gewissen Zeitraum ausgefüllt und abgesendet werden.
  • 2 – JavaScript muss ausgewertet werden (was bei Bots in der Regel nicht der Fall ist). Der Benutzer muss genau eine von zwei Checkboxen anklicken, wobei eine durch CSS gar nicht sichtbar ist.

Letztlich muss die Praxis zeigen, ob wir mit diesen Methoden die „Plagegeister“ abhalten. Sobald diese programmierten Automaten unsere Maßnahmen durchschauen und umgehen, wird der Schutz ausgehebelt. Dann werden wir neue Maßnahmen entwickeln.