php-problem

Karl.
Karl.
Registrierter Benutzer
Zuletzt hier
25.07.22
Registriert
27.09.06
Beiträge
438
Kekse
512
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);

?>
 
Eigenschaft
 
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 :)
 
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
 
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

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).
 
...bis auf die tatsache, dass bei einem falsch eingegebenen sicherheitscode das bisher geschriebene gelöscht wird (name, e-mail, kommentar).
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
 
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>
 
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
 
ok.
dank meines arbeitskollegen funzt es jetzt einwandfrei.

gästebuch

danke nochmal an alle
 
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:

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /homepages/18/d161420766/htdocs/bgb/classes/RSS.class.php on line 10

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:
 
@klumpatsch:

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

keine ahnung:redface:. ist das was schlümmes?
auf jeden fall funzt es prima.

grüße

patsch
 
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
 
hi, danke.

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

Wenn ihr wollt poste ich gerne

Sam
 
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). :)
 
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
 
Hast du denn gültige Werte in deinen Arrays?
Was spucken dir print_r($row) und print_r($name) aus?

Gruss, Ben
 
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
 
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
 
Danke, werds mal probieren!
 
Ja, ich auch. Melde mich morgen dazu!
 
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
 

Unser weiteres Online-Angebot:
Bassic.de · Deejayforum.de · Sequencer.de · Clavio.de · Guitarworld.de · Recording.de

Musiker-Board Logo
Zurück
Oben