mi-schi.com

15. Juni 2008

Template mit Passwort schützen

Abgelegt unter: Wordpress — Tags:, , , — admin @ 12:46

Ich war ja bei meiner Internetrecherche verwundert, warum sich noch niemand gefragt hat, wie man ein selbst erstelltes Wordpress Template mit einem Passwort schützen kann.

Templates in Wordpress sind was feines. Man hat einen eigenen PHP-Code und will den irgendwie auf seine Seite bekommen. Einfach ein Template erstellen:

1 <?php
2 /*
3 Template Name: hier-der-Template-Name
4 */
5 ?>
 

Dann speichern und in den verwendeten Theme-Ordner hochladen. Wenn man den Header, Footer, die Sidebar, sowie Kommentare auf der Templateseite mit anzeigen lassen will, kann man sich einfach mal den PHP-Code des Standardtemplates anschauen und ggf. kopieren. Unter Schreiben -> Seite -> Seiten-Template kann man dann sein eigenes Template auswählen und somit das eigene Script in das Wordpress-System eingliedern.

Soweit so gut, ist ja alles sehr einfach. Aber nun wollte ich ein Template mit dem Wordpress-Passwortschutz (bei Seite -> “Diese Seite mit einem Passwort versehen”) schützen. Das geht aber nicht so einfach, da man im Template ja erstmal herausbekommen muss, ob es ein Passwortschutz gibt, ob schon ein Cookie erstellt wurde und was sonst angezeigt werden soll (Loginformular).

Kurzerhand mal in die Wordpress-Funktion the_content() geschaut, die das für alle anderen Inhaltsausgaben (Artikel/Seiten) entscheidet und den Code kopiert und etwas angepasst:

 1 <?php
 2 /*
 3 Template Name: hier-der-Template-Name
 4 */
 5 ?>
 6 
 7 <?php get_header(); ?>
 8 <div id="content">
 9 <h2><?php the_title(); ?></h2>
10 <?php
11 function template_funktion() {
12 // hier der Code; PHP/HTML
13 }
14 $output = '';
15 if ( !empty($post->post_password) ) { // if there's a password
16     if ( !isset($_COOKIE['wp-postpass_'.COOKIEHASH]) ||
            stripslashes($_COOKIE['wp-postpass_'.COOKIEHASH])
            != $post->post_password ) {    // and it doesn't match the cookie
17         echo get_the_password_form();
18     } else {
19         template_funktion();
20     }
21 } else {
22     template_funktion();
23 }
24 ?>
25 </div><!-- End Content -->
26 <?php get_sidebar(); ?>
27 <?php get_footer(); ?>
 

Ich habe das Template mit einer Extra-Funktion (template_funktion()) erstellt, damit ich nur einmal meinen Code habe und ggf. auch nur einmal ändern muss. Man kann aber auch bei template_funktion(); zweimal den eigenen Code einfügen.

Mein Wordpress-Theme wird bei dem Code oben durch <?php get_header(); ?>, <?php get_sidebar(); ?>, <?php get_footer(); ?> mit angezeigt.

22. März 2008

Kontaktformular mit benutzerfreundlichen Spamschutz und Spam-Sicherheit

Abgelegt unter: Webdesign — Tags:, , — admin @ 17:14

Da ich leider immer wieder unsichere, schlechte Vorlagen für Kontaktformulare im Internet finde, veröffentliche ich hier das Kontaktformular meines Content Management Systems.

Funktionsumfang

  1. Script ist mit der UTF-8 Kodierung kodiert
  2. Script funktioniert bei allen Server-Konfigurationen (magic_quotes_gpc)
  3. einfache Überprüfung der E-Mailadresse
  4. E-Mail Spamschleuder Schutz
  5. benutzerfreundlicher, barrierefreier Spamschutz
  6. verhindert doppeltes Abschicken der E-Mail hintereinander.
  7. Felder werden untersucht, ob Text eingetragen wurde
  8. Sicherung der eingegebenen Werte bei falscher Eingabe eines Feldes

Umsetzung im Script

  1. Da mein komplettes Content Management System in UTF-8 Kodiert ist, habe ich natürlich auch das Kontakt-Script in UTF-8 kodiert. Da die meisten E-Mailaccounts UTF-8 aber noch nicht richtig unterstützen, musste ich mit utf8_decode() die Eingaben in ISO-8859-1 dekodieren und so abschicken.
  2. Manche Server sind so eingestellt, dass sie automatisch bei Anführungszeichen und Backslashs ein Backslash davor schreiben. Diese Server-Einstellung wird mit der Funktion quotes() untersucht und ggf. die überflüssigen Backslashs wieder entfernt.
  3. Die angegebene E-Mailadresse wird auf das Vorhandensein des @-Zeichens und des Punktes (.) untersucht. Es gibt noch weitaus intensivere Untersuchungen bei der E-Mailadresse. Diese verwende ich allerdings nicht, weil meistens ganze E-Mailblöcke (z.B. bestimmte Endung) nicht zugelassen werden. strstr($_POST['email'], “@”) && strstr($_POST['email'], “.”)
  4. Dieser Schutz wird fast immer vergessen, ist aber extrem wichtig. Denn wenn dieser Schutz nicht vorhanden ist, kann das Formular als Spamschleuder (Massen-E-Mails) genutzt werden und der Verantwortliche ist der Script-Benutzer, also der Webmaster des Accounts! Der Code für den Spamschleuder-Schutz: $emailsicherheit = preg_split("/[\s,]/”, quotes($_POST['email']));. Wie man die E-Mailadresse manipulieren kann erkläre ich nicht, aus Rücksicht auf Webmaster, die diesen Schutz nicht haben.
  5. Bei dem Kontaktformular gibt es kein nerviges Captcha-Bild. Es wird die Zeitspanne zwischen dem Aufrufen der Seite und dem Abschicken untersucht. Das reicht schon aus, um die meisten Spambots fern zu halten.
  6. Über die Methode die Zeit zu messen wird auch das versehentliche doppelte Abschicken des Formulars verhindert. Weiterhin werden die Eingabefelder nach dem Verschicken der E-Mail gelöscht.
  7. Standard bei fast allen Kontaktformularen ist die Überprüfung, ob überhaupt Text in den Eingabefeldern steht.
  8. Wenn man etwas vergessen hat einzugeben und abschickt, sind bei schlecht geschriebenen Kontaktformularen die Eingaben weg. Bei diesem Kontaktformular nicht: <?php if (isset($_POST['name']) && empty($gesendet)) { echo quotes(htmlentities($_POST['name'], ENT_QUOTES, “UTF-8″)); } ?>
Das Script anschauen: sicheres Kontaktformular

12. Februar 2008

Bild in Tabelle, Pixel für Pixel ausgeben, Kopierschutz

Abgelegt unter: Webdesign — Tags:, , — admin @ 17:56

Einen wirklich sicheren Kopier-Schutz für Bilder gibt es im Internet nicht. Ich veröffentliche hier aber mal einen PHP-Code, mit dem man ein Bild einlesen und in einer Tabelle Pixel für Pixel wieder ausgeben kann. Dadurch können mögliche Raub-Kopierer das Bild nicht einfach mit der linken Maustaste auf ihrem Computer speichern. Es gibt aber noch weitere Methoden, die ich hier nicht beschreibe, mit denen man trotzdem Bilder auf dem eigenen Computer speichern kann.

<?php
$bild
= imagecreatefromjpeg(“../back/images/logo.jpg”);
$bildbreite = imagesx($bild);
$bildhoehe = imagesy($bild);
echo
‘<table border=”0″ cellpadding=”0″ cellspacing=”0″ summary=”Bildlogo”>’ . “n”;
for(
$i = 0; $i < $bildhoehe; $i++) {
echo
‘<tr>’;
for (
$o = 0; $o < $bildbreite; $o++) {
$rgb = imagecolorat($bild, $o, $i);
$rgbwert = imagecolorsforindex($bild, $rgb);
echo
‘ <td style=”background-color:rgb(’;
echo
$rgbwert['red'] . ‘,’ . $rgbwert['green'] . ‘,’ . $rgbwert['blue'] . ‘);’;
echo
‘ height:1px; width:1px;”>’;
echo
‘</td>’;
}
echo
“</tr>n”;
}
echo
‘</table>’;
?>

Das Beispielbild, oder besser gesagt die Tabelle lädt im Gegensatz zum Bild viel länger. Ältere Computer könnten sogar durch die hohe CPU-Belastung abstürzten. Die PHP-Datei mit der Tabelle ist mehr als 1,5 MB groß, das Bild selber unter 7 KB! Dadurch warten Modem-Benutzer ewig.

21. September 2007

Wie erstellt man Frames mit PHP? -> dynamisches Includen

Abgelegt unter: Webdesign — Tags:, — admin @ 18:11

Ich möchte also das einbinden und ausgeben von dynamischen Includes erklären. Was bedeutet includen. Includen bedeutet frei übersetzt “einfügen” oder “beinhalten”.

php-frame

Auf dem oberen Bild sieht man die Hauptseite. Nennen wir sie mal include.php. Die Hauptseite muss eine PHP-Datei sein und die Endung .php haben. Die einzufügenden Seiten können auch ganz normale HTML- oder TXT-Seiten sein.
In Zeile 3 wird erstmal statisch die “header.inc.php” aus dem Ordner “inc” includet. Statisch bedeutet, dass die Datei immer angezeigt wird.
Warum eigentlich …inc.php? Diese Schreibweise hat sich allgemein durchgesetzt, ist aber nicht Pflicht. Genauso hat es sich durchgesetzt, dass man die einzufügenden Seiten in den Unterordner “inc” ablegt. Dies ist aber auch keine Pflicht.
In Zeile 5 wird die Datei “menue.inc.php” auch wieder aus dem Ordner “inc” includet. Zu dieser Datei komme ich später nochmal.
Nun fängt der eigentliche Spaß an.
Ab Zeile 7 kommt die erste Bedingung. Es wird entschieden, ob das assoziative Array $_GET['page'] eine Variable enthält. Wenn dies nicht der Fall ist, tritt die else-Bedingung auf der Zeile 24 in Kraft. Dadurch wird auf Zeile 25 die die Startseite includet.
Wenn das assoziative Array nicht leer ist, tritt die switch-Bedingung in Kraft. Es wird in Zeile 8 das Array $_GET['page'] ausgelesen. In Zeile 9, 13 und 17 wird die Übereinstimmung mit den jeweiligen Werten geprüft, die hinter dem case stehen. Also “startseite”, “ueber_mich” und “impressum”. Wenn eins von diesen Werten übereinstimmt wird die Zeile 10, 14 oder 18 aufgerufen. Es werden die jeweiligen Seiten includet. Danach wird die Aubfrage mit break gestoppt. Wenn das Array $_GET['page'] eine nicht im case beschriebene Variable enthält oder gar keine hat, tritt Zeile 21 in Kraft. Es wird eine Fehlerseite includet und ausgegeben.

php-frame-include

Doch wie generiert man ein GET-Array? Die GET-Arrays werden direkt an die URL mit daran gehängt. Also nicht include.php sondern z.B. include.php?page=startseite. Hinter dem Fragezeichen (?) ist also der Array-Name und nach dem Istgleich (=) die Variable. Ziemlich einfach oder? Nun schreibt man als Ziel-URL im Link nicht include.php, sondern z.B. include.php?page=startseite. Bei meinem oberen Bild habe ich die Hauptseite ersetzt durch $_SERVER['PHP_SELF']. Diese vordefinierte Variable ließt den Seitennamen aus, in welcher der Code ausgeführt wird. Ein Vorteil der Verwendung dieser Variable ist, dass man den Namen der Hauptseite ändern kann, ohne dass die Verlinkung verändern werden muss. Die eingefügten Dateien werden auf eine (Ordner-)Ebene mit der Hauptseite gestellt. Dadurch gehen Pfade zu anderen Dateien (Bilder usw.), von der Hauptseite aus und nicht von der eingefügten Datei, die möglicherweise in einem anderen Ordner liegt.
Die Funktionsweise die Werte für include() über $_GET zu übermitteln, ist fast überall gleich. Für die Auswertung der übergebenen Werte gibt es aber tausende Wege zum Ziel. Dies hier ist nur ein Weg!

Powered by WordPress ( WordPress Deutschland )