PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wirksame Methode bei Gästebuch Spam gibts hier:



dave
16.03.2006, 19:40
Hallo,

es gibt ja schon einige Methoden aber eigentlich finde ich die alle nicht gut.
Da die spammer eigentlich immer im folgenden format posten:

[url=blablalba (blablalba[/url)[url=blablalba (blablalba[/url)[url=blablalba[/url]

kann man eine einfache preg_match funktion anwenden da man in Gästbüchern normalerweise sowieso keine BB-Codes oder sonstiges erlaubt.

Das sieht dann so aus:



$text = $_POST['text'];
$result = preg_match("/\[url=.*\[\/url\]/", str_replace("\n","", "$text"));
if($result != 1) { mysql_query("INSERT ....)) } else {echo "fehler ....." die(); }

Erklärung: die Funktion preg_match sucht mit dem von mir eingegben Suchmuster nach diesen [url] tags und wenn er eine solche Kombination also anfang und endtag findet verweigert er den Insert in die Datenbank.

Einfach, schnell und sicher.

gruß,
dave

JensMJ
03.04.2006, 21:54
Hallo
Sieht super aus, aber entweder bin ich zu doof oder mir fehlt ein Zeichen. Wenn ich das so benutze kommt bei mir immer ein unexpected t String error.
Gruß MJ

heinerle
03.04.2006, 23:56
Hallo
Sieht super aus, aber entweder bin ich zu doof oder mir fehlt ein Zeichen. Wenn ich das so benutze kommt bei mir immer ein unexpected t String error.
Gruß MJ
na ganz ohne PHP-Kenntnisse geht es halt dann doch nicht.
Da das ganze nur ein Beispiel ist mußt Du die Ergänzungen schon selber vornehmen, passend für Dein Gästebuch.
Als Tip: Jede Zeichenkette, die mit " beginnt muß damit auch wieder geschlossen werden, außerdem muß jeder Befehl mit ; abgeschlossen werden ...

JensMJ
04.04.2006, 19:46
Hallo
Ja schon klar. Bisher sahs bei mir so aus:



// Formatierung des Textes aus dem Kommentarfeld
$comments = nl2br("$comments");
$comments = addslashes("$comments");
$url = Str_replace("http://","",$url);
mysql_query("INSERT into lwcguestbook (name, email, url, date, team, location, comments) VALUES ('$name', '$email', '$url', NOW(), '$team', '$location', '$comments')");
?>


Und die Abfrage nach den URLs wollte ich halt dazwischen setzen.

neu:


// Formatierung des Textes aus dem Kommentarfeld
$comments = nl2br("$comments");
$comments = addslashes("$comments");
$url = Str_replace("http://","",$url);
// abfrage gegen spam urls
$comments = $_POST['comments'];
$result = preg_match("/\[url=.*\[\/url\]/", str_replace("\n","", "$comments"));
if($result != 1) { mysql_query("INSERT into lwcguestbook (name, email, url, date, team, location, comments) VALUES ('$name', '$email', '$url', NOW(), '$team', '$location', '$comments'))) } else {echo "fehler Spam" die(); }


Ich gebe ja zu das ich nicht so der Freak bin, aber bisher habe ich das zusammenschreiben eigentlich immer hinbekommen.

Gruß MJ

heinerle
04.04.2006, 22:05
...
{ mysql_query("INSERT into lwcguestbook (name, email, url, date, team, location, comments) VALUES ('$name', '$email', '$url', NOW(), '$team', '$location', '$comments')")) } else {echo "fehler Spam" die(); }


Ich gebe ja zu das ich nicht so der Freak bin, aber bisher habe ich das zusammenschreiben eigentlich immer hinbekommen.
Du hast wie gesagt in mysql_query() das schließende " vergessen, außerdem eine ) zuviel (nach rechts scrollen zum Sehen)

JensMJ
05.04.2006, 11:53
Hallo
Geht auch nicht:

Parse error: parse error, unexpected '}' in /var/www/webxxx/html/lwc/lwcgb.php on line 994

Mich verwundert die Zeile mit dem Post.



$comments = $_POST['comments'];


Denn ich habe ja vorher überhaupt keine Variable namens Post.
Meins beginnt ja darüber mit send:



// wenn ein eintrag geschrieben werden soll
if($a == "send")
{

// Formatierung des Textes aus dem Kommentarfeld
$comments = nl2br("$comments");
$comments = addslashes("$comments");
$url = Str_replace("http://","",$url);
mysql_query("INSERT into lwcguestbook (name, email, url, date, team, location, comments) VALUES ('$name', '$email', '$url', NOW(), '$team', '$location', '$comments')");
?>
<h3>Thank you! your comment is entered</h3>
<a href="<?echo $PHP_SELF ?>?a=view">back to survey</a>
<?
}
// Datenbankverbindung beenden
mysql_close();
?>


Ich müsste doch aber da die Abfrage nach den URLs einfügen können so wie auch die nl2br und addslashes. Oder?
Gruß MJ

heinerle
05.04.2006, 12:03
...

Mich verwundert die Zeile mit dem Post.



$comments = $_POST['comments'];


Denn ich habe ja vorher überhaupt keine Variable namens Post.
...

$_POST ist ein Pseudo-Array, in dem die Variablen stehen, die von einem Formular mittels POST übergeben wurden:


<form action="gb.php" method="POST">
<input name="comments" type="text">
<input name="action" type="hidden" value="send"> ...
</form>

ergibt z.B. in gb.php Inhalte für die Variablen

$action=$_POST['a']; // send
$comments=$_POST['comments']; // was im Formular bei comments eingegeben wurde

Wenn Du die Variablen woanders her bekommst mußt Du das natürlich anpassen.

JensMJ
05.04.2006, 22:19
Hallo
Also ich habe jetzt nochmal ein paar Varianten versucht, aber ich schaffe es nicht. Ich bekomme es jetzt zwar eingebaut, aber die Sperre funzt nicht. Wenn ich testhalber ein Post mit urls eingebe werden die auch ganz normal angezeigt.

Hier mal mein kompletter Code:



<?php
if($a == "")
{
$a="view";
}
// Datenbankverbindung herstellen
mysql_connect("localhost","webxxx","xxx-xxx");
mysql_select_db("usr_webxxx_1");

// wenn "add" als aktion übergeben wird
if($a == "add")
{
?>
<h3></h3>
<FORM name="gb" id="gb" action="<?echo $PHP_SELF ?>" method="post" enctype="application/x-www-form-urlencoded">
<INPUT TYPE=hidden NAME=a VALUE=send>
<center><table border="0">
<tr><td width="30%">your name:</td><td width="10%">&nbsp;</td><td width="60%"><INPUT TYPE=text NAME=name></td></tr>
<tr><td width="30%">your e-mail adress:</td><td width="10%">&nbsp;</td><td width="60%"><INPUT TYPE=text NAME=email></td></tr>
<tr><td width="30%">your homepage:</td><td width="10%">http://</td><td width="60%"><INPUT TYPE=text NAME=url></td></tr>
<tr><td width="30%">your team:</td><td width="10%">&nbsp;</td><td width="60%"><INPUT TYPE=text NAME=team></td></tr>
<tr><td width="30%">your location:</td><td width="10%">&nbsp;</td><td width="60%"><INPUT TYPE=text NAME=location></td></tr>
<tr><td width="30%">your comment:</td><td width="10%">&nbsp;</td><td width="60%">&nbsp;</td></tr>
<tr><td colspan="3"><TEXTAREA NAME=comments COLS=60 ROWS=6></TEXTAREA></td></tr>
<tr><td colspan="3" align="center"><INPUT type="Submit" value="enter"></td></tr>
</table></center>
</FORM>
<a href="<?echo $PHP_SELF ?>?a=view">back to survey</a>
<?
}
// wenn view als aktion übergeben wird bzw. beim erstmaligen Seitenaufruf
if($a == "view")
{
switch ($eintrag) // das erste mal beim aufruf ist $eintrag undefiniert
{
case "";
$eintrag = "0"; // deswegen wertzuweisung 0
}
$zps = "5"; // anzeige der eintr&auml;ge pro Seite

//Zählen der Datensätze

$counter = mysql_query("SELECT Count(*) as total FROM lwcguestbook");
$eintraege = mysql_fetch_array($counter);

// Zusammensetzen der Unternavigation nächste, vorherige, erste, eintragen

echo "<center><table><tr bgcolor=\"#ededed\"><td>entries: ";
echo $eintraege[total];
echo "</td>";
echo "<td>[ ";
$back=$eintrag-5;
if ($back >= 0)
{
echo " <a href=\"$PHP_SELF?a=view&eintrag=";
echo $back;
echo "\">prior page</a> | ";
}
$eintragen = $eintrag + $zps;
if ($eintragen < $eintraege[total])
{
echo "<a href=\"$PHP_SELF?a=view&eintrag=";
echo $eintragen;
echo "\">next page</a> | ";
}
if ($eintrag > 4)
{
echo "<a href=\"$PHP_SELF?a=view";
echo "\">first page</a> | ";
}
echo "<a href=\"$PHP_SELF?a=add\">enter</a> ]</td></tr>";
echo "</table></center>";

echo "<center><table bgcolor=\"#ededed\" width=\"90%\" align=\"center\">";
echo "<hr color=\"#000099\">";
// Daten aus der Datenbank abfragen mit der Einschränkung $eintrag (d.h. welche ausgegeben werden sollen) und $zps (anzahl der anzuzeigenden elemente)
$result = mysql_query("SELECT name, email, url, date, team, location, comments FROM lwcguestbook order by date desc LIMIT $eintrag,$zps");
// Auslesen des Ergebnisse pro Reihe und Generierung der Seite
while ($row = mysql_fetch_row($result))
{
echo "<tr bgcolor=\"#ededed\"><td rowspan=\"5\" bgcolor=\"#000099\"><font size=\"8\">$count</font></td><td><B>name:</B></td><td>$row[0]</td><td><b>date:</b></td><td>$row[3]</td></tr>";
echo "<tr bgcolor=\"#ffffff\"><td><B>e-mail:</B></td><td colspan=\"3\"><A HREF=\"mailto:$row[1]\">$row[1]</a></td></tr>";
echo "<tr bgcolor=\"#ededed\"><td><B>homepage:</B></td><td colspan=\"3\"><A HREF=\"http://$row[2]\" target=\"_blank\">$row[2]</A></td></tr>";
echo "<tr bgcolor=\"#ffffff\"><td><B>team:</B></td><td>$row[4]</td><td><B>location:</B></td><td>$row[5]</td></tr>";
echo "<tr bgcolor=\"#ffffff\"><td><B>comment:</B></td><td colspan=\"3\">$row[6]</td></tr>";
echo "<tr><td colspan=\"5\"><hr color=\"#000099\"></td></tr>";
}
echo "</table>";

//Zählen der Datensätze

$counter = mysql_query("SELECT Count(*) as total FROM lwcguestbook");
$eintraege = mysql_fetch_array($counter);

// Zusammensetzen der Unternavigation nächste, vorherige, erste, eintragen

echo "<table><tr bgcolor=\"#d8d8d8\"><td>entries: ";
echo $eintraege[total];
echo "</td>";
echo "<td>[ ";
if ($back >= 0)
{
echo " <a href=\"$PHP_SELF?a=view&eintrag=";
echo $back;
echo "\">prior page</a> | ";
}
$eintragen = $eintrag + $zps;
if ($eintragen < $eintraege[total])
{
echo "<a href=\"$PHP_SELF?a=view&eintrag=";
echo $eintragen;
echo "\">next page</a> | ";
}
if ($eintrag > 4)
{
echo "<a href=\"$PHP_SELF?a=view";
echo "\">Erste Seite</a> | ";
}
echo "<a href=\"$PHP_SELF?a=add\">enter</a> ]</td></tr>";
echo "</table></center>";
}
// wenn ein eintrag geschrieben werden soll
if($a == "send")
{

// Formatierung des Textes aus dem Kommentarfeld
$comments = nl2br("$comments");
$comments = addslashes("$comments");
$url = Str_replace("http://","",$url);
mysql_query("INSERT into lwcguestbook (name, email, url, date, team, location, comments) VALUES ('$name', '$email', '$url', NOW(), '$team', '$location', '$comments')");
?>


<h3>Thank you! your comment is entered</h3>
<a href="<?echo $PHP_SELF ?>?a=view">back to survey</a>
<?
}
// Datenbankverbindung beenden
mysql_close();
?>


Mittlerweile habe ich schon 150 Spameinträge.

http://www.ellmies.de/lwc/lwcgb.php

Gib mir mal noch einen Tipp warum er die Sperre nicht anerkennt.
Gruß MJ

heinerle
05.04.2006, 22:55
...Gib mir mal noch einen Tipp warum er die Sperre nicht anerkennt.
Zuerst solltest Du wie gesagt Deine Variablenabfrage ändern.
Aus if($a == "add") sollte if($_GET['a'] == "add") werden, usw., aus if($a == "send") sollte


if($_POST['a'] == "send") {
$ comment=$_POST['comment'];
$url=$_POST['url'];
// etc.

werden, denn hier wird gePOSTet (<form method="POST">).

Dann solltest Du mal Deine Anführungszeichen korrigieren: Aus $comments = nl2br("$comments"); wird $comments = nl2br($comments); etc.

Da Du die Einträge mit ja komplett ausfiltern willst kannst Du hier mit strpos() arbeiten:


if(strpos($comments, "[url") !== FALSE { // ! und 2 Gleichheitszeichen !!!
mysql_query(...);
}

(vgl. [url]http://de.php.net/manual/de/function.strpos.php)

homer
06.04.2006, 08:55
if(strpos($comments, "[url") !== FALSE { // ! und 2 Gleichheitszeichen !!!
mysql_query(...);
}


Nein, hier nicht. Bei Prüfung auf Gleichheit nimmt man "==", bei Prüfung auf Ungleichheit dann "!=". Sonst gibt das einen Error.

heinerle
06.04.2006, 11:24
Nein, hier nicht. Bei Prüfung auf Gleichheit nimmt man "==", bei Prüfung auf Ungleichheit dann "!=". Sonst gibt das einen Error.

Laut Manual auf http://de.php.net/manual/de/function.strpos.php schon (zumindest ab PHP 4.0b3). Die Indizierung im String beginnt bei 0. Da strpos die Position liefert könnte man sonst FALSE von 0 nicht unterscheiden.
Bei mir liefert das zumindest keine Fehlermeldungen.