• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

strpos für Antispamfilter einsetzen

Xeno

Mitglied
Liebe Community

Ich bin daran, das Gästebuch meiner Homepage zufolge Zuspammung mit einem Spamschutz zu versehen. Eine Möglichkeit sehe ich darin, mit einem sehr einfachen Filter das Posten von URLs zu verunmöglichen (anderen Spam als Linkspam habe ich praktisch nicht). Dabei bin ich auf den Befehl
Code:
strpos
, der in einem String untersucht, an welcher Position ein anderer String auftaucht. Da der Befehl FALSE zurückgibt, wenn der dubiose String gar nicht im ersten vorkommt, kann man das als sehr einfachen Wortfilter brauchen. Ich habe zunächst der Einfachheit halber nur Posts mit der Zeichenkette "http" ausfiltern bzw. solche Posts vereiteln wollen.

Mein Problem ist recht bizarr: Der Filter funktioniert im scharfen Test völlig einwandfrei. Und dennoch - ich kann es mir nicht erklären - kommen Spams problemlos durch, die ganz genau "http" en masse enthalten. Besonders kurios finde ich, dass der Filter einwandfrei funktioniert, wenn ich dann solche Spambeiträge (oder nur Teile davon) selber händisch als Test eingebe! Es spielt keine Rolle, ob ich die Einträge vom Plaintext der Homepage oder direkt aus der DB nehme: in beiden Fällen tut der Filter beim händischen Test wunderbar, was er soll. Wieso bei den echten Spambots dann nicht?!

Der Code:

senden3.php

Code:
<?php
session_start();
$_SESSION['name'] = $_POST["name"];
$_SESSION['mail'] = $_POST["mail"];
$_SESSION['nachricht'] = $_POST["nachricht"];
?>
<?php
error_reporting(E_STRICT);
ini_set("display_errors", true);
?>
<!DOCTYPE html>
<html lang="de">
<?php
include ("head.php");
?>
<body>
<div id="wrapper">
<?php
include("header.php");
?>
<div id="inhalt">
<div id="inhalt2">
<div id="links">
<h1>
Gästebuch - Senden
</h1>
<?php
$name = $_POST["name"];
$name = htmlspecialchars($name);
$mail = $_POST["mail"];
$mailkorrekt = filter_var($mail, FILTER_VALIDATE_EMAIL);
$nachricht = $_POST["nachricht"];
$nachricht = htmlspecialchars($nachricht);
$test = strpos($nachricht, "http");
if($test !== false) {
        echo "<p>Bitte posten Sie keine URLs (Spamschutz)! Sie werden jetzt zum Eingabeformular
    zurückgeleitet, warten Sie ein paar Sekunden...</p><br>
    <meta http-equiv='refresh' content='4;URL=http://www.michaelritter.ch/schreiben1.php'>";
        } 
else if(empty($name)){
    echo "<p>Sie haben keinen Namen angegeben. Sie werden jetzt zum Eingabeformular
    zurückgeleitet, warten Sie ein paar Sekunden...</p><br>
    <meta http-equiv='refresh' content='4;URL=http://www.michaelritter.ch/schreiben1.php'>";
    }
else if(empty($mail)){
    echo "<p>Sie haben keine Mailadresse angegeben. Sie werden jetzt zum
    Eingabeformular zurückgeleitet, warten Sie ein paar Sekunden...</p>
    <meta http-equiv='refresh' content='4;URL=http://www.michaelritter.ch/schreiben1.php'>";
    }
else if($mailkorrekt === false){
    echo "<p>Ihre Mailadresse ist nicht korrekt. Geben Sie eine korrekte
    Mailadresse ein. Sie werden jetzt zum Eingabeformular zurückgeleitet,
    warten Sie ein paar Sekunden...</p>
    <meta http-equiv='refresh' content='4;URL=http://www.michaelritter.ch/schreiben1.php'>";
    }
else if(empty($nachricht)){
    echo "<p>Sie haben keinen Text ins Nachrichtenfeld geschrieben. Sie werden
    jetzt zum Eingabeformular zurückgeleitet, warten Sie ein paar Sekunden...</p>
    <meta http-equiv='refresh' content='4;URL=http://www.michaelritter.ch/schreiben1.php'>";
    }
else {
    echo "<p>Sie werden zum Spamschutz weitergeleitet. Warten Sie bitte ein paar Sekunden....</p>";
        }
?>
<meta http-equiv="refresh" content="5;URL=http://www.michaelritter.ch/spamschutz.php">
</div>
<?php
include("rechts.php");
include("footer.php");
?>
</div>
</body>
</html>


Der Link zum Gästebuch: www.michaelritter.ch/gaestebuch.php

Im Moment enthält der Code bzw. das Gästebuch noch einen (nicht funktionierenden) anderen Spamfilter, der dem Poster eine Rechenaufgabe stellt. Das werde ich wieder ausbauen, da es nichts bringt. Für die Frage hier müsste das egal sein (sonst natürlich sagen!).

Ich verdanke jede Hilfe im Voraus bestens.

Lg X.
 
Werbung:
Lieber bdt600

Völlig richtig die Bemerkung. In der ursprünglichen Fassung, d. h. vor dem Einbau der Rechenaufgabe, war diese ganze Sequenz auch in dieser Datei. Jetzt ist es hier:

spamschutzauswertung2.php

Code:
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="de">
<?php
include ("head.php");
?>
<body>
<div id="wrapper">
<?php
include("header.php");
?>
<div id="inhalt">
<div id="inhalt2">
<div id="links">
<?php
$name = $_SESSION['name'];
$name = htmlspecialchars($name);
$mail = $_SESSION['mail'];
$mailkorrekt = filter_var($mail, FILTER_VALIDATE_EMAIL);
$nachricht = $_SESSION['nachricht'];
$nachricht = htmlspecialchars($nachricht);
$zufall1 == $_POST["zufall1"];
$zufall2 == $_POST["zufall2"];
$zufall3 == $_POST["zufall3"];
$ergebnis == $_POST["resultat"];
     if($ergebnis == $zufall1 + $zufall2 + $zufall3) {
     include ("mysqli_connect.php");
     $id = 0;    
     $timestamp = time();
     $zeit = date("H:i",$timestamp);
     $datum = date("d.m.Y", $timestamp);
     $nachricht = str_replace("\r\n", "<br>", $nachricht);
     $nachricht = mysqli_real_escape_string($link, $nachricht);
     $name = mysqli_real_escape_string($link, $name);
     $eintrag = "INSERT INTO guestbook2 (id, name, mail, nachricht, datum, zeit) VALUES ('$id', '$name', '$mail', '$nachricht', '$datum', '$zeit')";
     $eintragen = mysqli_query($link, $eintrag);
     echo "<p>Sie sind echt, gratuliere! Ihr Beitrag wird veröffentlicht. Sie werden
     jetzt zurück zum Gästebuch geleitet, bitte warten Sie ein paar Sekunden...
     </p><br><meta http-equiv='refresh' content='5;URL=http://www.michaelritter.ch/gaestebuch.php'>";
     }
   else {
     echo "<p>Sie haben die Rechenaufgabe nicht richtig gelöst!</p>";  
     }
?>
</div>
<?php
include("rechts.php");
include("footer.php");
?>
</div>
</body>
</html>


Danke für den raschen Hinweis!

Lg X.
 
Werbung:
Wenn ich bei dir Gästebucheinträge mit Links machen wollen würde, würde ich mein Post einfach direkt an spamschutz.php schicken. Dort findet keine Validierung mehr statt. Es hat den Anschein, als ob das bei dir ganz einfach durch ändern der Action im Formular (z.B. mit Firebug) gehen würde.
 
Jetzt mal abgesehen von dieser schwerwiegenden Sicherheitslücke, welche unbedingt behoben werden muss:
Ich habe dein Stript einfach mal nachgebaut und dafür der Einfachheithalber einfach ein Beispiel aus dem Handbuch umgebaut:
PHP:
<?php

$eingabe = 'http://www.example.com/irgendeine-seite.php';
$verboten   = 'http://';
$pos = strpos($eingabe, $verboten);


if ($pos === false) {
    echo "Der String '$verboten' wurde nicht im String '$eingabe' gefunden";
} else {
    echo "Der String '$verboten' wurde im String '$eingabe' gefunden";
    echo " und befindet sich an Position $pos";
}
?>

Bei mir kommt als Ausgabe "Der String 'http://' wurde im String 'http://www.example.com/irgendeine-seite.php' gefunden und befindet sich an Position 0", so wie es sein müsste. Auch wenn ich den Eingabestring vollschreibe mit aneinandergeriten http://'s oder ähnlich, was ich auch probiere, die Ausgabe stimmt jedesmal.
 
Ich habe den Spamschutz in der Form der Rechenaufgabe herausgenommen und jetzt die Lösung mit verstecktem Formular gewählt. Das funktioniert einwandfrei, d. h. ich habe seither keinen (!) Spam mehr. Wie immer haben die Experten hier Recht gehabt.

Wenn Interesse an Code(-teilen) besteht bitte sagen. Da die Lösung relativ trivial ist, poste ich ihn nur auf Verlangen. Den Fred hier kann man bei Gelegenheit zumachen.

Ich verdanke alle Rückmeldungen!

Lg X.
 
Werbung:
Wenn ich bei dir Gästebucheinträge mit Links machen wollen würde, würde ich mein Post einfach direkt an spamschutz.php schicken. Dort findet keine Validierung mehr statt. Es hat den Anschein, als ob das bei dir ganz einfach durch ändern der Action im Formular (z.B. mit Firebug) gehen würde.

Danke für diesen wichtigen Hinweis. Da ich jetzt den Rechenaufgaben-Spamschutz inzwischen wieder ausgebaut habe (siehe vorheriges Post), hat sich dieser Punkt zwar erledigt, da es jetzt gar keine "spamschutz.php" mehr gibt. Dennoch war das natürlich eine klare Sicherheitslücke. Wieder etwas gelernt!

Lg X.
 
Zurück
Oben