Willkommen in der Webstatt Zum Webstatt Blog und Stories
moloch moloch am 18.04.07 10:14

Huhu Leutz!

Hab ein großes Problem.. Seit geraumer Zeit wird unsre Shoutbox von http://www.pfeit.at immer vollgespammt.. eigenldich wird aber auf Links geprüft.. wenn auch primitiv (bin ganz und gar kein php fux) vll kann mir jemand helfen und ne Spam Sperre einbauen.

Ursprünglich war das die Shoutbox die Erdo für Jex-Treme gecodet hat..

code:

shoutbox.php

<div class="marg">
<?PHP
#----------------------------------------------#
# Copyright 2005 by Maximilian 'Erdo' Fitting #
# just made for jex-treme.de! #
# Dieses Script darf nur auf jex-treme.de zum #
# Download angeboten werden! Der Verweis auf #
# die Seite unten im Script darf *nicht* #
# entfernt werden! #
# Version 1.0 #
#----------------------------------------------#
#
# Wenn du einen Eintrag löschen möchtest,
# musst du einfach nur auf die Raute #
# neben dem Eintrag klicken und das Passwort
# eingeben.

/* Config */
# Hierbei musst du aufpassen, dass du immer das NACH dem Komma
# änderst! Ändere NIE das GROßGESCHRIEBENE vor dem Komma,
# sonst geht hier nix mehr ;-)

define ('SPAMTIME', 1); //Nach wie viel Minuten der nächste Eintrag?
define ('ADMIN', ''); //Passwort zum Löschen der Einträge
define ('PATH', ''); //Pfad zum Ordner, in dem diese Datei liegt
define ('HTML', 0); //Soll HTML erlaubt werden? 0 = Nein, 1 = Ja
define ('LIMIT', 40); //Wie viele Einträge sollen angezeigt werden?
define ('SPLIT', 30); //Nach wie vielen ununterbrochenen Zeichen soll ein Absatz erfolgen?

define ('MYSQLHOST', 'localhost'); //Host von MySQL Datenbank, meist localhost
define ('MYSQLUSER', ''); //Username von MySQL Datenbank
define ('MYSQLPWD', ''); //Passwort von MySQL Datenbank
define ('MYSQLDB', ''); //Name der Datenbank MySQL
define ('TABLE', 'pfeitshout'); //Name der Tabelle für Einträge

/* Start Connection */
$connection = mysql_connect(MYSQLHOST, MYSQLUSER, MYSQLPWD) or die ('Keine Verbindung möglich!');
mysql_select_db(MYSQLDB) or die ('Die Datenbank existiert nicht!');

/* Install Table */
$test = @mysql_query('SELECT * FROM `' . TABLE . '`');
$error = mysql_errno();
if($error == 1146) {
if (mysql_query ('CREATE TABLE `' . TABLE . '` (
`id` int(11) unsigned NOT NULL auto_increment,
`userip` varchar(150) NOT NULL default \'\',
`time` int(11) NOT NULL default \'0\',
`nickname` varchar(250) NOT NULL default \'\',
`message` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM ;')) {
echo 'Tabelle wurde hinzugefügt. Jetzt sollte die Shoutbox funktionieren.';
} else {
echo 'Tabelle konnte nicht hinzugefügt werden: ' . mysql_error();
}
}

/* Functions */
function cutLongWords ($text, $bruch) {
$count = 0;
for ($i = 0; $i < strlen($text); $i++) {
if (substr($text, $i,1)== ' ') {
$count = 0;
} else {
$count++;
}

if ($count > $bruch) {
$text = substr($text, 0, $i) . '<br>' . substr($text, $i, strlen($text));
$count = 0;
}
}
return $text;
}

function getSpam ($userip) {
$diff = time() - (SPAMTIME*60);
$query = mysql_query ('SELECT COUNT(*) AS cnt FROM `' . TABLE . '` WHERE `userip` = "' . $userip . '" AND `time` > ' . $diff);
$count = mysql_fetch_assoc ($query);
if ($count['cnt'] == 1) {
return false;
} else {
return true;
}
}

function getTime ($timestamp) {
$yesterday = mktime (0, 0, 0, date("m"), date("d")-1, date("Y"));

if (date('dny', $timestamp) == date('dny', time())) {
return 'Heute ' . date('H:i', $timestamp) . ' Uhr';
} else if (date('dny', $timestamp) == date('dny', $yesterday)) {
return 'Gestern ' . date('H:i', $timestamp) . ' Uhr';
} else {
$monate = array(1=>"Jan", 2=>"Feb", 3=>"M&auml;r", 4=>"Apr", 5=>"Mai", 6=>"Jun", 7=>"Jul", 8=>"Aug", 9=>"Sep", 10=>"Okt", 11=>"Nov", 12=>"Dez");
return ' ' . date('d', $timestamp) . '. ' . $monate[date('n', $timestamp)] . ' ' . date('y', $timestamp) . ' um ' . date('H:i', $timestamp) . ' ';
}

}

/* Save Entries */
if (isset ($_POST['send']) and !isset($_GET['del'])) {

$_POST['nickname'] = trim ($_POST['nickname']);
$_POST['nickname'] = addslashes ($_POST['nickname']);

$_POST['message'] = trim ($_POST['message']);
$_POST['message'] = addslashes ($_POST['message']);


/* Links in der Nachricht? */

$nolink = eregi('<a', $_POST['message']);

if($_SERVER['REMOTE_ADDR'] == "87.243.150.229")
{
$sari = true;
}
else
$sari = false;

if ((empty ($_POST['nickname'])) or (empty ($_POST['message'])) or ($_POST['message'] == 'Nachricht') or ($_POST['nickname'] == 'Nickname')) {
echo 'Du musst beide Felder ausfüllen. <a href="' . $_SERVER['PHP_SELF'] . '?' . $_POST['url'] . '">zurück</a>';
} else {
if (!getSpam ($_SERVER['REMOTE_ADDR'])) {
echo 'Du darfst nur alle ' . SPAMTIME . 'min schreiben. <a href="' . $_SERVER['PHP_SELF'] . '?' . $_POST['url'] . '">zurück</a>';
} else {
if(!$nolink == true){
if($sari == false){
mysql_query ('INSERT INTO `' . TABLE . '` (`userip`, `time`, `nickname`, `message`) VALUES ("' . $_SERVER['REMOTE_ADDR'] . '", ' . time() . ', "' . $_POST['nickname'] . '", "' . $_POST['message'] . '")');
echo '<script language="javascript" type="text/javascript">window.location.href = "' . $_SERVER['PHP_SELF'] . '?' . $_POST['url'] . '";</script>';
}
}
}
}

/* Delete one Entry */
} else if (isset ($_GET['del'])) { ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?del=<?php echo $_GET['del']; ?>" name="delete" method="POST">
Passwort: <input type="password" name="password" class="field" value="" size="25"><br>
<input type="submit" name="delete" value="Löschen" class="field">
</form>
<?php
if (isset ($_POST['delete'])) {
if ($_POST['password'] == ADMIN) {
mysql_query ('DELETE FROM `' . TABLE . '` WHERE `id` = ' . $_GET['del']);
echo 'Eintrag wurde gelöscht.';
} else {
echo 'Falsches Passwort!';
}
}
/* Read out Entries */
} else if (!isset ($_GET['del']) and !isset ($_POST['send'])) {
$query = mysql_query ('SELECT id, time, nickname, message FROM `' . TABLE . '` ORDER BY `time` DESC LIMIT 0, ' . LIMIT);
echo mysql_error();
while ($row = mysql_fetch_assoc ($query)) {

$row['message'] = cutLongWords ($row['message'], SPLIT);
if (!HTML) {
$row['text'] = htmlspecialchars ($row['text']);
}

echo '<div class="sb_nick">' . stripslashes ($row['nickname']) . '</div>';
echo "\n";
echo '<div class="sb_date">' . getTime($row['time']) . '</div>';
echo "\n";
echo '<div class="sb_message">' . stripslashes ($row['message']) . '</div><br />';
echo "\n\n";
} } ?>
</div>


entry.php

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" name="send" method="POST">
<input type="hidden" name="url" value="<?php echo $_SERVER['QUERY_STRING']; ?>">
<input type="text" class="field" name="nickname" onFocus="if (value == 'Name') {value =''}" value="Name" size="16" maxlength="20"><br>
<input type="text" class="field" name="message" onFocus="if (value == 'Nachricht') {value =''}" value="Nachricht" size="16" maxlength="100"><br>
<center><input type="submit" class="field" name="send" value="Eintragen">
</form>





bitte um HILFE!

netcup.de Warum gibt es hier Werbung?
Michael_Genf am 18.04.07 12:39

Hmm Spam-Schutz ist ja ein kompliziertes Thema.
Eine simple aber effektive Lösung wäre akismet http://akismet.com/
Ansonsten bleiben ja nur die üblichen nervigen Dinge ala Captchas und Co

moloch moloch am 18.04.07 12:44

aber warum kapiert mein script nicht wenn spam eingegeben wird??

Michael_Genf am 18.04.07 13:09

hmm probiere mal anstelle des eregi Dings:

if(strstr($_POST['message'],'<a') {
$nolink = false;
} else {
$nolink = true;
}

eregi gibt glaube ich eine Zahl zurück und nicht true/false

moloch moloch am 18.04.07 14:25

ok. mal sehn ob noch was durchkommt.. bah wie ich das hasse..

danke vielmals michi :)

Snake am 18.04.07 14:45

1) fehler da ne klammer
2) ist strstr langsam
3) hast du en cast vom string zum boolean drin

http://de.php.net/strpos

Franky Franky am 18.04.07 22:16

4) askimet is echt klasse =)
5) unsichtbarer spamschutz: spambots gehen nach feldnamen:
[list=1]
[*]Textfeld name umbennen z.b. in "ugfkuzgf" oder so
[*]neues input text feld erstellen mit name="text" und per css oder vll sogar (besser?!) js: display: none
[*]dann per php prüfen ob das feld ne value hat.. wenn ja = spambot, da der das net merkt.. ein user würde es garnet sehen und könnte auch nix reinschreiben
[/list=1]

verstehste 5? wäre das net ne vernünftoge lösung?^^

ansonsten matheaufgaben, captchas, oder brb's spamschutz ;)

moloch moloch am 19.04.07 08:46

habs mal mit den umbenennen der forms probiert. :) danke vielmals

mal hoffen das bringt was

moloch moloch am 19.04.07 16:40

hat nix gebracht. hatte scho wieder spam drinne =(
aber was ich nicht versteh... warum kann der das überhaupt speichern. ich überprüf doch ob ein link vorkommt :(

Franky Franky am 19.04.07 17:39

Nicht nur Feld ändern.. sondern auch das mit JS oder CSS ein "Fakefeld" auf display:none setzen, wie ichs gesagt hab :P
Hast das geändert wies Snake gesagt hat?

moloch moloch am 20.04.07 08:20

ne hab ich net. aber versuch mal <a href="blabla in die shoutbox rein schreiben. das wird nicht gespeichert. so wie ich das will.. aber warum beim spambot schon??

mab mab am 20.04.07 18:03

probier mal die bots per htaccess auszusperren. musst bei google suchen, aber das wäre auch eine alternative. es gibt dazu listen mit alle möglichen bots. teilweise solltest du das aber aktuell halten.

fish fish am 20.04.07 18:23

teste halt mal was die bots so können...

also in das formular ein bild machen und ein input feld namens pfeitat

if ($_POST['pfeitat'] == "te3st"){
$bild = true;
}

else {
echo " entweder du bist ein elendiger bot oder du hast das bild falsch abgeschrieben";
}

if ((empty ($_POST['nickname'])) or (empty ($_POST['message'])) or ($_POST['message'] == 'Nachricht') or ($_POST['nickname'] == 'Nickname')) {
echo 'Du musst beide Felder ausfüllen. <a href="' . $_SERVER['PHP_SELF'] . '?' . $_POST['url'] . '">zurück</a>';
} else {
if (!getSpam ($_SERVER['REMOTE_ADDR'])) {
echo 'Du darfst nur alle ' . SPAMTIME . 'min schreiben. <a href="' . $_SERVER['PHP_SELF'] . '?' . $_POST['url'] . '">zurück</a>';
} else {
if(!$nolink == true){
if($sari == false){
if ($bild == true){
mysql_query ('INSERT INTO `' . TABLE . '` (`userip`, `time`, `nickname`, `message`) VALUES ("' . $_SERVER['REMOTE_ADDR'] . '", ' . time() . ', "' . $_POST['nickname'] . '", "' . $_POST['message'] . '")');
echo '<script language="javascript" type="text/javascript">window.location.href = "' . $_SERVER['PHP_SELF'] . '?' . $_POST['url'] . '";</script>';
}
}
}
}
}
das hier entsperechend ersetzen...

mab mab am 20.04.07 20:27

das find ich auch gut:

http://www.animierte-captcha.de/

sili sili am 20.04.07 20:39

Quote
Original von mab
http://www.animierte-captcha.de/


Deren Konzept finde ich fraglich. Das Captcha Bild wird als Hintergrundbild eingebunden und darüber läuft einfach eine transparente Animation. Da kann man die Animation doch gleich weglassen. Ein Bot kann so ja nur das Hintergrundbild auslesen und hat ein ganz normales Captcha...

edit: Ich war aber schneller. Ätsch! :D

Michael Michael am 20.04.07 20:39

Das animierte halte ich für vollkommenen Quatsch, da das eigentliche Bild normal verfügbar ist und nur ein animiertes Bild darüber gelegt wird. Die Schwierigkeit ist nur, dass der Bot herausfindet, welches Bild das richtige Captcha ist, allerdings hat er das Problem ja immer und löst es sehr gut.

Michael Michael am 20.04.07 20:44

LoL gleichzeitig *gG*

Hier noch eine interessante Seite zum Thema Captchas: http://sam.zoy.org/pwntcha/ Eine Auflistung vieler Captchas mit einer Einschätzung der Qualität

// edit

und noch eine: http://www.cs.sfu.ca/~mori/research/gimpy/

mab mab am 20.04.07 21:13

bin zwar kein captcha experte, aber ich glaube, dass die animierten teile gar nicht so schlecht sind.
übrigens zu deiner liste:
dort ist ein captcha mit 97% sicherheit, das bei mir mal im einsatz WAR... und das zu lange :)

Michael Michael am 20.04.07 21:16

Anders herum je höher die Zahl desto schlechter das Captcha...
Mit den animierten Captchas bin ich mir ziemlich sicher. Sieht vielleicht besser aus (auch das ist Geschmackssache) einen Effekt gegen Bots kann es im Grunde nicht haben.

mab mab am 21.04.07 13:59

Quote
Anders herum je höher die Zahl desto schlechter das Captcha...


ups :D

Christian am 14.05.07 23:07

will den thread mal wieder ausgraben uns folgendes sagen:

mein GB wird hammer zugespammt. Daher habe ich ein wenig mit antispam Maßnamen experimentiert, aber nichts erreicht. Zum Schluss habe ich jetzt eine Anweisung drin, die hinter _jeden_ Text, der über das eingabeformular eingegeben wurde " spam" setzt. Aber dieser Text erscheint hinter keinem der Spameinträge

-> daraus folgere ich, es muss noch ein anderes Formular geben, das ich vergessen habe zu löschen, das die spameinträge einträgt. Frage:

Wie finde ich die Seite (Datei), über welche der GB Eintrag gemacht wurde?

der_nic der_nic am 14.05.07 23:15

http://php.benscom.com/manual/de/reserved.variables.php

Quote
'HTTP_REFERER'
Die Adresse der Seite (falls es eine gibt), die den Browser auf die aktuelle Seite verwies. Dieser Header wird vom Browser gesetzt, aber nicht von allen. Einige Browser bieten die Möglichkeit, den HTTP_REFERER zu modifizieren. Kurz, auf diesen Header kann man sich nicht verlassen.


Könnte evtl. helfen aber wie du siehst ist es nicht sehr zuverlässig...

//edit: benenn doch einfach das Kontaktformular um, dann kommen keine veralteten Anfragen mehr

Dustwolf Dustwolf am 14.05.07 23:16

Verwendest du Standardbezeichner?

moloch moloch am 15.05.07 09:32

hab das jetz so geregelt:
wird beim index.php aufgerufen :P

<!--
<?

$db_link = mysql_connect("xx");

if($db_link) {

/* Verbindung hergestellt */
mysql_select_db("v033618"); // db auswählen
$query = 'delete from pfeitshout where message LIKE "%viagra%" OR message LIKE "%href%" OR message LIKE "%ringtone%" OR message LIKE "%<a%"';
$result = mysql_query($query);
if(!$result) { // prüfen auf false
echo "Konnte die MySQL-Abfrage nicht verarbeiten\n";
echo "MySQL-Query:".$query."\n";
echo "MySQL-Antwort:".mysql_error();
die();
}
}


?>
-->

Franky Franky am 15.05.07 17:09

auaaa.. :( bei jedem? mach doch einfach wenn ein eintrag geschrieben wird :(

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt