Hallo zusammen,
gestern habe ich mal wieder nach meinem namen gegoogelt (mir war halt langweilig) und bin so drauf gekommen meine seite zu besuchen (klingt komisch, war da aber seit 1 jahr oder so nimmer drauf, die vegetiert halt vor sich hin.) Google hat auch gleich ausgegeben, dass meine Homepage ein Risiko für meinen Rechner sei, nach genauerem hinsehen entdeckte ich Malware die ich inzwischen schon entfernt habe, wobei ich noch immer net verstehe, wie es dazu kommt, dass irgend etwas den Quellcode meiner index.php verändert (iframes einbaut). Naja wie gesagt, dieses Problem ist ja inzwischen schon erledigt. Ich entdeckte aber noch ein Problem. Als ich auf "Gästebuch" klickte, lud er erst einmal eine ganze Weile, bevor er dann eine Seite ausspuckte, die elends lang war. Im endeffekt befanden sich in meinem Gästebuch ca. 70000 Spam- Einträge, die alle seit dem 1.9.08 erstellt wurden. kommen sekündlich ein paar dazu. "Dagegen musst was tun", dacht ich mir und googelte einmal gepflegt durch die gegend. auf einer Internetseite fand ich dann einen verbreiteten Lösungsansatz, die schlagen da vor, ne zufällige Rechnung einzubauen und sich vom poster das Ergebnis melden zu lassen, dann wird noch überprüft ob das ergebnis stimmt und gut is :P
Ich dachte so "hey, alles klar, so nen Pipifaxrechnung im einstelligen Bereich wird doch jeder lösen können, bevor er auf "eintragen" klickt!", und so hab ich da was in den code vom Gästebuch eingefügt.
Ferner habe ich nen meta-tag eingefügt, der es suchmaschinen verbietet, die seite zu listen und hab tabellenname in der datenbank und dateiname vom gästebuch verändert.
Dann fand ich noch einen Lösungsansatz mit einem Timesptamp, im Eingabeformular ist ein hidden form versteckt, das einen timestamp mitpostet. in der datei, die das ganze an die datenbank weitergibt, wird dann überprüft ob der timestamp älter als 5 sekunden ist und wenn ja gehts weiter, wenn nein, die ^^
wie au immer, hier ist jetzt mal der Quellcode der Datei "gästebuch.php", die inzwischen "gästebuch_fr4ncisn3u.php" heißt:
PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>francis-braun.de</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta name="robots" content="noindex, nofollow">
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper">
<!-- start header -->
<div id="header">
<h1></h1>
</div>
<!-- end header -->
<!-- start page -->
<div id="page">
<!-- start content -->
<div id="content">
<div class="post">
<h1 class="title">Gästebuch</h1>
<p class="byline"><small><br></small></p>
<div class="entry">
<p><center>
<form action="senden.php" method="post">
<table border="0" cellpadding="0" cellspacing="4">
<tr>
<td align="left">Name</td>
<td><input type="text" name="name" size="31" maxlength ="20" style="BACKGROUND-COLOR:transparent; border-bottom-color: #A7C9F6; border-top-color: #A0C2EF; border-right-color: #A7C9F6; border-left-color: #A0C2EF"></td>
</tr>
<tr>
<td align="left" valign="top">Deine Nachricht:</td>
<td valign="top"><textarea name="nachricht" cols="30" rows="5" wrap="soft" style="BACKGROUND-COLOR:transparent; border-bottom-color: #A7C9F6; border-top-color: #A0C2EF; border-right-color: #A7C9F6; border-left-color: #A0C2EF"></textarea></td>
</tr>
<tr>
<td align="right" colspan="2">
<?php
echo "<input type=\"hidden\" name=\"timestamp\" value=\"" . time() ."\">";
$random1 = rand(1,10);
$random2 = rand(1,10);
echo "Ergebnis von " . $random1 . " plus " .$random2 . ": ";
echo "<input type=\"text\" name=\"aufgabe\">";
echo "<input type=\"hidden\" name=\"loesung\" value=\"" . 4 * ($random1 + $random2) . "\">";
?>
<input type="submit" value="eintragen">
</td>
</table>
</form>
<br>
<br>
<?php
$verbindung = mysql_connect("localhost","*****","*****");
mysql_select_db("*****");
$abfrage = "SELECT id, datum, name, email, website, nachricht FROM gaestebuch_fr4ncisn3u ORDER BY id DESC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
$eintrag = wordwrap ($row->nachricht, 55, "<br>", true);
echo nl2br("<table width=400 border=1 tableborder=1 cellspacing=0 rules=none cellpadding=5><tr><td colspan=2 bgcolor='#B8E33C' border=1 align=left><b>$row->name</b></td></tr><tr><td colspan=2 valign='top' bgcolor='#B8E33C' align=left>$eintrag</td></tr></table><br><br>");
}
?>
</center></p>
</div>
</div>
</div>
<!-- end content -->
<!-- start sidebar -->
<div id="sidebar">
<?php
include 'nav.html';
?>
</div>
<!-- end sidebar -->
</div>
</div>
<!-- end page --><br><div id="footer">
<p> •  ©2008 All Rights Reserved • </p>
</div>
</body>
</html>
ich hoffe es ist übersichtlich genug xD, ist meine persönliche kleine art, die übersicht zu wahren und das funktioniert auch ganz gut xD
So und hier der code für die datei "senden.php":
PHP-Code:
<html>
<head>
<title>Gästebuch</title>
</head>
<body style="background-color:transparent;" text="darkblue" link="darkblue" alink="darkblue" vlink="darkblue">
<?php
$name = $_POST["name"];
$email = $_POST["email"];
$website = $_POST["website"];
$nachricht = $_POST["nachricht"];
if (( time() - $_POST["timestamp"] < 5 ) OR ( 4 * $_POST["aufgabe"] != $_POST["loesung"] ))
{
die("bots gehen nach hause <meta http-equiv='refresh' content='5; URL=gaestebuch_fr4ncisn3u.php'>");
}
else
{
$verbindung = mysql_connect("localhost","*****","*****");
mysql_select_db("*****");
$eintrag = "INSERT INTO gaestebuch_fr4ncisn3u
(name, email, website, nachricht)
VALUES
('$name', '$email', '$website', '$nachricht')";
$eintragen = mysql_query($eintrag);
if($eintragen == true)
{
echo "<br><center>Eintrag erfolgreich.<br>Sie werden in Kürze zum Gästebuch weitergeleitet.<br>Sollte die Weiterleitung nicht funktionieren, klicken Sie bitte <a href=gaestebuch.php>hier</a> <meta http-equiv='refresh' content='5; URL=gaestebuch_fr4ncisn3u.php'>";
}
else
{
echo "<br><center>Eintrag fehlgeschlagen.<br>Sie werden in Kürze zum Gästebuch weitergeleitet.<br>Sollte die Weiterleitung nicht funktionieren, klicken Sie bitte <a href=gaestebuch.php>hier</a> <meta http-equiv='refresh' content='5; URL=gaestebuch_fr4ncisn3u.php'>";
}
}
?>
</body>
</html>
so, nun dazu wie es gedacht ist: Der USer soll in die Felder "name" und "nachricht" einbegeb was er will, ohne dass der user es sieht wird ein timestamp ausgegeben und als post mitgesendet. wenn der user nun abschickt funktioniert das ganze nicht. denn in der senden datei werden 2 faktoren überprüft. zum einen überprüft die senden.php ob der timestamp 5 sekunden alt ist, somit sind schon einmal schnelle bots ausgeschaltet und er überprüft auch ob das ergebnis der rechenaufgabe stimmt. Das ergebnis ist zusätzlich wie ihr dem code entnehmen könnt mit 4 multipliziert, damit der bot es nicht einfach abschreiben braucht. es wird als überprüft ob das eingegebene ergebis *4 das ergebnis ist, das sich der rechner selbst ausrechnet (wird ja schon in der ursprungsdatei mit 4 multipliziert.
so. wenn ich nun hingehe und die seiten hochlade (übrigens zu sehen auf francis-braun.de), funktioniert das ganze, bin ich keine 5 sekunden auf der gästebuchseite und schreibe kein ergebnis -> kein eintrag, bin ich zwar 5 sekunden auf der seite gebe aber kein ergebnis ein -> kein eintrag, gebe ich ein ergebnis ein, tue dies jedoch schnell und bin somit keine 5 sekunden auf der seite -> kein eintrag. So ich total zufrieden mit mir selbst gewesen und direkt mal ab inne heia gegenagen und google nomal meine seite überprüfen lassen, damit der sicherheitshinweis weg geht ... google hat au keinen sicherheitshinweis mehr drauf aber heut morgen waren bestimmt 100 neue spameinträge in meinem gästebuch, ich weiß weder ein noch aus, bei mir funktioniert die funktion aber irgendwie muss der bot eine möglichkeit haben die zu umgehen.
könnt ihr mir vielleicht weiterhelfen?
Gruß Francis
/edit: übrigens: habe ne zeit lang vergessen, den namen der datenbank in der datei senden.php umzuändern, da kamen dann stundenlang keine einträge, vielleicht hilft es euch ja beim lösen, also fakt ist, dass dieser bot unr einträge machen kann, wenn der datenbankname in der senden.php auch stimmt, heißt also der muss da drüber drauf zugreifen, denke ich. schon komisch irgendwie o.O
/edit2: Hm, ich kam gerade einmal auf die dumme idee, die senden.php umzubenennen in senden_fr4ncisn3u.php ... hab auch das formular geändert, sodass es die posts jetzt an diese adresse sendet. gästbucheinträge lassen sich somit erstellen aber ich habe seit ca. ner viertel stunde keinen neuen spameintrag drinne. das ist schon ein echter fortschritt, hoffen wir, dass es so bleibt. in diesem falle wäre das problem erledigt, aber erst einmal abwarten ob das auch hilft. ferner habe ich auch in die neue sendendatei einen meta-tag eingebaut, der suchmaschinen verbietet, diese datei zu listen (sicher ist sicher), ich halt euch aufm laufenden