Angående 3) så kan ob_start() og ob_end_flush() lave underværker.
Men i princippet kan du lave et $_SESSION-array med en liste over valide tokens. Altså i din form:
form.php<?php
session_start();
// Step 1: Generer token
// NB: Dette er en hurtig måde at generere tokens på, langt fra den bedste
$token = md5(microtime(true));
// Step 2: Gem token i session
$_SESSION['tokens'][$token] = true;
?>
<html>
...
<form action="action.php" method="post">
<?php
// Step 3: Udskriv token til form
echo '<input type="hidden" name="token" value="' . $token . '" />';
?>
<!-- Resten af din formular her -->
</form>
...
</html>
Dette var din form. Hver kan siden indlæses, skal der altså genereres et nyt token. Der kan på altså eksistere flere tokens sideløbende. Det er en væsentlig detalje! Videre til din håndtering af data:
action.php<?php
session_start();
$token = $_POST['token'];
// Step 4: Kontroller om token er gyldigt
if(empty($token) || !isset($_SESSION['tokens']) || !array_key_exists($token, $_SESSION['tokens']))
{
// Ugyldigt token. Det er allerede blevet anvendt
die("Dine data er allerede blevet gemt");
} else {
// Step 5: Gem de indtastede data
// Step 6: Fjern token, så det ikke kan anvendes igen
unset($_SESSION['tokens'][$token]);
}?>