php-problem

von Karl., 26.11.07.

  1. Karl.

    Karl. Registrierter Benutzer

    Im Board seit:
    27.09.06
    Zuletzt hier:
    19.07.16
    Beiträge:
    444
    Zustimmungen:
    9
    Kekse:
    522
    Erstellt: 26.11.07   #1
    hallo liebe gemeinde.

    unser gästebuch wird seit einiger zeit mit spam zugemüllt. deshalb wollte ich es mit einem "captcha" schützen.

    sieht auch alles prima aus.

    das problem ist aber, dass ich auch ohne den richtigen code einzugeben, nachrichten schreiben kann.

    ich tippe auf eine nicht geschlossene "if"-bedingung.

    was meint ihr?


    Code:
    <?php
    
    session_start();
    
    if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
    
    unset($_SESSION['captcha_spam']); 
    
    }
    
     
    
    // Dateiname in Variable speichern
    
    $datei = "comment.txt";
    
    // Variable Kommentar gesetzt? Name und E-Mail nicht leer?
    
    if (isset($_POST['comment']) && $_POST['name'] != "" && $_POST['email'] != "") {
    
    $comment = $_POST['comment'];
    
    $name = $_POST['name'];
    
    $email = $_POST['email'];
    
    // Datei wird zum Schreiben-Lesen ge&ouml;ffnet
    
    $zeiger = fopen($datei, "r+");
    
    // alte Daten herauslesen und in $alt sichern
    
    $alt = fread($zeiger, filesize($datei));
    
    // E-Mail-Link entsteht
    
    $email = "<a href=\"mailto:$email\">$email</a>";
    
    // Datum ermitteln und formatieren
    
    $datum = date("j.n.Y");
    
    // HTML-Zeichen maskieren, Slashes entfernen, Zeilenumbr&uuml;che erhalten
    
    $comment = htmlspecialchars($comment);
    
    $comment = stripslashes(nl2br($comment));
    
    // Meinung "zusammensetzen"
    
    $meinung="<p><b>$name</b> ($email) schrieb am <i>$datum</i>:<br>$comment</p>\n";
    
    // unsichtbarer Cursor marschiert zum Anfang
    
    rewind($zeiger);
    
    // neue Meinung vor alte in Datei schreiben:
    
    fputs($zeiger, "$meinung \n $alt");
    
    // Datei schlie&szlig;en
    
    fclose($zeiger);
    
    }
    
    // Datei komplett anzeigen
    
    readfile($datei);
    
    ?>
    
     
  2. Xytras

    Xytras Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    06.10.05
    Zuletzt hier:
    28.09.16
    Beiträge:
    7.526
    Ort:
    Berlin
    Zustimmungen:
    521
    Kekse:
    44.039
    Erstellt: 26.11.07   #2
    wenn du interesse hast: ich hab ein GB mit spamfilter gebastelt, das ich Dir gerne zur verfuegung stelle und das z.b. auch schon bei Sam Razr anwendung gefunden hat und sich dort sowie auf allen meinen seiten ganz gut bewaehrt hat. Falls Du's haben willst, schreib mir einfach kurz ne PM.

    Edit: der fehler liegt, soweit ihc das auf den ersten blick ohne indent und syntax highlighting sehen kann am AND in der if-abfrage - '&&' sollte korrektes php sein. AND hab ich zumindest auf php.net bei ner schnellsuche nicht gefunden :)
     
  3. BenChnobli

    BenChnobli Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    27.09.06
    Beiträge:
    13.217
    Zustimmungen:
    2.445
    Kekse:
    70.523
    Erstellt: 28.11.07   #3
    Meiner Meinung nach tust du gar nichts. Du fragst zwar ab, ob der Captcha-Code richtig war. Das einzige, was du dann tust, ist du unsettest im Fehlerfall eine Session-Variable, danach geht es ganz normal weiter im Text, so als wäre gar kein Fehler aufgetreten (falls ich das jetzt auf die Schnelle richtig verstanden habe).

    Du könntest z.B. vor dem "// Dateiname in Variable speichern" ein:
    PHP:
    if (!isset($_SESSION['captcha_spam'])) die ("Das war eine Ohrfeige");
    setzen, oder sowas. Oder besser den gesamten Sicherungsvorgang in die Schleife mit einbeziehen und eine Fehlermeldung ausspucken, die einem legitmien Benutzer mit enfach falsch eingegebenem Code noch eine Chance gibt.

    Gruss, Ben
     
  4. Karl.

    Karl. Threadersteller Registrierter Benutzer

    Im Board seit:
    27.09.06
    Zuletzt hier:
    19.07.16
    Beiträge:
    444
    Zustimmungen:
    9
    Kekse:
    522
    Erstellt: 28.11.07   #4
    vielen dank für deine antwort. aber mittlerweile funktioniert es.

    bis auf die tatsache, dass bei einem falsch eingegebenen sicherheitscode das bisher geschriebene gelöscht wird (name, e-mail, kommentar).
     
  5. BenChnobli

    BenChnobli Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    27.09.06
    Beiträge:
    13.217
    Zustimmungen:
    2.445
    Kekse:
    70.523
    Erstellt: 28.11.07   #5
    Wenn dein Code sich jetzt aber nicht grundlegend geändert hat, müssten die Daten schon noch in $_POST[] vorhanden sein, es sei denn, du hast ne Weiterleitung oder sowas. Und wenn es darum geht, bei einem falschen Code dem Poster noch eine Chance zu geben, kann es nicht schaden, die Daten in der Session zu speichern, wo sie sicher aufgehoben sind (nur nicht vergessen, sie dann dort auch wieder zu löschen).

    Wie sieht denn dein Code-Schnipsel jetzt aus?

    Gruss, Ben
     
  6. Karl.

    Karl. Threadersteller Registrierter Benutzer

    Im Board seit:
    27.09.06
    Zuletzt hier:
    19.07.16
    Beiträge:
    444
    Zustimmungen:
    9
    Kekse:
    522
    Erstellt: 28.11.07   #6
    das ist der aktuelle (komplette) code fürs GB:

    Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <link rel="shortcut icon" href="favicon.ico" >
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>coldflame coverrock</title>
    <style type="text/css">
    <!--
    body {
     background-image: url();
     background-color: #000000;
     margin-top: 0px;
    }
    a:link {
     color: #FF6600;
    }
    a:visited {
     color: #FF9900;
    }
    .Stil14 {
     font-size: 16px;
     color: #FFFFFF;
     font-family: Arial;
     font-weight: bold;
    }
    .Stil17 {color: #FFFFFF; font-family: Arial; font-size: 12px; }
    .Stil18 {
     color: #FFFFFF;
     font-family: Arial;
     font-weight: bold;
     font-size: x-small;
    }
    a:hover {
     color: #FFFF00;
    }
    a:active {
     color: #FFFF66;
    }
    -->
    </style>
    <script language="JavaScript" type="text/JavaScript">
    <!--
     
    
    function MM_preloadImages() { //v3.0
      var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
        var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
        if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
    }
    //-->
    </script>
    </head>
     
    <body onLoad="MM_preloadImages('links-2.jpg')">
    <div align="center">
      <table width="861" border="0" cellspacing="1" bordercolor="#000000" bgcolor="#000000">
        <tr>
          <td width="12" rowspan="3">&nbsp;</td>
          <td><div align="center"><img src="images/index_2.jpg" width="198" height="121"></div></td>
          <td width="14" rowspan="3">&nbsp;</td>
        </tr>
        <tr>
          <td height="35">
            <p align="center"><span class="Stil18"><a href="index.html">zur&uuml;ck</a></span></p>
          <div align="center"></div></td></tr>
        <tr>
          <td>        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
                <div align="center">
     
     
     
    
                  <p><span class="Stil17">dein Kommentar:</span><br>
                      <textarea cols="55" rows="4" name="comment"></textarea>
                    <br>
                      <span class="Stil17">dein Name:</span><br>
                    <input type="text" name="name">
                    <br>
                      <span class="Stil17">deine E-Mail-Adresse:</span><br>
                    <input type="text" name="email">
                  </p>
                  <p>
             <img src="captcha/captcha.php" border="0" title="Sicherheitscode"> 
        <input type="text" name="sicherheitscode" size="5"><BR><BR>
        
                    <input type="submit" value="Ver&ouml;ffentlichen">
        
        
     
        <BR>
                  </p>
                </div>
          </form>        
            <p align="center" class="Stil14">Bisherige Eintr&auml;ge </p>
            <p align="center">&nbsp;        </p>        
            <table width="816" border="0" align="center">
              <tr>
                <td width="810" bgcolor="#000000"><div align="justify"><span class="Stil17">
                   
     
    <?php
     
    session_start();
    //if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
    //unset($_SESSION['captcha_spam']);
    //}else{
    //die ("Der Sicherheitscode ist falsch!");
    //} 
     
    
    // Dateiname in Variable speichern
    $datei = "comment.txt";
    // Variable Kommentar gesetzt? Name und E-Mail nicht leer?
    if (isset($_POST['comment']) && $_POST['name'] != "" && $_POST['email'] != "") {
      $comment = $_POST['comment'];
      $name = $_POST['name'];
      $email = $_POST['email'];
      // Datei wird zum Schreiben-Lesen ge&ouml;ffnet
      $zeiger = fopen($datei, "r+");
      // alte Daten herauslesen und in $alt sichern
      $alt = fread($zeiger, filesize($datei));
      // E-Mail-Link entsteht
      $email = "<a href=\"mailto:$email\">$email</a>";
      // Datum ermitteln und formatieren
      $datum = date("j.n.Y");
      // HTML-Zeichen maskieren, Slashes entfernen, Zeilenumbr&uuml;che erhalten
      $comment = htmlspecialchars($comment);
      $comment = stripslashes(nl2br($comment));
      // Meinung "zusammensetzen"
      $meinung="<p><b>$name</b> ($email) schrieb am <i>$datum</i>:<br>$comment</p>\n";
      // unsichtbarer Cursor marschiert zum Anfang
      rewind($zeiger);
      // neue Meinung vor alte in Datei schreiben:
    if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
    unset($_SESSION['captcha_spam']);  
      
      
      fputs($zeiger, "$meinung \n $alt");
    }else{
    //die ("Der Sicherheitscode ist falsch!");
    echo ("Der Sicherheitscode ist falsch!");
    }   
      
      // Datei schlie&szlig;en
      fclose($zeiger);
    }
     
    // Datei komplett anzeigen
    readfile($datei);
     
    ?>
                </span></div></td>
              </tr>
            </table>
            <p align="left">&nbsp;        </p>
          <p align="left">&nbsp;</p>        <p align="left">&nbsp;</p>        <p align="left">&nbsp;</p>        <p align="left">&nbsp;</p></td>
        </tr>
      </table>
    </div>
    </body>
    </html>
     
  7. BenChnobli

    BenChnobli Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    27.09.06
    Beiträge:
    13.217
    Zustimmungen:
    2.445
    Kekse:
    70.523
    Erstellt: 28.11.07   #7
    Ich sehe zwei Probleme: Erstens ein kleines, indem du
    PHP:
    session_start();
    nicht als ersten PHP-Befehl der Seite einführst (der ist viel weiter oben in der Benamsung des Formulars). Solltest du am besten ganz oben hinschreiben, damit kannst du dir viele kleine Ärgernisse ersparen.
    Zweitens füllst du das Formular nicht aus. Du gibst dem Gast ein leeres Formular, und wenn er es abschickt, ist es wieder leer. Da müsstest du dir noch eine Logik dazu überlegen, es im Falle eines falsch ausgefüllten Captcha in der Formulardefinition wieder zu haben. Such mal nach dem Stichwort Affenformular, auch für PHP hier nochmal schön erklärt. Damit kommt es dann sicher zu klappen.

    Ansonsten; frag einfach hier wieder, dein Ansatz ist schon OK
    Gruss, Ben
     
  8. Karl.

    Karl. Threadersteller Registrierter Benutzer

    Im Board seit:
    27.09.06
    Zuletzt hier:
    19.07.16
    Beiträge:
    444
    Zustimmungen:
    9
    Kekse:
    522
    Erstellt: 28.11.07   #8
    ok.
    dank meines arbeitskollegen funzt es jetzt einwandfrei.

    gästebuch

    danke nochmal an alle
     
  9. Sam Razr

    Sam Razr Registrierter Benutzer

    Im Board seit:
    22.10.05
    Zuletzt hier:
    1.06.15
    Beiträge:
    4.006
    Zustimmungen:
    12
    Kekse:
    4.279
    Erstellt: 05.12.07   #9
    jetzt bracuh ich auch mal eure Hilfe :(

    folgendes Script:

    XML Feed Parser aus PHP. Verwendet: MySQL Connect, class rss, feed.php

    inhalt class:

    Code:
    <?
    	
      class RSS
      {
    	public function RSS()
    	{
    		require_once ('./mysql_connect.php');
    	}
    		
    	public function GetFeed()
    	{
    		return $this->getDetails() . $this->getItems();
    	}
    		
    	private function dbConnect()
    	{
    		DEFINE ('LINK', mysql_connect (DB_HOST, DB_USER, DB_PASSWORD));
    	}
    		
    	private function getDetails()
    	{
    		$detailsTable = "webref_rss_details";
    		$this->dbConnect($detailsTable);
    		$query = "SELECT * FROM ". $detailsTable;
    		$result = mysql_db_query (DB_NAME, $query, LINK);
    			
    		while($row = mysql_fetch_array($result))
    		{
    			$details = '<?xml version="1.0" encoding="ISO-8859-1" ?>
    				<rss version="2.0">
    					<channel>
    						<title>'. $row['title'] .'</title>
    						<link>'. $row['link'] .'</link>
    						<description>'. $row['description'] .'</description>
    						<language>'. $row['language'] .'</language>
    						<image>
    							<title>'. $row['image_title'] .'</title>
    							<url>'. $row['image_url'] .'</url>
    							<link>'. $row['image_link'] .'</link>
    							<width>'. $row['image_width'] .'</width>
    							<height>'. $row['image_height'] .'</height>
    						</image>';
    		}
    		return $details;
    	}
    		
    	private function getItems()
    	{
    		$itemsTable = "bnp_news";
    		$this->dbConnect($itemsTable);
    		$query = "SELECT * FROM ". $itemsTable;
    		$result = mysql_db_query (DB_NAME, $query, LINK);
    		$items = '';
    		while($row = mysql_fetch_array($result))
    		{
    			$items .= '<item>
    				<title>'. $row["headline"] .'</title>
    				<link>'. $row["link"] .'</link>
    				<description><![CDATA['. $row["text"] .']]></description>
    			</item>';
    		}
    		$items .= '</channel>
    				</rss>';
    		return $items;
    	}
    	
    }
    	
    ?>
    
    Die MySQL Conn datei enthält alles wichtige, funktioniert super!

    Inhalt der Feed.php:

    Code:
    <?php  
    
    	  header("Content-Type: application/xml; charset=ISO-8859-1");  
    	  include("classes/RSS.class.php");  
    	  $rss = new RSS();  
    	  echo $rss->GetFeed();  
    ?>  
    Der Fehler liegt laut Parser in der Classes datei:

    Nur irgendwie weiss ich nicht genau wo der Fehler liegen soll :confused: :(

    Ich hoffe auf Hilfe.

    @klumpatsch:

    Warum verwendest du überhaupt sessions fürs Guestbook?
    Und der rest ist auch ziemlich komisch :confused:
     
  10. Karl.

    Karl. Threadersteller Registrierter Benutzer

    Im Board seit:
    27.09.06
    Zuletzt hier:
    19.07.16
    Beiträge:
    444
    Zustimmungen:
    9
    Kekse:
    522
    Erstellt: 06.12.07   #10
    keine ahnung:o. ist das was schlümmes?
    auf jeden fall funzt es prima.

    grüße

    patsch
     
  11. BenChnobli

    BenChnobli Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    27.09.06
    Beiträge:
    13.217
    Zustimmungen:
    2.445
    Kekse:
    70.523
    Erstellt: 06.12.07   #11
    Wenn ich richtig zähle, ist Zeile 10 in der Classes-Datei die Definition der GetFeed()-Funktion. Wenn sowas direkt nach einem include/require kommt, würde ich nochmal die ./mysql_connect.php, also die eingefügte Datei, sehr genau angucken, ob da nicht vielleicht ganz am Schluss ein Semikolon oder Klämmerchen fehlt, ob alle Klammern zu sind etc. pp.

    Gruss, Ben
     
  12. Sam Razr

    Sam Razr Registrierter Benutzer

    Im Board seit:
    22.10.05
    Zuletzt hier:
    1.06.15
    Beiträge:
    4.006
    Zustimmungen:
    12
    Kekse:
    4.279
    Erstellt: 06.12.07   #12
    hi, danke.

    Habs jetzt anders gelöst (viiiiiiiel einfacher :D).

    Wenn ihr wollt poste ich gerne

    Sam
     
  13. Xytras

    Xytras Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    06.10.05
    Zuletzt hier:
    28.09.16
    Beiträge:
    7.526
    Ort:
    Berlin
    Zustimmungen:
    521
    Kekse:
    44.039
    Erstellt: 10.12.07   #13
    Hab jetzt (um nochmal auf das GB-Problem zurueckzukommen) mein GB erweitert - es gibt 2 Versionen, eine Datenbankbasierte und eine Dateibasierte. Beide enthalten die features: spam-kennzeichnung ueber spam-liste und email benachrichtigung bei neuen eintraegen (damit man nicht dauernd ins eigene GB surfen muss, um eintraege mitzubekommen).
    Falls interesse besteht, kann jeder eine der Versionen gerne von mir bekommen (PN). :)
     
  14. Sam Razr

    Sam Razr Registrierter Benutzer

    Im Board seit:
    22.10.05
    Zuletzt hier:
    1.06.15
    Beiträge:
    4.006
    Zustimmungen:
    12
    Kekse:
    4.279
    Erstellt: 01.01.08   #14
    Hi, hätte da nochmal ein Problemchen :D

    Ich hab ne Tabelle mit 5 Namen.

    An verschiedenen Stellen sollen die Namen ausgegeben werden.

    Ich habs jetzt mit nem Array probiert:


    PHP:
    $count "0";

    $name[$count] = "".htmlentities($row['name'])."";

    $count += "1";

    An entsprechender Stelle dann:


    PHP:
    echo $name[4];

    Aber funktionieren tuts nicht wirklich. Er gibt mir dann nur 3 mal "Array" aus. Also das Wort. Ich weiss jetzt aucgh nicht weiter

    Kann mir wer helfen? ich steh da grad total aufm Schlauch. Ich hab keine Idee mehr wie ichs sonst amchen könnte


    Sam
     
  15. BenChnobli

    BenChnobli Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    27.09.06
    Beiträge:
    13.217
    Zustimmungen:
    2.445
    Kekse:
    70.523
    Erstellt: 01.01.08   #15
    Hast du denn gültige Werte in deinen Arrays?
    Was spucken dir print_r($row) und print_r($name) aus?

    Gruss, Ben
     
  16. Sam Razr

    Sam Razr Registrierter Benutzer

    Im Board seit:
    22.10.05
    Zuletzt hier:
    1.06.15
    Beiträge:
    4.006
    Zustimmungen:
    12
    Kekse:
    4.279
    Erstellt: 01.01.08   #16
    Hi,

    also print_r($row) gibt (in der schleife) alle datensätze der Tabelle aus.
    print_r($name) gibt (auserhalb der schleife) den aktuellsten gewünschten datensatz aus. in der schleife alle gewünschten datensätze.
    Das ist halt das Problem. ich kann das nicht innerhalb der schleife laufen lassen :confused:

    Eine weitere Frage noch:
    Ich möchte nach dem Abschicken eines scripts bei Erfolg auf eine andere Seite leiten.
    Also:
    PHP:
    if(mysql_affected_rows == 1)
    {
    //Hier Weiterleitung! }
    wie ist das zu realisieren. ICh habs mit Header probiert. Klappt aber nicht wirklich :D

    Hoffe auf Hilfe

    Sam
     
  17. BenChnobli

    BenChnobli Mod Emeritus Ex-Moderator HFU

    Im Board seit:
    27.09.06
    Beiträge:
    13.217
    Zustimmungen:
    2.445
    Kekse:
    70.523
    Erstellt: 02.01.08   #17
    Ich habe jetzt mal ein kleines Script gemacht, so wie ich das vielleicht handhaben würde. Vielleicht findest du im Vergleich was raus:
    PHP:
    <?php
    // definiere Array
    $name = array();

    // fülle das Array mit Daten
    $name[]="".htmlentities("hallo1")."";
    $name[]="".htmlentities("hallo2")."";
    $name[]="".htmlentities("hallo3")."";
    $name[]="".htmlentities("hallo4")."";
    $name[]="".htmlentities("hallo5")."";

    //Spuck's wieder aus
    for($i=0;$i<count($name);$i++) {
       echo 
    "<br />".$name[$i]."\n";
    }   
    ?>
    Die Weiterleitung mit
    PHP:
    header("Location: http://www.example.com/");
    funktioniert nur, wenn vorher noch gar nichts an den Browser ausgegeben wurde, nicht mal eine Leerzeile. Ist ein bisschen tricky, musst genau gucken.

    Gruss, Ben
     
  18. max1

    max1 Registrierter Benutzer

    Im Board seit:
    18.10.06
    Zuletzt hier:
    20.07.15
    Beiträge:
    1.036
    Ort:
    Koshigaya
    Zustimmungen:
    75
    Kekse:
    7.087
    Erstellt: 03.01.08   #18
    Danke, werds mal probieren!
     
  19. Sam Razr

    Sam Razr Registrierter Benutzer

    Im Board seit:
    22.10.05
    Zuletzt hier:
    1.06.15
    Beiträge:
    4.006
    Zustimmungen:
    12
    Kekse:
    4.279
    Erstellt: 03.01.08   #19
    Ja, ich auch. Melde mich morgen dazu!
     
  20. Sam Razr

    Sam Razr Registrierter Benutzer

    Im Board seit:
    22.10.05
    Zuletzt hier:
    1.06.15
    Beiträge:
    4.006
    Zustimmungen:
    12
    Kekse:
    4.279
    Erstellt: 30.01.08   #20
    Neues Problem:

    also folgende sache: ich versuche ein forum zu "Modden". Jetzt will ich den Avatar eines jeden Users auf der Startseite anzeigen. Die ganzen grundlagen: Kein Problem. Allerdings werden in dem forum (phpbb3) die images nicht als jpeg gespeichert. auslesen kann man die bilder mit: http://www.meinforum.de/board/download/file.php?avatar=2_1201439560.jpg.
    jetzt wird der avatar in der DB aber als der Link zu dem nicht bild file gespiechert. Ergo zeigt er mir das Bild so nicht an. Um das ganze zu ändern hab ich foölgendes versucht: den String zum nicht jpegfile zu exploden an den "/" klappt soweit, nur alles hinter dem letzten Slash wird mir nicht mehr angezeigt. $string[2] klappt noch, $string[3] is leer. Print_r zeigt mir auch nur alles ohne das file selbst an. der link zum file, also string ist das hier: http://www.meinboard.de/board/images/avatars/upload/2_1201439560.jpg
    Kann mir jemand helfen? Vll gibts irgendeine Funktion die ich nicht kenne

    also:

    aus
    PHP:
    http://www.meinedomain.de/board/images/avatars/upload/2_1201439560.jpg
    //soll
    //2_1201439560.jpg in
    $img 
    //gelegt werden


    Sam