Gästebuch Flootschutz

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.

  1. Wie muss ich das machen damit auch wirklich die richtige IP gespeichert wird?
  2. 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

Neuer Eintrag

Name:
E-Mail:
Homepage
Kommentar

[Smileyübersicht]

<?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 ""; $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 ""; echo ""; } mysql_free_result($result); echo ""; } echo "
 

Einträge

Einträge mit Msg-ID $start_id...$end_id
" . $row['name'] . "  "; if(empty($row['homepage'])) { } else { echo""; } echo" [" . $row['entry_date'] . " | " . $row['entry_time'] . " | Msg-ID " . $row['id'] . " ]
" . nl2br ($remark) . "

"; for ($i = 1; $i <= $num_pages; $i++) { if ($i == $page) echo " [$i] "; else echo " $i "; if (($i % 20) == 19) 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

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.

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(Completely Automated Public Turing test to tell Computers and Humans Apart) sichern.
MfG
BeenGreen

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

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

Ich versteh des ganze eben auch net.

Hab grad nachgeschaut, die Weiterleitung heißt “URL-Hiding(versteckte Weiterleitung)”

Nicht Frameweiterleitung!
mfg Karl

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.)

Aha, Danke!

Wie finde ich das dann raus? Am besten eine Mail an United-Domains oder?

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…

@michi7x7: ist zwar der eigentlich einzig richtige eintrag zum Titel, aber net das was ich brauche, aber trotzdem danke, vllt bau ichs mit ein.