irc
eByteNet » Forum » Programmieren » PHP & MySQL » Gästebuch - Frage
Seiten: 1

18.09.2008 um 20:33:50
floriankr


Avatar von floriankr

Registriert: 05.04.2008
eBN-Alter: 9M 8T

Beiträge: 38
Verwarnungen: 0

eBytes: 481.8

Titel: Gästebuch - Frage
Hallo,

Ich habe auf meinem Ebytenet-Domain ein PHP-Gästebuch, ich gebe direkt zu Beginn zu, das Teile vom (mit Erlaubnis des jeweiligen!) kopiert sind.

Jedenfalls trägt man sich über die add.php ein und der Eintrag wird in der entries.csv abgespeichert. Der Inhalt davon wird dann in angepasster HTML-Darstellung auf der Webseite angezeigt. Davor geht er natürlich noch durch diverse Filter (BBcode, Stringparser, ...)

Nun haben sich letztens einen Haufen Spammer auf das GB gestürtzt, sodass ich täglich um die 100 sinnlose Einträge bekomme. Also habe ich den Code was abgeändert, sodass er in zuerst in eine seperate waiting.csv speichert.

Jetzt wollte ich ein php programmieren, mit dem ich nun auswählen kann, welche Einträge sinnvoll sind und welöche nicht und dass er die dann "rüberschiebt" in die entries.csv. Mein bisheriges Projekt sieht so aus:

Code:
<?php

$user     = '*********';
$password = '********';

require('shared.php');

$username = formdata('username');
$pwd      = formdata('pwd');
$mids     = formdata('mid');

$datafile = 'waiting.csv';
$showfile = 'entries.csv';

?>

<html>
<head>
<title>GB Administration: G&auml;stebucheintr&auml;ge freischalten</title>
</head>

<h1>Eintr&auml;ge ins &ouml;ffentliche G&auml;stebuch freischalten</h1>

<?php

if(read_waiting())
{
 if($username != '' && $pwd != '' && $mids != '' && $_SERVER['REQUEST_METHOD'] == 'POST')
 {
  if($pwd != $password || $username != $user) print '<p>Fehler: Benutzername oder Passwort sind falsch!</p>';
  else
  {
   $count = 0;

   $df = fopen($datafile,'a+');
   $of = fopen($showfile,'a+');
   $cont = file_get_contents($datafile);

   if(!$df) die;
   flock($df,LOCK_EX);

   fseek($df,0);

   $lines = read_waiting($df);

   foreach($mids as $mid)
   {
    for($x=0;$x<count($lines);$x++)
    {
     $fields = explode('|',$lines[$x]);
     $id     = $fields[0];

     if($id == $mid)
     {
      array_splice($lines,$x,1);
      $count++;
      break;
     }
    }
   }
   flock($of,LOCK_EX);

   ftruncate($df,0);
   fwrite($df,$lines);

   flock($df,LOCK_UN);
   fclose($df);

   $cut = str_replace($df,"",$cont);

   fwrite($of,$cut);

   flock($of,LOCK_UN);
   fclose($of);

   $msg_part = ($count == 1)
               ? 'Eintrag wurde'
               : 'Eintr&auml;ge wurden';

   print "<p>$count $msg_part freigeschaltet!</p>";
  }
 }

 if($lines = read_waiting())
 {
  print '<form action="allow.php" method="post">'."";
  print '<table border="0" style="margin-top:10pt;margin-bottom:10pt">'."";
  print "<tr>";
  print "<td><b>Name:</b></td>";
  print '<td><input type="text" name="username"></td>';
  print "</tr>";
  print "<tr>";
  print "<td><b>Passwort:&nbsp;</b></td>";
  print '<td><input type="password" name="pwd"></td>';
  print "</tr>";
  print "</table>";
  print '<table border="0" style="margin-top:10pt;margin-bottom:10pt">'."\n";

  foreach($lines as $line)
  {
   $fields = explode('|',$line);

   print '<hr noshade size="4" width="100%">';
   print '<table border="0" style="margin-top:10pt;margin-bottom:10pt">'."\n";
   print "<tr>\n";
   print '<td><input type="checkbox" name="mid[]" value="'.$fields[0]."\"></td>\n";
   print "<td><b>Name: $fields[1]</b></td>";
   print "</tr><tr>";
   print "<td>&nbsp;</td>";
   print '<td><b>Zeit: '.strftime('%d.%m.%Y/%H:%M:%S',$fields[4])."</b></td>";
   print '</tr><tr><td>&nbsp;</td><td><hr width="50%">'."</td><tr>";
   print "<td>&nbsp;</td>";
   print "<td>$fields[5]</td>";
   print "</tr>";
  }

  print "</table>\n\n";
  print '<p><input type="submit" name="allow" value="Gew&auml;hlte Eintr&auml;ge freischalten"></p>'."\n";
  print '<p><input type="submit" name="del" value="Alle Eintr&auml;ge l&ouml;schen"></p>'."\n</form>";
 }
}
else print '<p>Es sind keine Eintr&auml;ge vorhanden.</p>';

?>

</body>
</html>


Das Problem ist, wenn ich über http drauf zugreife, hört er nach dem ersten html-Block auf...
Ich hab schon alles probiert, was mi einfiel, aber ich fand nichts sinnvolles, oder einen Fehler.

schaut mal auf http://floriankr.ebytehost.com/gb/allow.php Das ist diese Datei.

Und wenn ihr euch schon dem Problem widmet: Wie bekomme ich so eine Sperre hin, dass er irgendwelche zufällige Bilder anzeigt und der User die dargestellte zeichenfolge abtippen muss, sodass automatische Einträge nicht möglich sind?

Wäre froh, wenn mir hier jemand helfen könnte....

Grüße, Florian
OFF Melden

19.09.2008 um 07:19:33
ReQuiem
ehemalig G3faX

Avatar von ReQuiem

Registriert: 15.01.2006
eBN-Alter: 2J 11M 28T

Beiträge: 423
Verwarnungen: 0

eBytes: 13747.8

Titel: Re: Gästebuch - Frage
Du kannst auch in dein Formular wo man den GB-Eintrag schreibt einen Captcha-Code einbauen das ist soein mit php generierte Bild wo Zeichen drinstehen die der Benutzer ersteinmal in ein Feld eingeben muss bevor er das Formular abschicken kann.

Ein kleines beispiel für einen solchen Captcha-Code:
Quelle: Dreamcodes.biz
PHP-Code:
<?php /*
example of usage:

inside your form
<input type="text" name="validator" id="validator" size="4" />
<img src="random.php" alt="CAPTCHA image" width="60" height="20" vspace="1" align="top" />

and test the value of the "validator" form field like:
if (!empty($_POST['validator']) && $_POST['validator'] == $_SESSION['rand_code']) {
    process your form here
    at least destroy the session
    unset($_SESSION['rand_code']);
*/

// save this code in your random script
session_start();

if (empty(
$_SESSION['rand_code'])) {
    
$str "";
    
$length 0;
    for (
$i 0$i 4$i++) {
        
// this numbers refer to numbers of the ascii table (small-caps)
        
$str .= chr(rand(97122));
    }
    
$_SESSION['rand_code'] = $str;
}

$imgX 60;
$imgY 20;
$image imagecreatetruecolor(6020);

$backgr_col imagecolorallocate($image238,239,239);
$border_col imagecolorallocate($image208,208,208);
$text_col imagecolorallocate($image46,60,31);

imagefilledrectangle($image006020$backgr_col);
imagerectangle($image005919$border_col);

$font "VeraSe.ttf";
$font_size 10;
$angle 0;
$box imagettfbbox($font_size$angle$font$_SESSION['rand_code']);
$x = (int)($imgX $box[4]) / 2;
$y = (int)($imgY $box[5]) / 2;
imagettftext($image$font_size$angle$x$y$text_col$font$_SESSION['rand_code']);

header("Content-type: image/png");
imagepng($image);
imagedestroy ($image);
?>


Desweiteren könnte man noch die IP des Benutzers der einen Eintrag gemacht hat für vllt. 10 oder 15 mins sperren falls jemand vorm PC sitzt und manuell reinspammt ^^ (Zeit kannst ja auch länger wählen, wie du willst halt ^^)


MfG ReQuiem ;)
OFF Melden

19.09.2008 um 09:01:19
Species-8472
Administrator

Avatar von Species-8472

Registriert: 09.09.2006
eBN-Alter: 2J 4M 1T

Beiträge: 300
Verwarnungen: 0

eBytes: 502.14

Titel: Re: Gästebuch - Frage
Schönen guten Tag,
da ich natürlich mir das ganze mal "anschauen" wolte bin ich einmal fix auf deine Side gegangen. Jetzt mal abgesehen davon das du für die daten die du speicherst ne csv datei nurtzt würde ich dich doch bitten diesen ständigen reload rauszunehmen ...

Zum Thema, wie schon gesagt würde ich dir a) ne Datenbank empfehlen b) eine IP sperre so wies ja schon beschrieben wird und c) einen captcher falls nach IP sperre wnoch nötig.
Man kann es natürlich auch so machen wie du es gerne hättest. dafür würde ich einen kleinen admin bereich schreiben und alle frischen Gästebuch einträge einfach nen 1 oder 0 verpassen die du in diesem bereich den umschreibst und somit die einträge anzeigt.

mfg Species
_______________________________

OFF Melden

19.09.2008 um 12:13:57
bop3


Avatar von bop3

Registriert: 14.07.2006
eBN-Alter: 2J 5M 28T

Beiträge: 279
Verwarnungen: 0

eBytes: 2609.18

Titel: Re: Gästebuch - Frage
und wieder kann ich nur sagen:
reCAPTCHA

Ich hab das auf einer Seite bei mir eingebaut und hab seither keine Probleme mehr mit Spam-Bots!
Geht leicht zum einbaun und hat auch ne Funktion für Sehbehinderte Menschen eingebaut. denen wird dann was vorgelesen.
_______________________________

OFF Melden

19.09.2008 um 14:57:01
QuasimodosKlon


Avatar von QuasimodosKlon

Registriert: 09.08.2008
eBN-Alter: 5M 1T

Beiträge: 273
Verwarnungen: 0

eBytes: 4545.04

Titel: Re: Gästebuch - Frage
Fehlerausgabe einschalten:
PHP-Code:
 error_reporting(E_ALL E_STRICT E_COMPILE_ERROR);
ini_set('display_errors'"stdout");
ini_set('display_startup_errors'true); 

Dann weißt Du mehr. Ggf. die Fehlerausgabe hier posten. Nach der Testphase wieder entfernen.

Als wahrscheinliche Ursache vermute ich, daß auf die Dateien keine Schreibzugriffsrechte für den Webserver bestehen. Existieren diese gar nicht, braucht der Server Schreibrechte auf das Verzeichnis, wo sie angelegt werden sollen.

Soweit ich das noch im Sinn habe, laufen bei eBN Skripte mit den Rechten des Benutzers "www" und Dateien und Verzeichnisse, die man anlegt, erhalten die Gruppe www. In dem Fall müßtest Du ein Verzeichnis für die CVS anlegen und die Rechte 770 erteilen, um dem Server das Anlegen von Dateien zu ermöglichen oder die Dateien selbst mit den Rechten 660 erstellen, damit sie für den Server beschreibbar werden. (Ausführungrechte für Verzeichnisse werden zum Auflisten und Wechseln in die Verzeichnisebene benötigt).

LG Helge
_______________________________

Klarer Verfechter der alten Rechtschreibung!

Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null. Und das nennen sie dann ihren Standpunkt.
Albert Einstein
OFF Melden

.::Werbung::.


eByteNet » Forum » Programmieren » PHP & MySQL » Gästebuch - Frage
Seiten: 1

Du hast in diesem Forum keine Schreibrechte!

Computer Notdienst in Leipzig | Software Installtionsservice | Computer