dynamicinternet Webdesign

Das Blog

Themen, Tutorials sowie Tipps & Tricks über Webdesign, (X)HTML und CSS, Programmierung, WordPress und was uns sonst noch bewegt.

RSS abonnieren

WordPress Seiten mit etwas anderen Passwörtern

Aufgabenstellung: Kunde wünscht Webseiten, das meiste statische Seiten. Dann will er eine Seite, die ein paar Produkte von ihm listet und von der man auf die einzelnen Produktseiten kommt. Die möchte er allerdings selbst erstellen, ändern und löschen etc.
Soweit nichts Spannendes, also WordPress installieren und fertig. Jetzt kommt es aber: Die Produktseiten sollen aber nur bestimmte Leute ansehen dürfen. Die Seiten mit dem normalen Passwort von WordPress zu schützen mag der Kunde nicht, da sonst erst per Mail das Passwort angefragt werden muß usw.

Er möchte aus einer Reihe von Fragen eine zufällig angezeigt bekommen, die der Nutzer innerhalb von 20 Sekunden beantworten muß (damit man es nicht ergoogeln kann ;) ). Er meint, die Fragen seien so speziell, das nur Leute aus seiner Branche die Antwort wissen. Über Risiken und Nebenwirkungen habe ich ihn aufgeklärt. Daß dieses System nicht sonderlich sicher ist, weiß er. Er will halt auf diese Weise ein paar Neugierige aussperren, mehr nicht.

Also was braucht man für so eine Geschichte? 3 Templates, eine Klasse und ein bischen Javascript. Ich hab das so gelöst, das ich auf der Einlaßseite mit session_start() eine Session starte und eine Frage nebst Inputfeld für die Antwort einblende. Ein Hiddenfeld liefert den Arraykey der Frage mit. Nach Ansenden checkt die Klasse, ob die Frage richtig beantwortet ist, registriert einen Schlüssel in der Session, der dann auf den untergerodneten Seite überprüft wird. Ist der Schlüssel gesetzt, wird der Inhalt der Seite anzeigt, wenn nicht, eine Warnmeldung.

Hier der Code der Klasse, welcher in die functions.php kommt:


<?php
class di_passwort {
	var $pairs;

	function di_passwort() {
		$this->pairs = $this->getPairs();
	}

	//Die Fragen sind natürlich hierfür verändert
	function getPairs() {
		$this->pairs = array(
			array(
			'frage' => 'Hauptstadt von Deutschland',
			'antwort' => 'berlin'
			),
			array(
			'frage' => 'beliebte Blogsoftware',
			'antwort' => 'wordpress'
			),
		// Hier kommen noch ca. 30 Pärchen....
			array(
			'frage' => 'Vorname von Mr. Gates',
			'antwort' => 'bill'
			));
		return $this->pairs;
	}

	function setQuestion() {
		// zufällige Frage auswählen
		$rand_key = array_rand($this->pairs, 1);
		$question = array('key' => $rand_key,
					'frage' => wptexturize($this->pairs[$rand_key]['frage']));
		return $question;
	}

	//hier gucken wir, ob die Frage richtig beantwortet ist
	function checkEntry($question, $answer) {
		$q = (int)strip_tags(stripslashes($question));
		$a = strip_tags(stripslashes($answer));
		$a = strtolower(trim($a));

		foreach ($this->pairs as $k => $v) {
			if ($k === $q && $v['antwort'] === $a) {
				return true;
			}
		}
		return false;
	}
}
$di_pass = new di_passwort();
global $di_pass;
?>

In das Template der Einlaßseite kommt dann folgender Code:


<?php
/*
Template Name:  EinlassSeite
*/
session_start();
//einmal die Frage holen
$question = $di_pass->setQuestion();

if (isset($_GET['antwort']) && $_GET['antwort'] != '' ) {
	if($di_pass->checkEntry($_GET['frage'], $_GET['antwort'])=== true){
		$_SESSION['nenn dieses Feld wie du willst'] = 'what ever you want';
		header("Location: ". get_bloginfo('siteurl') . "/wie-die-seite-heisst/" );
	}else{
		$error = "Die Antwort ist falsch. Sie haben keine Berechtigung, die Seite zu betreten.";
	}
}
?>
<?php get_header(); ?>
// irgendwelcher HTML Quelltext...
if ($error): ?>
<p><?php echo $error; ?></p>
<?php endif; ?>
<form action="" method="get">
	<p>Frage: <?php echo $question['frage']. " ?"; ?></p>
	<p><label for="antwort">Antwort:</label>
	<input type="text" name="antwort" value=""/></p>
	<input type="hidden" name="frage" value="<?php echo $question['key']; ?>"/>
	<p><input type="submit" id="submit" name="submit" value="Absenden" /></p>
</form>
<?php get_footer(); ?>

Auf den geschützten Seiten muß nur noch geschaut werden, ob es ein $_SESSION['nenn dieses Feld wie du willst'] gibt und ob es gleich ‘what ever you want’ ist.

Wie gesagt, nicht der absolute Security Hit. Jetzt muß ich noch den Javascriptteil machen. Ich werde warscheinlich das Inputfeld und den Absenden-Button erstmal auf display none setzten und sobald die Seite fertig geladen ist, mit jQuery einblenden. Damit sind die Nutzer ohne Javascript erstmal aussen vor, die bekommen noch eine noscript-Meldung angezeigt. Dann werde ich einen Timer starten und nach 20 Sekunden die Felder wieder unsichtbar machen und eine Meldung anzeigen, daß die Zeit um ist und die Seite neu geladen werden muß. Zusätzlich werde ich noch die Zeit in ein Hiddenfield schreiben, was ich auch noch in der Klasse überprüfen kann.

Vielleicht kommt mir auch noch eine bessere Idee…

2 Kommentare
  1. luis sagt:

    ist aber nicht besonders sicher. den timer kann man ganz einfach pausieren, indem man z.b. mit dem firefox webdeveloper kurz nach aufruf der seite alle javascripts blockiert und man die fragen in ruhe ergooglet.

  2. Micha sagt:

    @luis: Hinter der Einlass-Seite verbergen sich keine großen Geheimnisse. Das man die aushebeln kann, weiss ich und der Kunde. Die Klientel sind aber Zauberkünstler und keine Programmierer/Wedesigner. Es ist mehr als Gag gedacht. Darum der geringe Aufwand.

Einen Kommentar schreiben