doppelpost verhindern

Status
Nicht offen für weitere Antworten.
Hi, hab nochmal ne Frage was zu diesem Thema passen würde. Bei mir in der Shoutbox/Gästebuch treibt sich ein Spambot rum, der das Gästebuch mit ca. 100 Links füllt mir irgendner Sch..... ! Die Links verzweigen sich zu irgendwelchen Sex, Roulett, Gewinnspielen etc. Ich würd jetzt gerne ne If-Abfrage machen, dass Einträge mit den Wörtern Sex, roulett, viagra, blablablab nicht eingetragen werden! Wie mach ich das?

if { txt = "sex OR viagra OR roulett OR blablabla } exit
else { eintrag machen


würde das so funktionieren?
 
Punkt 1: Du hättest durchaus einen neuen Thread eröffnen können. Zumal ich nicht wirklich sehe, was dein Problem mit jenem des Threadstarters gemeinsam hat …

Punkt 2: PHP oder JavaScript? In PHP könntest du bspw. die Funktion [phpf]strstr[/phpf] verwenden.

(Admins, deaktiviert doch endlich diese ver***ten Accesskeys. Ich muss jedesmal ein neues Tab aufmachen und die Ellipse da in der Adressleiste eingeben – das nervt auf Dauer ungemein.)
 
Du könntest ein Array mit den "bösen Wörtern" erstellen und dann überprüfen, ob die Wörter im eingegebenen Text auch im Array stehen ... und dann halt das Script abbrechen oder whatever.

PHP:
$badwords = array("sex", "porno", "nutten");
$text = explode(" ", $_POST["text"]);
foreach($text as $wort) {
    if(in_array($wort, $badwords)) {
        exit;
    } else {
        //eintrag in die db speichern ....
    }
}

Nur mal so als kleinen Denkanstoß, geht sicherlich sauberer auch, aber das wär mir jetzt mal so auf die Schnelle eingefallen ;>
 
PHP:
$badwords = array("sex", "porno", "nutten");
$text = explode(" ", $_POST["text"]);
foreach($text as $wort) {
    if(in_array($wort, $badwords)) {
        exit;
    } else {
        //eintrag in die db speichern ....
    }
}
Viel zu umständlich. So geht’s einfacher:
PHP:
$badwords = array('sex', 'porno', 'nutten');
$evil = false;
foreach ($badwords as $badword) {
	 if (strstr($_POST['text'], $badword)) {
		$evil = true;
	}
}
if ($evil == false) {
	// Daten weiter verarbeiten
}
Um in einem String nach einem anderen String zu suchen, sollte man nicht den mühsamen Weg über ein Array gehen.
 
Ok, wo kommt denn diese Array-Funktion hin? Vor dem Eintragen der Daten?
Ich habe das so gemacht:

PHP:
//Badwords
$badwords = array('sex', 'porno', 'nutten');
$evil = false;
foreach ($badwords as $badword) {
     if (strstr($_POST['message'], $badword)) {
        $evil = true;
    }
}
if ($evil == false) {
    // Daten weiter verarbeiten
} 
//gb eintrag
$query = "INSERT INTO $gb (name, email, url, message, entry_date) " . 
             "VALUES ('$name', '$email', '$url', '$message', '$zeit')";

Würde das so klappen?
 
Wenn deine PHP-Version schlecht konfiguriert ist (register_globals = off) klappt das sicherlich... Aber eigentlich solltest du auf gepostete Daten nicht mittels $feldname sondern mittels $_POST["feldname"] zugreifen. Dann funktioniert das nämlich auf jeden Fall!

Außerdem solltest du mit get_magic_quotes_gpc() überprüfen, ob magic_quotes_gpc an ist. Wenn nicht, musst du die geposteten Daten noch mit addslashes() behandeln, um Angriffe zu vermeiden.

Damit dir ein Posting nicht dein ganzes HTML-Layout zerschießt, solltest du außerdem auf jeden Wert vor dem Einfügen in die Datenbank htmlentities() anwenden.
 
Würds eher so machen:

€dit: Mein Vorredner hat Recht, konkret würde das dann so aussehen:
PHP:
<?
//Badwords
$badwords = array('sex', 'porno', 'nutten');
$evil = false;
foreach ($badwords as $badword) {
     if (strstr($_POST["message"], $badword)) {
		$evil = true;
    }
}
if ($evil == false) {
	//gb eintrag
	$name = $_POST["name"];
	$email = $_POST["email"];
	$url = $_POST["url"];
	$message = $_POST["message"];
	$zeit = time(); //schätz ich mal ...
	$gb = "guestbook"; //in deinen tabellennamen ändern
	$query = "INSERT INTO $gb (name, email, url, message, entry_date) " . 
			"VALUES ('$name', '$email', '$url', '$message', '$zeit')"; 
	mysql_query($query);
} else {
	echo "fehler: du hast böse wörter eingegeben!"; 
	/*
	oder was du eben dann machen willst wenn wer was "böses" eingibt. 
	ich würde wahrscheinlich dann wieder zurück zum formular leiten, 
	ohne dass die daten eingetragen werden. würde dann zb so aussehen:
	*/
	header("Location: formular.php");
}  
?>
 
Zuletzt bearbeitet:
Also irgendwie funktioniert das nicht

PHP:
<?php 
include 'config.inc.php'; 
include 'opendb.php'; 

if(isset($_POST['btnSign'])) 
{ 
    $name    = trim($_POST['txtName']); 
    $email   = trim($_POST['txtEmail']); 
    $url     = trim($_POST['txtUrl']); 
    $message = trim($_POST['mtxMessage']); 
        if(!get_magic_quotes_gpc()) 
    { 
        $name    = addslashes($name); 
        $message = addslashes($message); 
    } 
    if ($url == 'http://') 
    { 
        $url = ''; 
    } 
	//Badwords
	$badwords = array('sex', 'porno', 'nutten');
	$evil = false;
	foreach ($badwords as $badword) {
     if (strstr($_POST["message"], $badword)) {
        $evil = true;
    }
	}
	if ($evil == false) {
    //gb eintrag
    $name = $_POST["name"];
    $email = $_POST["email"];
    $url = $_POST["url"];
    $message = $_POST["message"];
    $zeit = time(); 
    $query = "INSERT INTO $gb (name, email, url, message, entry_date) " . 
            "VALUES ('$name', '$email', '$url', '$message', '$zeit')"; 
    mysql_query($query);
	} else {
    echo "fehler: du hast böse wörter eingegeben!"; 
    header("Location: formular.php");
}  
			 
	//shoutbox
	$short_entry = substr($message, 0, strpos($message," ",50)).'<a href="index.php?kat=gbook"><br>[mehr im gb]</a>';
	mysql_query("INSERT INTO $shoutbox (time, nick, txt) VALUES('".time()."', '$name', '$short_entry')");
    
    mysql_query($query) or die('Error, query failed. ' . mysql_error()); 
    header('Location: ' . $_SERVER['REQUEST_URI']); 
} 
?>

Hab jetzt einfach mal das Ding gepostet! Was is daran falsch! Irgendwie wird das in die Datenbank geschrieben, aber ohne Daten!?
 
Hallo,
eventuell liegt es daran, dass du die Variablen überschreibst.
PHP:
$name = $_POST["name"]; 
$email = $_POST["email"]; 
$url = $_POST["url"]; 
$message = $_POST["message"];
Nimm das mal raus, vielleicht funktioniert es dann.

mfg
forsterm
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Zurück