6.6. Formulare

Ich gebe zu, Formulare sehen nach aussen hin so aus, als wären sie nicht veränderbar.

<form action="abgesendet.php" method="post">
	<input type="hidden" name="sent" value="1" />
	<p>
		Ihr Alter:<br />
		<input type="text" name="age" value="" />
	</p>

	<p>
		Ihr Geschlecht:<br />
		<input type="radio" name="gender" checked="checked" value="m" />
		<input type="radio" name="gender" value="w" />
	</p>

	<p>
		Land:
		<select name="country">
			<option value="de">Deutschland</option>
			<option value="us">USA</option>
			<option value="au">Australien</option>
		</select>
	</p>

	<input type="submit" value="Senden" />
</form>

Denn im Browser lässt sich ja schließlich auch nur das Auswählen, was vorhanden ist, nicht wahr?

Abb. 5.6.: Formular im Browser
Abb. 5.6.: Formular im Browser

Aber dem ist nicht so. Ein einfaches Speichern des Formulars auf die heimische Festplatte und anschließendem Editieren bewirkt nämlich, dass zusätzliche Daten mitgeschickt werden können. Denn nur dass das Formular begrenzt ist, heißt nicht, dass nicht zusätzliche Daten an das zu verarbeitende Script übermittelt werden können.

Ein stures speichern der Daten wie folgt ist daher nicht ratsam:

<?php
update_option( 'mm_form', $_POST );
?>

Wie schon öfter angeregt: Rechnen Sie immer mit ungültigen Daten und prüfen Sie stets alle Daten auf Plausibilität.

Eine Möglichkeit wäre zu zählen, wie viele Daten überhaupt abgeschickt worden sind:

<?php
if ( isset( $_POST['sent'] ) ) {
	if ( count( $_POST ) != 4 ) {
		die( 'Nicht genügend oder zu viele Formulardaten übermittelt!' );
	}
}
?>

Zusätzlich können Sie alle Formularinhalte prüfen:

<?php
$allowed_countries = array(
	'de' => 'Deutschland',
	'us' => 'USA',
	'au' => 'Australien'
);

if ( isset( $_POST['sent']_{
	if ( count( $_POST ) != 5 ) {
		die( 'Nicht genügend oder zu viele Formulardaten übermittelt!' );
	}

	$post_values = array();

	if ( isset( $_POST['age'] ) ) {
		$post_values['age'] = absint( $_POST['age'] );
	}

	if ( isset( $_POST['gender'] ) && in_array( $_POST['gender'], array( 'm', 'w' ) ) ) {
		$post_values['gender'] = $_POST['gender'];
	}

	if ( isset( $_POST['country'] ) && array_key_exists( $_POST['country'], $allowed_countries ) ) {
		$post_values['country'] = $_POST['country'];
	}

	update_option( 'mm_form', $post_values );
}
?>

Wie Sie sehen, werden nur Daten ($post_values) gespeichert die auch wirklich gesendet und überprüft wurden.