Wer kann mir helfen?
Ich habe so ziemlich keinen blassen Schimer von PHP.
Meine HP ist eine Art Baukastensystem was aber einfach zu handhaben ist und in PHP geschrieben wurde.
Da mein Gästebuch seit ein paar Tagen mit Sexseiten zugespamt wird, wollte ich ein Captcha einbauen. Leider bekomme ich es nicht hin, und jetzt kommt ihr ins Spiel. Wer kann mir dabei helfen?
Hier der Code des Gästebuch welche eine Class-Datei ist
PHP-Code:
<?php
/**
* Datei-Ort : /klassen/Gaestebuch.klasse.php
* Zweck : Das komplette Gaestebuch
* Website : [url]http://www.webflips.de[/url]
* Kontakt : [email]info@webflips.de[/email]
* Datum : 13.08.2005
* Version : 2.0
*/
class Gaestebuch extends Interaktiv{
// bestimmt Ablauf des Programms im Konstruktor
private $aktion;
// bei neuem Eintrag/Bearbeiten stehen hier die eingegebenen
private $gaestebuch;
// Gibt beim Bearbeiten/Loeschen die "id" des Eintrags an
private $eintragsid;
// Text mit Eraeuterungen zum Gaestebuch, erscheint in der Eintrags-uebersicht
private $text = '
So könnte Ihr Gästebuch aussehen! Testen Sie es nach
Belieben.</p>';
/**
* Konstruktor uebergibt Datenbank-Handle an Elternklasse, setzt die Klassenvariablen. Dann
* folgt die Logik des Programmablaufs.
*/
public function __construct($dbh){
parent::__construct($dbh);
$this->aktion = $this->arrayElement($_GET, 'aktion');
$this->gaestebuch = $this->arrayElement($_POST, 'gaestebuch');
$this->eintragsid = $this->arrayElement($_GET, 'eintragsid');
switch($this->aktion){
case 'neuereintrag':
if(!$this->gaestebuch){
$this->zeigeForm();
return;
}
$this->ueberpruefeForm();
$this->baueFehlermeldung();
if($this->fehlermeldung){ // falls ein Formularfehler vorliegt
$this->zeigeForm();
return;
}
else{
// Eintrag in die Datenbank schreiben
$this->neuerEintrag();
}
break;
case 'bearbeiten':
if(!$this->gaestebuch){
$this->zeigeForm();
return;
}
$this->ueberpruefeForm();
$this->baueFehlermeldung();
if($this->fehlermeldung){
$this->zeigeForm();
return;
}
else{
// Eintrag in der Datenbank updaten
$this->eintragBearbeiten();
}
break;
case 'loeschen':
$this->eintragLoeschen();
break;
}
$this->zeigeGaestebuch();
}
/**
* Macht Objekt per "echo $Objekt" ausgabefaehig, "$this->html" wird ausgegeben.
*/
public function __toString(){
return $this->html;
}
/**
* Das Gaestebuch anzeigen. Zuerst wird die anzuzeigende Seite aus dem GET-String
* geholt (falls "false", dann Seite 1) und die Anzahl der bestehenden Eintraege geholt
* (siehe "Interaktiv::anzahlEintraege()"). Die Steuerungstabelle erhaelt links ein
* Jump-Menue und rechts den "Neuer Eintrag"-Button. Mit der folgenden SQL-Abfrage
* werden GAESTEBUCHEINTRAEGEPROSEITE Eintraege geholt fuer die entsprechend gewaehlte
* "$seite".Innerhalb der folgenden "while()"-Schleife werden dann die Eintraege geholt und
* dargestellt. Zum Abschluss folgt wieder die Steuerungstabelle.
*/
private function zeigeGaestebuch(){
// (int)-Typecasting, falls "$seite" nicht numerischen String enthaelt. So kann
// Fehlermeldung in der mySQL-Abfrage vermieden werden.
// (int)'String' gibt 0.
$seite = (int)$this->arrayElement($_GET, 'seite');
if(!$seite){
$seite = 1;
}
$eintraege = $this->anzahlEintraege('gaestebuch');
$this->html = $this->text;
$this->html .= $steuerung = $this->steuerung($this->jumpMenue($seite,
$eintraege,
GAESTEBUCHEINTRAEGEPROSEITE),
$this->steuerbutton('neuereintrag'));
// Starteintrag der LIMIT-Klausel bestimmen.
$starteintrag = ($seite - 1) * GAESTEBUCHEINTRAEGEPROSEITE;
$sql = "SELECT *, DATE_FORMAT(DatumZeit, '%d.%m.%y um %H:%i') AS DatumUndZeit
FROM gaestebuch
ORDER BY DatumZeit DESC
LIMIT $starteintrag, " . GAESTEBUCHEINTRAEGEPROSEITE;
$stmt = $this->dbh->vorbereiten($sql);
$stmt->ausfuehren();
$erg_zeilen = $stmt->num_rows();
$i = 0;
while($daten = $stmt->fetch_object()){
// HTML-codieren
$daten = $this->entities($daten);
// ueberschrift
$no = $eintraege - (($seite - 1) * GAESTEBUCHEINTRAEGEPROSEITE) - $i;
$Kopfbox = new Kopfbox("# $no ");
$this->html .= $Kopfbox->holeKopfbox();
$this->html .= '<table align="center" width="350">
<tr>
<td style="padding-left:10px; padding-bottom:10px; border-bottom:1px dotted #' . FARBTHEMA . '">
[b]' . $daten->Name . '[/b] schrieb am '. $daten->DatumUndZeit . '
';
if($daten->Ort){
$this->html .= "und war dabei gerade [b]$daten->Ort[/b]";
}
$this->html .= ' </td>
</tr>
<tr>
<td style="padding:10px;">';
$this->html .= nl2br($this->bbCode($daten->Kommentar));
$this->html .= ' </td>
</tr>';
// Zusaetzliche Tabellenzeile, falls Homepage oder E-Mail angegeben
if($daten->Email || $daten->Homepage){
$this->html .= '<tr><td align="center" style="padding:10px;">';
if($daten->Email){
$this->html .= '[email="' . $daten->Email . '"][img]layout/interaktiv/email.gif[/img][/email]';
}
if($daten->Homepage){
$this->html .= '[url="' . $daten->Homepage . '"][img]layout/interaktiv/homepage.gif[/img][/url]';
}
$this->html .= '</td></tr>';
}
// Falls Benutzer "admin" -> Bearbeiten/Loeschen-Button anzeigen
if($this->sichtbarkeitsrecht('admin')){
$this->html .= '<tr>
<td align="right">';
$this->html .= $this->steuerbutton('bearbeiten', $daten->id);
$this->html .= $this->steuerbutton('loeschen', $daten->id);
$this->html .= '</td></tr>';
}
$this->html .= '</table>';
// graphische Link zu Seitenanfang/ende
$this->html .= Pfeile::aufAbPfeile($i, $erg_zeilen);
$i++;
}
$stmt->free_result();
// ggf. etwas Raum schaffen
if($erg_zeilen < 3){
$this->html .= '<div class="raum"></div>';
}
// Steuerungs-Tabelle erneut ausgeben
$this->html .= $steuerung;
}
/**
* Eintrag loeschen. Nach ueberpruefung, ob es sich beim Benutzer um einen "admin" handelt,
* den Eintrag loeschen. Die "id" kommt dabei aus "$this->eintragsid" (siehe
* "Interaktiv::steuerbutton()".
*/
private function eintragLoeschen(){
$sichtrecht = $this->sichtbarkeitsrecht('admin');
if(!$sichtrecht){
echo UNBEFUGTERZUGRIFF;
return;
}
$sql = "DELETE FROM gaestebuch
WHERE id = :0";
$stmt = $this->dbh->vorbereiten($sql);
$stmt->ausfuehren($this->eintragsid);
}
/**
* Formular fuer neuen Eintrag/Bearbeiten anzeigen. Nach der "admin"-ueberpruefung wird
* zwischen Bearbeiten und neuem Eintrag unterschieden, um die "<input>" ggf. vorzubelegen.
* Sie sind nicht leer beim Bearbeiten (Daten kommen aus der Datenbank) oder wenn das
* Formular fehlerhaft abgeschickt wurde.
*/
private function zeigeForm(){
if($this->aktion == 'bearbeiten'){
$sichtrecht = $this->sichtbarkeitsrecht('admin');
if(!$sichtrecht){
echo UNBEFUGTERZUGRIFF;
return;
}
$titel = 'Gästebucheintrag bearbeiten';
if($this->fehlermeldung){
$namevalue = htmlspecialchars($this->gaestebuch['Name']);
$kommentarvalue = htmlspecialchars($this->gaestebuch['Kommentar']);
$ortvalue = htmlspecialchars($this->gaestebuch['Ort']);
$emailvalue = htmlspecialchars($this->gaestebuch['Email']);
$homepagevalue = htmlspecialchars($this->gaestebuch['Homepage']);
}
else{
$sql = "SELECT Name, Kommentar, Ort, Email, Homepage FROM gaestebuch
WHERE id = :0";
$stmt = $this->dbh->vorbereiten($sql);
$stmt->ausfuehren($this->eintragsid);
$daten = $stmt->fetch_row();
$daten = $this->specialcharsArray($daten);
list($namevalue, $kommentarvalue, $ortvalue, $emailvalue, $homepagevalue) = $daten;
}
}
else{
$titel = 'Ins Gästebuch eintragen';
$namevalue = ($this->fehlermeldung) ? htmlspecialchars($this->gaestebuch['Name']) : '';
$kommentarvalue = ($this->fehlermeldung) ? htmlspecialchars($this->gaestebuch['Kommentar']) : '';
$ortvalue = ($this->fehlermeldung) ? htmlspecialchars($this->gaestebuch['Ort']) : '';
$emailvalue = ($this->fehlermeldung) ? htmlspecialchars($this->gaestebuch['Email']) : '';
$homepagevalue = ($this->fehlermeldung) ? htmlspecialchars($this->gaestebuch['Homepage']) : '';
}
// ueberschrift
$Kopfbox = new Kopfbox($titel);
$this->html = $Kopfbox->holeKopfbox();
// Eintragsformular
$this->html .= '<form method="post" action="" name="hauptformular">';
$this->html .= '<table cellspacing="0" cellpadding="5">
<tr>
<td width="30%" align="center">Name</td>
<td width="70%" align="center">
<input name="gaestebuch[Name]" maxlength="' . BENUTZERNAMEMAXZEICHEN . '" type="text" style="width:240px;" value="'. $namevalue . '" />
</td>
</tr>
<tr>
<td align="center">Kommentar</td>
<td align="center"><textarea cols="55" rows="10" name="gaestebuch[Kommentar]" style="width:240px;height:125px; ">' . $kommentarvalue . '</textarea></td>
</tr>
<tr>
<td colspan="2">
<table width="100%" cellpadding="3" cellspacing="0">
<tr>
<td colspan="3" height="30" valign="bottom" align="center">[b][i]Und wenn Sie wollen, noch folgendes:[/i][/b]</td>
</tr>
<tr>
<td width="45%" align="center">Ich bin gerade</td>
<td width="10%"></td>
<td width="45%"><input name="gaestebuch[Ort]" type="text" style="width:200px;" maxlength="50" value="' . $ortvalue . '" /></td>
</tr>
<tr>
<td align="center">E-Mail</td>
<td align="right">[img]layout/interaktiv/email.gif[/img]</td>
<td>
<input name="gaestebuch[email]" type="text" style="width:200px;" maxlength="' . MAXEMAILLAENGE . '" value="' . $emailvalue . '" />
</td>
</tr>
<tr>
<td align="center">Homepage</td>
<td align="right">[img]layout/interaktiv/homepage.gif[/img]</td>
<td>
<input name="gaestebuch[Homepage]" type="text" style="width:200px;" maxlength="' . MAXHOMEPAGELAENGE . '" value="' . $homepagevalue . '" />
</td>
</tr>
<tr>
<td colspan="3" align="center" style="padding:30px 0px; ">
<input name="aktion_gaestebuch" type="submit" value="Eintragen" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<div class="raum"></div>';
// ggf. Fehlermeldung voranstellen
if($this->fehlermeldung){
$this->html = $this->fehlermeldung . $this->html;
}
}
/**
* Formular ueberpruefen. Prueft verschiedene Felder aus Vollstaendigkeit und Richtigkeit.
*/
private function ueberpruefeForm(){
// Felder auf Gleichheit mit bestehenden Eintraegen ueberpruefen
$vergleiche_werte = array($this->gaestebuch['Name'], $this->gaestebuch['Kommentar'],
$this->gaestebuch['Ort'], $this->gaestebuch['Email'],
$this->gaestebuch['Homepage']);
$vergleiche_felder = array('Name', 'Kommentar', 'Ort', 'Email', 'Homepage');
$this->vergleicheEintraege('gaestebuch', $vergleiche_werte, $vergleiche_felder);
$this->pruefeBenutzerBlock('gaestebuch', GAESTEBUCHBLOCKZEIT);
$this->pruefeLeer("Name", $this->gaestebuch['Name']);
$this->pruefeLeer("Kommentar", $this->gaestebuch['Kommentar']);
$this->pruefeMaxZeichen("Name", $this->gaestebuch['Name'], BENUTZERNAMEMAXZEICHEN);
$this->pruefeMaxZeichen("Ort", $this->gaestebuch['Ort'], 50);
$this->pruefeMaxZeichen("Email", $this->gaestebuch['Email'], MAXEMAILLAENGE);
$this->pruefeMaxZeichen("Homepage", $this->gaestebuch['Homepage'], MAXHOMEPAGELAENGE);
$this->pruefeWortlaenge("Kommentar", $this->gaestebuch['Kommentar'], MAXWORTLAENGE);
$this->pruefeWortlaenge("Ort", $this->gaestebuch['Ort'], 20);
$this->pruefeEmail($this->gaestebuch['Email']);
$this->pruefeURL($this->gaestebuch['Homepage']);
}
/**
* Neuen Eintrag vornehmen mit den Daten aus "$this->gaestebuch" und der aktuelle Uhrzeit
*/
private function neuerEintrag(){
$sql = "INSERT INTO gaestebuch (Name, DatumZeit, Ort, Kommentar, Email, Homepage)
VALUES (:0, NOW(), :1, :2, :3, :4)";
$stmt = $this->dbh->vorbereiten($sql);
$stmt->ausfuehren($this->gaestebuch['Name'],
$this->gaestebuch['Ort'],
$this->gaestebuch['Kommentar'],
$this->gaestebuch['Email'],
$this->gaestebuch['Homepage']);
$this->benutzerBlock('gaestebuch');
Aktuell::neuerEintrag($this->dbh, 'Neuer Eintrag');
}
/**
* Eintrag bearbeiten. mySQL-Tabelle "gaestebuch" mit den Daten aus "$this->gaestebuch"
* updaten.
*/
private function eintragBearbeiten(){
$sichtrecht = $this->sichtbarkeitsrecht('admin');
if(!$sichtrecht){
echo UNBEFUGTERZUGRIFF;
return;
}
$sql = "UPDATE gaestebuch
SET Name = :0, Ort = :1, Kommentar = :2, Email = :3, Homepage = :4
WHERE id = :5";
$stmt = $this->dbh->vorbereiten($sql);
$stmt->ausfuehren($this->gaestebuch['Name'],
$this->gaestebuch['Ort'],
$this->gaestebuch['Kommentar'],
$this->gaestebuch['Email'],
$this->gaestebuch['Homepage'],
$this->eintragsid);
}
}
?>
Hier der Code der Captcha Datei
PHP-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Demo für Captcha-Funktion</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
require_once( 'class.captcha.php' );
if (empty($_GET['session_code']))
{ $session_code = md5(round(rand(0,40000))); }
else
{ $session_code=$_GET['session_code']; }
$my_captcha = new captcha( $session_code, '__TEMP__/' );
$do = $_GET['do'];
if ($do == 'verify')
{
if ($my_captcha->verify( $_POST['password'] ) )
{
echo "You entered the correct password!";
exit;
}
}
$pic_url = $my_captcha->get_pic( 4 );
echo <<<FORM
<form name="form1" method="post" action="$PHP_SELF?do=verify&session_code=$session_code">
[img]captcha_image.php?img=$pic_url[/img]</p>
Displayed Code? <input type="text" name="password"></p>
<input type="submit" name="Submit" value="Überprüfen"></p>
</form>
FORM;
?>
</body>
</html>
Die captcha Datei heißt Demo.
Ich weiß einfach nicht wo ich welchen Code hinkopieren muss, falls das überhaupt reicht. Zum Captch gehören noch zwei andere .php files die sich aber auf die Demo Datei beziehen.
Wie gesagt brauche dringend Hilf