kla_kal
January 13, 2008, 8:09pm
#1
Ausgerechnet heute hat so ne miese Dreck*** des Gästebuch von meinem Jugendraum zugespammt!
Da Spam nicht das erste mal war hab ich vorgestern versucht mit $REMOTE_ADDR die IP zu speichern. Im nachhinein vermute ich aber anhand der IP(ist von United-Domains) nur die IP der Domain speichert.
Wie muss ich das machen damit auch wirklich die richtige IP gespeichert wird?
Wie unterbinde ich das mit den Scripteingaben am besten?
Hier die Einträge die gemacht wurden:
[code]test
test2
[/code]
Hier mal mein Script.
[code]<?php
$site_title = “Jugendraum Heidenheim - Gästebuch”;
include “inc/head.php”;
$ipadress =$REMOTE_ADDR;
$entries_per_page = 30; // Abzahl Eintraege pro Seite
$table_name = “guestbook”; // Name der Tabelle fuer Gaestebuch
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or
die(“Fatal error: Could not connect to database.”);
mysql_select_db("$mysql_dbname") or
die(“Fatal error: Could not select database.”);
$action = $_REQUEST[‘action’];
if (!isset($action))
$action = 0;
if ($action == 0)
{
// Gaestebuch Default-Ansicht
?>
Gästebuch
Einträge
<?php
$result = mysql_query("show tables");
if (!$result)
{
echo "Fatal error: Could not list tables.\n";
exit;
}
$found = false;
while ($row = mysql_fetch_array($result))
{
if (strcmp($row[0], $table_name) == 0)
$found = true;
}
$page = $_REQUEST['page'];
if (!isset($page))
$page = 1;
if (!$found)
mysql_query("create table $table_name (id integer auto_increment primary key, name varchar(255), email varchar(255), remark text)");
$result = mysql_query("select * from $table_name order by id desc limit 1");
if (($row = mysql_fetch_array($result)) !== false)
{
$num_pages = (int)($row['id'] / $entries_per_page) + 1;
if ($page > $num_pages)
$page = $num_pages;
if ($page < 1)
$page = 1;
$start_id = $row['id'] - (($page - 1) * $entries_per_page);
$end_id = $start_id - $entries_per_page + 1;
if ($end_id < 0)
$end_id = 0;
mysql_free_result($result);
echo "Einträge mit Msg-ID $start_id...$end_id ";
$result = mysql_query("select *, date_format(entry_date,'%d.%m.%Y')AS entry_date, time_format(entry_time,'%H:%i')AS entry_time FROM $table_name where (id <= $start_id) and (id >= $end_id) order by id desc");
while ($row = mysql_fetch_array($result))
{
$remark = str_replace(':cool:'," ", $row['remark']);
$remark = str_replace(':)'," ", $remark);
$remark = str_replace(':-)'," ", $remark);
$remark = str_replace(':('," ", $remark);
$remark = str_replace(':-('," ", $remark);
$remark = str_replace(':D'," ", $remark);
$remark = str_replace(':-D'," ", $remark);
$remark = str_replace(';)'," ", $remark);
$remark = str_replace(';-)'," ", $remark);
$remark = str_replace(':?'," ", $remark);
$remark = str_replace('=)'," ", $remark);
$remark = str_replace(':P'," ", $remark);
$remark = str_replace(':-P'," ", $remark);
$remark = str_replace(':grins:'," ", $remark);
$remark = str_replace('*g*'," ", $remark);
$remark = str_replace('lool'," ", $remark);
$remark = str_replace(':neid:'," ", $remark);
$remark = str_replace(':birthday:'," ", $remark);
$remark = str_replace(':kotz:'," ", $remark);
$remark = str_replace(':schaf:'," ", $remark);
$remark = str_replace(':new:'," ", $remark);
$remark = str_replace(':bier:'," ", $remark);
$remark = str_replace(':prost:'," ", $remark);
$remark = str_replace(':hehe:'," ", $remark);
$remark = str_replace(':herz:'," ", $remark);
$remark = str_replace(':motz:'," ", $remark);
$remark = str_replace(':schimpf:'," ", $remark);
$remark = str_replace(':freak:'," ", $remark);
$remark = str_replace(':heul:'," ", $remark);
echo "
" . $row['name'] . " ";
if(empty($row['homepage']))
{
}
else
{
echo" ";
}
echo" [" . $row['entry_date'] . " | " . $row['entry_time'] . " | Msg-ID " . $row['id'] . " ]
";
echo " ";
}
mysql_free_result($result);
echo "";
for ($i = 1; $i <= $num_pages; $i++)
{
if ($i == $page)
echo " [$i] ";
else
echo " $i ";
if (($i % 20) == 19)
echo " ";
}
echo " ";
}
echo "
";
}
else
{
$name = $_REQUEST['name'];
$email = $_REQUEST['email'];
$homepage = $_REQUEST['homepage'];
$remark = $_REQUEST['remark'];
if ((strlen($name) > 0) &&
(strlen($email) > 0) &&
(strpos($remark, "http://") === false))
{
mysql_query("insert $table_name set name=\"$name\", homepage=\"$homepage\", email=\"$email\", remark=\"$remark\", entry_date=curdate(), ipadress=\"$ipadress\", entry_time=curtime()");
echo "
Eintrag wurde hinzugefügt:";
echo "
Name:
$name
E-Mail:
$email
Nachricht:
$remark
Homepage: $homepage ";
echo "
[ Zurück zum Gästebuch ]
";
}
else
{
echo "
Eintrag ungültig! ";
echo "
[ Zurück zum Gästebuch ]
";
}
}
mysql_close($link);
include "inc/foot.php";
?>[/code]
Wäre freundlich wenn ihr mir helfen könntet, find solche Leute einfach nur bescheuert.
mfg Karl
Xonea
January 13, 2008, 11:00pm
#2
Leider hat der, der dir dein gästebuch vollgemüllt hat mit dem unsicher recht. Du solltest einmal eine funktion wie htmlspecialchars (siehe de3.php.net/manual/de/function.h … lchars.php ) auf die Variablen name, email, homepage, remark beim posten anwenden.
Damit verhinderst du den größten Unsinn, es können vielleicht noch müllbeiträge geschrieben werden, aber keine popus o.ä. gemacht.
kla_kal
January 14, 2008, 7:09am
#3
Damit derjenige nicht unrecht hat weiß ich! Danke für den Link, werd ich mir genauer anschauen!
Hab mir jetz nicht dein Script durchgelesen aber gegen so gannante “Spam-Bots” kannst du dein Gästebuch mit einem Captcha(C ompletely A utomated P ublic T uring test to tell C omputers and H umans A part) sichern.
MfG
BeenGreen
kla_kal
January 14, 2008, 4:33pm
#5
Also htmlspecialchars hab ich jetzt eingebaut, und ein chaptcha hab ich auch bald(muss ich nur noch einbauen) mich würde das mit der IP aber jetzt noch interessieren!
mfg Karl
Ich verstehe das Problem gerade nicht. Wird dir statt der IP eine URL angezeigt?
Eine Domain führt ja so zu sagen auch auf eine IP zurück.
MfG
BeenGreen
kla_kal
January 14, 2008, 6:21pm
#7
Wenn ich jetzt nen Eintrag mache dann speichert es bei ip die 89.31.140.30(ip gehört offensichtlich united-domains)
laut ip-adress com ist meine aber 84.149.189.86 (stimmt auch - werde auf meinen lokalen webserver weitergeleitet)
Gerade ist mir die Idee gekommen mal die Seite direkt über die Adresse des servers bei server4free aufzurufen - da geht es.
Nun vermute ich mal liegt es an der Domaineinstellung “versteckte Weiterleitung” gibt es eine möglichkeit das ganze zu umgehen?
Zur info: Die Domain heißt jugendraum-heidenheim.de und ist bei united-domains gekauft.
Der Webspace ist unter web18.berlin079.server4free.de erreichbar
Falls ihr Screenshots von den united-domains einstellungen brauch melden.
mfg Karl
Eigentlich sollte nur die IP von UD ausgeben wenn du ne Frameweiterleitung nutzt aber das tust du ja nicht.
Ich steh grad auf dem Schlauch
MfG
BeenGreen
kla_kal
January 14, 2008, 9:35pm
#9
Ich versteh des ganze eben auch net.
Hab grad nachgeschaut, die Weiterleitung heißt “URL-Hiding(versteckte Weiterleitung)”
Nicht Frameweiterleitung!
mfg Karl
Xonea
January 14, 2008, 10:36pm
#10
Ja, der Grund ist damit ganz einfach…
bei der versteckten weiterleitung von united domains arbeitet united-domains als proxy für dich, damit man eben nicht sieht wo deine Seite wirklich liegt. D.h. alle Pakete werden erst zu UD und dann zu dir geleitet und kommen damit halt auch von united domains.
Das ändern ist ganz einfach… musst nur die versteckte weiterleitung auf was anderes umstellen. z.B. auf eine Weiterleitung mit frames, etc.
Wenn du das nicht willst kannst Du schauen ob United Domains vielleicht in einem der HTTP-Header die original-ip mitschickt (da wird oft etwas wie X-Original-Ip o.ä. gesetzt).
(Achja und das mit IP von united-domains bei Frameweiterleitung ist Unsinn; bei ner frameweiterleitung wird auch immer die eigene ip angezeigt.)
kla_kal
January 15, 2008, 6:45am
#11
Aha, Danke!
Wie finde ich das dann raus? Am besten eine Mail an United-Domains oder?
Xonea
January 15, 2008, 7:37am
#12
Schreib Dir ein Scriptchen, dass Dir alle Header anzeigt die ein HTTP-request hat und geh über die Umleitung auf das script; da solltest Du sehr schnell sehen ob die das in nem Header setzen.
Die IP und den Timestamp in MySQL speichern und abfragen ob der letzte Eintrag 30sec zurückliegt:
PHP-Code:
check_time()
{
$ip=$_SERVER["REMOTE_ADDR"];
$res=mysql_query("SELECT * FROM `IPS` WHERE `IP` = '$ip'; ");
$res=mysql_fetch_row($res);
if(!empty("TIME") && $res["TIME"] > time()+30)
return false;
else
return true;
}
add_ip()
{
$ip=$_SERVER["REMOTE_ADDR"];
mysql_query("INSERT INTO `IPS` (IP,TIME) VALUES ('$ip','".time()."'); ") OR die(mysql_error());
}
delete_old()
{
mysql_query("DELETE FROM `IPS` WHERE `TIME` > '" . (time()+86400) . "'; ") OR die(mysql_query());
}
Zum Verwenden musst du in MySQL eine Tabelle ‘IPS’ anlegen Spalten ‘TIME’ als timestamp und ‘IP’ als VARCHAR(15)
Den Aufruf der Funktionen musst du im Skript verankern…
kla_kal
January 16, 2008, 4:55pm
#14
@michi7x7 : ist zwar der eigentlich einzig richtige eintrag zum Titel, aber net das was ich brauche, aber trotzdem danke, vllt bau ichs mit ein.