maria: kleines prob mit besucherumfrage

Hi.

In meiner selbst programmierten Benutzerumfrage (PHP) kann man leider Gottes immer noch so oft anstimmen wie man will, und somit das ergebnis verfälschen. Auf welche Art und Weise kann ich das verhindern?

Und noch was. Wieso tut dieses Script nur immer zwei Kommentare (über eine Textare mit dem namen $comment) ausgeben, obwohl drei oder mehr drin sein sollten???

Quelltext:

/* Kommentar in Datei schreiben */
/* Daten so bearbeiten, dass sie nachher richtig angzeigt werden können */

echo "<h3>Kommentare:<br></h3>";

if(!empty($comment)){

$comment=strip_tags($comment); //entfernt HTML-Tags
$comment=$comment."<br><hr>\r\n"; //fügt einen Zeilenumbruch IN DIE DATEI ein und anderen SchnickSchnack

/* Wenn nicht der Admimnereich aufgerufen wurde, dann schreibe Daten in Datei */
if(!($comment==$Adminpw)){
 $path_comment="db/comments.txt";

// Inhalt aus Datei holen. Dann mit eingegebenen Text verbinden
 $open_comment_r=fopen($path_comment,"r");
   $inhalt_der_datei=fgets($open_comment_r,9999999);
   $inhalt_zusammen = $comment.$inhalt_der_datei;
 fclose($open_comment_r);

// Inhalt der Datei löschen, in dem man mit "" überschreibt
 $open_comment_l=fopen($path_comment,"w+");
   fwrite($open_comment_l, "");
 fclose($open_comment_l);

// Daten in die Datei schreiben
 $open_comment_w=fopen($path_comment,"a");
   fputs($open_comment_w,$inhalt_zusammen);
 fclose($open_comment_w);

// Dateiinhalt ausgeben
   require("db/comments.txt");

Ich freue mich schon auf eure antworten

  1. Hi,

    In meiner selbst programmierten Benutzerumfrage (PHP) kann man leider Gottes immer noch so oft anstimmen wie man will, und somit das ergebnis verfälschen. Auf welche Art und Weise kann ich das verhindern?

    Das einfachste ist wohl eine IP-Sperre. Wenn jemand seine Stimme abgegeben hat, wird seine IP solange gesperrt, bis ein anderer mit einer anderen IP angestimmt hat. Das verhindert zwar nicht, dass sich jemand immer neu einwählen kann (uns so immer eine neue IP bekommt), aber diesen Aufwand wird wohl niemand treiben, wenn es sich nicht um eine wirkölich wichtige Abstimmung handelt. Ein weiteres Problem sind Haushalte/Büros, die sich eine IP teilen (Stichwort: NAT). Hier kann dann immer nur einer abstimmen, ein zweiter muss warten, bis ein völlig Unbeteiligter seine Stimme abgegeben hat.

    Das sicherste ist aber wohl eine Benutzeranmeldung. Ohne Anmeldung kann man seine Stimme nicht abgeben. Bei der Anmeldung kannst du dann ausführlich prüfen, ob sich ein Benutzer nicht mehrfach angemeldet hat. Sobald der Benutzer dann seine Stimme abgegeben hat, wird er für die Abgabe weitere Stimmen gesperrt.

    Viele Grüße...

    Alex :)

  2. Halihallo maria

    In meiner selbst programmierten Benutzerumfrage (PHP) kann man leider Gottes immer noch so oft anstimmen wie man will, und somit das ergebnis verfälschen. Auf welche Art und Weise kann ich das verhindern?

    Neben den von Alexander vorgeschlagenen Lösungen, wollte ich noch
    Cookies anfügen. Bei jedem User der sich bei der Umfrage beteiligt
    hat, wird ein Cookie gesetzt (sieh mal in der PHP-Doku unter
    set_cookie). Falls dieser bei der Umfrage bereits gesetzt war, wird
    der User ausgeschlossen. Wie bei der IP-Sperre, hast du auch hier
    absolut keine 100% möglichkeit Missbrauch zu unterbinden. Die
    sicherste Möglichkeit ist - wie Alexander bereits sagte - eine
    Anmeldung.

    Und noch was. Wieso tut dieses Script nur immer zwei Kommentare (über eine Textare mit dem namen $comment) ausgeben, obwohl drei oder mehr drin sein sollten???

    keine Ahnung.

    Quelltext:

    // Inhalt aus Datei holen. Dann mit eingegebenen Text verbinden
    $open_comment_r=fopen($path_comment,"r");
       $inhalt_der_datei=fgets($open_comment_r,9999999);
       $inhalt_zusammen = $comment.$inhalt_der_datei;
    fclose($open_comment_r);

    Was passiert, wenn du mal mehr als 9.9kb Kommentare hast?

    // Inhalt der Datei löschen, in dem man mit "" überschreibt
    $open_comment_l=fopen($path_comment,"w+");
       fwrite($open_comment_l, "");
    fclose($open_comment_l);

    Schrecklich! - Lies bei PHP schnell nach, was der Modus "w+" macht
    und sage dann, warum dieser ganze Block *nicht* nötig ist.

    // Daten in die Datei schreiben
    $open_comment_w=fopen($path_comment,"a");
       fputs($open_comment_w,$inhalt_zusammen);
    fclose($open_comment_w);

    Öffne die Datei einfach mit "w+"!

    require("db/comments.txt");

    Schrecklich! Was meinst du was ein <? /* böser Code */ ?> in einem
    Kommentar für Konsequenzen hat, wenn du mal aus versehen strip_tags
    nicht mehr im Script stehen hast? - Lies die Datei um Himmels Willen
    über Dateioperationen ein und gib den Inhalt über echo aus. Verwende
    require *ausschliesslich nur genau dann*, wenn du dem Inhalt der
    inkludierten Datei 100% vertrauen kannst!

    Viele Grüsse

    Philipp

    1. Halihallo maria

      tach auch

      // Inhalt aus Datei holen. Dann mit eingegebenen Text verbinden
      $open_comment_r=fopen($path_comment,"r");
         $inhalt_der_datei=fgets($open_comment_r,9999999);
         $inhalt_zusammen = $comment.$inhalt_der_datei;
      fclose($open_comment_r);

      Was passiert, wenn du mal mehr als 9.9kb Kommentare hast?

      Wie wieviel kb akzeptiert fgets? Und was ist, wenn ich dann mehr als die akzeptierten kb hab?

      // Inhalt der Datei löschen, in dem man mit "" überschreibt
      $open_comment_l=fopen($path_comment,"w+");
         fwrite($open_comment_l, "");
      fclose($open_comment_l);

      Schrecklich! - Lies bei PHP schnell nach, was der Modus "w+" macht
      und sage dann, warum dieser ganze Block *nicht* nötig ist.

      Ein Freund von mir hatte mir das geraten. Ich habe mich nicht so darum gekümmert, wenn ich ehrlich bin. Aber jetzt weiß ichs. w+ überschreibt alles was sich in der Datei befindet. Deshalb kann ich diesen Block weglassen und den unteren mit w+ öffnen.

      // Daten in die Datei schreiben
      $open_comment_w=fopen($path_comment,"a");
         fputs($open_comment_w,$inhalt_zusammen);
      fclose($open_comment_w);

      Öffne die Datei einfach mit "w+"!

      Siehe oben...

      require("db/comments.txt");

      Schrecklich! Was meinst du was ein <? /* böser Code */ ?> in einem
      Kommentar für Konsequenzen hat, wenn du mal aus versehen strip_tags
      nicht mehr im Script stehen hast?

      Was macht echo anders? er gibt auch den Dateiinhalt aus. Dann hat ein böser Code auch die gleichen Konsequenzen. Oder liege ich da falsch?

      Viele Grüsse

      Dir auch

      Philipp

      maria

      1. Was macht echo anders? er gibt auch den Dateiinhalt aus. Dann hat ein böser Code auch die gleichen Konsequenzen. Oder liege ich da falsch?

        Nein Du liegts da nicht falsch, nur hast Du das Problem nicht erkannt.
        Man sollte die Ausgabe vor bösem Code schützen
        Sprich bevor Du die Daten ausgibst mit stripslash besser noch htmlentities () behandeln.

        TomIRL

        1. ... stripslash ...

          das heißt stripslashes :-) . Trotzdem danke für den Tip.

      2. Halihallo maria

        Was passiert, wenn du mal mehr als 9.9kb Kommentare hast?
        Wie wieviel kb akzeptiert fgets? Und was ist, wenn ich dann mehr als die akzeptierten kb hab?

        Allgemein der falsche Ansatz. Eine grosse Datei wird stückweise
        verarbeitet:

        $fhw=fopen($path_comment_neu, 'w+');
        $fh=fopen($path_comment, 'r');
        fputs($fhw,$comment);  // neuer
        while ( $s = fgets($fh,4096) ) {
           fputs($fhw,$s);
        }
        unlink($path_comment);
        rename($path_comment_neu,$path_comment);

        So kommst du ohne Speicherung der gesamten Datei aus, man verwendet
        nur einen Buffer von 4096 Bytes und ein paar Strings. Das kostet
        weniger RAM-Speicher als eine 2MB Datei in den Speicher zu laden ;)

        Schrecklich! - Lies bei PHP schnell nach, was der Modus "w+" macht
        und sage dann, warum dieser ganze Block *nicht* nötig ist.

        Ein Freund von mir hatte mir das geraten. Ich habe mich nicht so darum gekümmert, wenn ich ehrlich bin. Aber jetzt weiß ichs. w+ überschreibt alles was sich in der Datei befindet. Deshalb kann ich diesen Block weglassen und den unteren mit w+ öffnen.

        Richtig, gut.

        require("db/comments.txt");

        Schrecklich! Was meinst du was ein <? /* böser Code */ ?> in einem
        Kommentar für Konsequenzen hat, wenn du mal aus versehen strip_tags
        nicht mehr im Script stehen hast?

        Was macht echo anders? er gibt auch den Dateiinhalt aus. Dann hat ein böser Code auch die gleichen Konsequenzen. Oder liege ich da falsch?

        Echo gibt den Dateiinhalt aus, require führt den Code aus! - Sprich,
        jeder kann (ohne strip_tags oder Enkodierungsmassnahmen) PHP Code
        auf deinem Webserver ausführen! Das ist ein gravierender Unterschied,
        insofern ja, du liegst falsch.
        Allgemein gilt der Grundsatz: require nur bei PHP-Dateien denen man
        100%-ig vertrauen kann. Für alles andere gibt es normale
        Dateioperationen (z.B. fpassthru).

        @TomIRL: Dein Hinweis ist natürlich richtig. Mir ginge es aber um die
                 unmittelbare Gefahr von require und ausführbarem Code.

        Viele Grüsse

        Philipp

        1. @TomIRL: Dein Hinweis ist natürlich richtig. Mir ginge es aber um die
                   unmittelbare Gefahr von require und ausführbarem Code.

          Da hast Du natürlich Recht...
          Den Part hab Ich Dir auch zur Beantwortung überlassen :-)
          ICh habe lediglich die Frage beantwortet, den wenn Sie echo äquivalent zu require verwendet macht es tatsächlich keinen Unterschied.
          Der böse Cod wird trotzdem dargestellt.

          TomIRL