Guestbook spam.

Status
Niet open voor verdere reacties.

rikietje

Gebruiker
Lid geworden
17 nov 2010
Berichten
154
Ik wordt er helemaal gek van.

Het guestbook op mijn website : http://rikbeernink.nl/guestbook.php wordt steeds kapot gespamd door allemaal viagra dingen.

Ik gebruik de volgende code :

PHP:
<html>
<head>
<title>Rik Beernink : Gastenboek </title>
<link rel="Stylesheet" type="text/css" href="main_css.css" />
 
 
 
 
</head>
<body>
<?php
session_start();
require ("require_menu.php");
require ("require_favicon.php");
require ("require_connect_database.php");
require ("require_reclame01.php");
$ip = $_SERVER['REMOTE_ADDR'];
 
$uni = md5(date(Ymdhis).$ip);
 
 
 
echo "<br />";
echo "<div class='div_text_left' >
Welkom op het gastenboek.<br />
Het is hier mogelijk om een berichtje achter te laten op de website! <br /><br />
Het zou leuk zijn als je hier commentaar over de website achterlaat!</div>";
echo "<br /><br />";
 
if ($_POST['antispam'] == ""){
 
    if ($_SERVER['REQUEST_METHOD'] == "POST"){
        if ($_SESSION['id'] == $_POST['uni']){
            echo "<div class='div_float_left'>Bedankt, je bericht is toegevoegd aan het gastenboek!</div><br /><br />";
            $naam = $_POST['naam'];
            $bericht = $_POST['bericht'];
            $datum = date("F j, Y, g:i a");
    
            mysql_query("INSERT
            INTO tbl_guestbook 
            VALUES ('','$naam', '$bericht', '$datum')")
            or die(mysql_error()); 
    
            echo "<script type='text/javascript'>
            alert('Het bericht is toegevoegd aan het gastenboek!')
            </script>";
            session_destroy();
        
        }   
        else{
        echo "<script type='text/javascript'>
        alert('Er is iets mis gegaan. Je wordt teruggeleid naar het gastenboek.')
        window.location = 'http://rikbeernink.nl/guestbooktest3.php' 
        </script>";
        }   
    }
 
    
else {
$_SESSION['id'] = $uni; 
 
    echo "<script type='text/javascript'>
    
    
    
    
    
    function formValidator(){
        var naam = document.getElementById('naam');
        var bericht = document.getElementById('bericht');
        
        if(isAlphabet(naam, 'Vul alstublieft uw naam in.')){
            if(berichtcheck(bericht, 9, 140)){
                return true;
            }
        }
        return false;
    }
    
    function isAlphabet(elem, helperMsg){
    var alphaExp = /^[a-zA-Z]+$/;
    if(elem.value.match(alphaExp)){
        return true;
    }else{
        alert(helperMsg);
        elem.focus();
        return false;
        }
    }
    
    function berichtcheck(elem, min, max){
    var uInput = elem.value;
    if(uInput.length >= min && uInput.length <= max){
        return true;
    }else{
        alert('Het bericht moet uit minstens 10 karakters en maximaal 140 karakters bestaan.');
        elem.focus();
        return false;
    }
}
    
 
 
    
    </script>";
    echo "<div class='div_text_home'>";
    echo "<form action='' method='POST' onsubmit='return formValidator()'>
    <br />
    Naam <input type='text' name='naam' id='naam' />
    <br />
    Bericht <textarea name='bericht' id='bericht' rows='5' ></textarea> 
    <br /><br />
    <input type='submit' name='submit' onclick='antibot()' />
    <input type='hidden' name='antispam' />
    <input type='hidden' name='uni' value=$uni />
    </form></div>";
    
    echo "<br /><br />";
    
        
}
 
echo "<table border =\"1\" width='800px' align = \"center\">";
echo "<p><tr><th width='50px' >Bericht nummer</th>";
echo "<th width='200px'>Naam</th>";
echo "<th width='350px' >Bericht</th>";
echo "<th width='200px'>Datum</th>";
 
$result = mysql_query("SELECT * FROM tbl_guestbook order by ID DESC")
or die(mysql_error());  
 
while ($row = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td>";
echo $row['ID'];
echo "<td>";
echo $row['naam'];
echo "</td>";
echo "<td>";
echo $row['bericht'];
echo "</td><td>";
echo $row['datum'];
echo "</td></tr></p>";
}
echo "</table>";
 
 
} 
else {
die();
}
 
?>
</body>
</html>

Op internet staat ook een boel maar ik zou graag willen weten hoe jullie spam tegen zouden gaan.

Bedankt

Rik
 
Vervang je antispam veld eens van dit:
HTML:
<input type='hidden' name='antispam' />
door dit:
HTML:
<div style="display: none"><input type="text" name="antispam"></div>

Spambots vullen namelijk hiddens niet in, maar text fields wel, en ze kunnen niet zien dat deze niet zichtbaar is voor gebruikers.

Als het niet werkt je het ook nog met "zoeken/vervangen" de naam overal vervangen door iets onschuldigers zoals "email" ofzo, want misschien dat ze het veld blijven ontwijken vanwege de naam.
 
Vervang je antispam veld eens van dit:
HTML:
<input type='hidden' name='antispam' />
door dit:
HTML:
<div style="display: none"><input type="text" name="antispam"></div>

Spambots vullen namelijk hiddens niet in, maar text fields wel, en ze kunnen niet zien dat deze niet zichtbaar is voor gebruikers.

Als het niet werkt je het ook nog met "zoeken/vervangen" de naam overal vervangen door iets onschuldigers zoals "email" ofzo, want misschien dat ze het veld blijven ontwijken vanwege de naam.

Bedankt voor de snelle reactie. Ik ga hem even toepassen en dan ga ik naar de sportschool en zien we over het geholpen heeft!

Verder ben ik op internet het volgende tegengekomen:

http://www.captcha.net/

Je ziet het op veel websites maar is dat handig?

Het handigst lijkt mij als dit gewoon werkt.

Bedankt!
 
Een captcha werkt ook, maar het nadeel van een captcha is dat je je gebruikers met het probleem opzadelt en die zitten er niet altijd op te wachten. Als het verborgen veld niet helpt dan zou ik overstappen op de captcha maar als je iets hebt wat spammers buiten houdt en bezoekers niet lastig valt is dat beter.
 
Hi,
ik heb een soortgelijk probleem moeten oplossen.
Zo te zien gebruik je een 'kant en klaar' gastenboek. Hoogstwaarschijnlijk heeft zich dat als actief gemeld bij de makers, waardoor de spamstroom op gang kan komen.

Oplossingen:
- vervang dit gastenboek door een ander, of probeer guestbook.php een andere naam te geven

en de oplossing die ik gebruikt heb:

- de spammende IP-nummers in een bestand opnemen. Dat kan vanuit de logfiles. Als een sessie gestart wordt even het requestende IPnummer tegen dat bestand , een soort blacklist, houden en bij een match de sessie beeindigen
- geregeld dat guestbook alleen vanuit het website menu benaderd mag worden. Ook dat kan tijdens de start van een sessie getest worden.
- in de daaropvolgende fase heb ik even een eigen guestbookje gemaakt. Toen was ik helemaal van het gezeur af, hoewel de vorige 2 maatregelen eigenlijk al toereikend waren
 
Hi,
ik heb een soortgelijk probleem moeten oplossen.
Zo te zien gebruik je een 'kant en klaar' gastenboek. Hoogstwaarschijnlijk heeft zich dat als actief gemeld bij de makers, waardoor de spamstroom op gang kan komen.

Oplossingen:
- vervang dit gastenboek door een ander, of probeer guestbook.php een andere naam te geven

en de oplossing die ik gebruikt heb:

- de spammende IP-nummers in een bestand opnemen. Dat kan vanuit de logfiles. Als een sessie gestart wordt even het requestende IPnummer tegen dat bestand , een soort blacklist, houden en bij een match de sessie beeindigen
- geregeld dat guestbook alleen vanuit het website menu benaderd mag worden. Ook dat kan tijdens de start van een sessie getest worden.
- in de daaropvolgende fase heb ik even een eigen guestbookje gemaakt. Toen was ik helemaal van het gezeur af, hoewel de vorige 2 maatregelen eigenlijk al toereikend waren

Hee bedankt voor je reactie.

Dit is geen kant en klaar gastenboek hoor, ik heb hem zelf in elkaar geprutst :P

Je tip over guestbook.php veranderen vind ik wel slim. Ik vraag me alleen af of het nog nodig is. Ik heb tot nu toe (klopt af) nog geen spam gehad. Ik denk dat het probleem aardig opgelost is.

Als ik er last van blijf houden dan neem ik je tip over het alleen benaderen via het menu in acht. En de IP Blacklist.

Hartstikke bedankt voor je reactie.

Voor de mensen die het willen weten.

Ik gebruik nu de volgende code :
PHP:
<html>
<head>
<title>Rik Beernink : Gastenboek </title>
<link rel="Stylesheet" type="text/css" href="main_css.css" />




</head>
<body>
<?php
session_start();
require ("require_menu.php");
require ("require_favicon.php");
require ("require_connect_database.php");
require ("require_reclame01.php");
$ip = $_SERVER['REMOTE_ADDR'];

$uni = md5(date(Ymdhis).$ip);



echo "<br />";
echo "<div class='div_text_left' >
Welkom op het gastenboek.<br />
Het is hier mogelijk om een berichtje achter te laten op de website! <br /><br />
Het zou leuk zijn als je hier commentaar over de website achterlaat!</div>";
echo "<br /><br />";

if ($_POST['geenreclame'] == ""){

	if ($_SERVER['REQUEST_METHOD'] == "POST"){
		if ($_SESSION['id'] == $_POST['uni']){
			
			echo "<div class='div_float_left'>Bedankt, je bericht is toegevoegd aan het gastenboek!</div><br /><br />";
			$naam = $_POST['naam'];
			$bericht = $_POST['bericht'];
			$datum = date("F j, Y, g:i a");
	
			mysql_query("INSERT
			INTO tbl_guestbook 
			VALUES ('','$naam', '$bericht', '$datum')")
			or die(mysql_error()); 
	
			echo "<script type='text/javascript'>
			alert('Het bericht is toegevoegd aan het gastenboek!')
			</script>";
			session_destroy();
		
		}	
		else{
		echo "<script type='text/javascript'>
		alert('Er is iets mis gegaan. Je wordt teruggeleid naar het gastenboek.')
		window.location = 'http://rikbeernink.nl/guestbook.php' 
		</script>";
		}	
	}

	
else {
$_SESSION['id'] = $uni; 

	echo "<script type='text/javascript'>
	
	
	
	
	
	function formValidator(){
 		var naam = document.getElementById('naam');
 		var bericht = document.getElementById('bericht');
 		
 		if(isAlphabet(naam, 'Vul alstublieft uw naam in.')){
 			if(berichtcheck(bericht, 9, 140)){
 				return true;
 			}
 		}
 		return false;
 	}
 	
 	function isAlphabet(elem, helperMsg){
	var alphaExp = /^[a-zA-Z]+$/;
	if(elem.value.match(alphaExp)){
		return true;
	}else{
		alert(helperMsg);
		elem.focus();
		return false;
		}
	}
	
	function berichtcheck(elem, min, max){
	var uInput = elem.value;
	if(uInput.length >= min && uInput.length <= max){
		return true;
	}else{
		alert('Het bericht moet uit minstens 10 karakters en maximaal 140 karakters bestaan.');
		elem.focus();
		return false;
	}
}
	


	
	</script>";
	echo "<div class='div_form_main'>";
	echo "<form action='' method='POST' onsubmit='return formValidator()'>
	<br />
	Naam  :<br /><input type='text' name='naam' id='naam' />
	<br /><br />
	Bericht :<br /><textarea name='bericht' id='bericht' rows='5' ></textarea> 
	<br /><br />
	<input type='submit' name='submit' onclick='antibot()' />
	
	<div style='display: none'><input type='text' name='geenreclame'></div>
	
	<input type='hidden' name='uni' value=$uni />
	</form></div>";
	
	echo "<br /><br />";
	
		
}

echo "<table border =\"1\" width='670px' align = \"center\">";
echo "<p><tr><th width='50px' >Bericht nummer</th>";
echo "<th width='70px'>Naam</th>";
echo "<th width='350px' >Bericht</th>";
echo "<th width='200px'>Datum</th>";

$result = mysql_query("SELECT * FROM tbl_guestbook order by ID DESC")
or die(mysql_error());  

while ($row = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td>";
echo $row['ID'];
echo "<td>";
echo $row['naam'];
echo "</td>";
echo "<td>";
echo $row['bericht'];
echo "</td><td>";
echo $row['datum'];
echo "</td></tr></p>";
}
echo "</table>";


} 
else {
die();
}

?>
</body>
</html>

Hartelijk bedankt.

Ik zal vanavond nog een bericht sturen hoe het is verlopen met de spam!
 
Laatst bewerkt:
Een ander puntje, je gastenboek is nu kwetsbaar voor SQL-injectie.
Om dit te voorkomen kan je beste regel 36 en 37 vervangen door
PHP:
$naam = mysql_real_escape_string($_POST['naam']);
mysql_real_escape_string($bericht = $_POST['bericht']);
 
Een ander puntje, je gastenboek is nu kwetsbaar voor SQL-injectie.
Om dit te voorkomen kan je beste regel 36 en 37 vervangen door
PHP:
$naam = mysql_real_escape_string($_POST['naam']);
mysql_real_escape_string($bericht = $_POST['bericht']);

Dus jij hebt geprobeerd mijn tabel te droppen :P?

Ja is goed ik was nog niet toe tot de mysql injection hoofdstuk van de tutorial. Heb er nog niet echt aandacht aan besteed.

Kan je me uitleggen wat het code precies doet?
 
Simpel gezegd, het zorgt ervoor dat gebruikers de structuur van je query niet aan kunnen passen door te gaan spelen met aanhalingstekens.

Het gaat niet alleen Injections tegen, het zorgt er ook voor dat je hele script niet crasht als iemand een ' opneemt in zijn/haar comment.
 
Simpel gezegd, het zorgt ervoor dat gebruikers de structuur van je query niet aan kunnen passen door te gaan spelen met aanhalingstekens.

Het gaat niet alleen Injections tegen, het zorgt er ook voor dat je hele script niet crasht als iemand een ' opneemt in zijn/haar comment.

Klinkt cool!

Dus ik moor alle waardes die ik uit de post haal

PHP:
mysql_real_escape_string

Zetten ?

Op deze manier voorkom ik injectie?
 
Jepz. Die functie zorgt ervoor dat mensen geen schade aan kunnen richten, per ongeluk of bewust.
 
Hoe voorkom ik links en html input en dergelijken dan? Heeft iemand daar een mooi tutorial voor?
 
HTML input kun je laten "strippen" door de functie strip_tags():

PHP:
<?php

// Besmette string
$string = '<p>Hoi!</p><a href="http://www.example.com/image.png"><p>dit is een afbeelding</p>';

// strip_tags(string die moet worden gefilterd, uitzonderingen (zoals '<p>'))
$filter1 = strip_tags($string);

// mysql_real_escape_string(string die moet worden gefilterd)
$filter2 = mysql_real_escape_string($string);

// Schone string
$string = $filter2;

?>

Links:
http://php.net/strip_tags
http://php.net/mysql_real_escape_string

op php.net vind je alles: gewoon de functienaam achter php.net/ intypen :)
 
Oh oke bedankt,

Ik heb echter zelf al een oplossing bedacht :

PHP:
function naamcheck(elem, helperMsg){
	var uInput = elem.value;
 	var alphaExp = /^[a-zA-Z '']+$/;
	if(uInput.length >= min && uInput.length <= max){
 		if(elem.value.match(alphaExp)){
			return true;
			}else{
		alert('Vul astlublieft uw naam in');
		elem.focus();
		return false;
		}
	}
	
	function berichtcheck(elem, min, max){
	var uInput = elem.value;
	var alphaAntiHTML = /^[a-zA-Z0-9 _ '' !@#$%^&*()=/\.,? + -]+$/;
	if(uInput.length >= min && uInput.length <= max){
		if(elem.value.match(alphaAntiHTML)){
			return true;
			}
			else{
			alert('In het bericht zijn allen letters en de volgende tekens toegestaan : !@#$%^&*()=/\.,?+-');
			elem.focus();
			return false;
		}
	}else{
		alert('Het bericht moet uit minstens 10 karakters en maximaal 140 karakters bestaan.');
		elem.focus();
		return false;
	}
}

Hierdoor is het voor mensen niet meer mogelijk HTML tags in te vullen via het form aangezien de < en > niet toegestaan worden.

Klopt toch?

http://rikbeernink.nl/guestbook.php

Nu ben ik aan het werken aan een bestand dat de Naam, berichtnummer en IP-ADRES in een bestand opslaat. Waardoor ik in het vervolg deze ip adressen kan blokkeren.
 
Laatst bewerkt door een moderator:
Dat klopt, tenzij iemand Javascript uitschakelt. Dan is heel je beveiliging weg, dus ik zou toch maar strip_tags gebruiken.
 
ik zou ook een log bijhouden bij gebruik van een ; die als sql injectie kan worden gezien.
 
Ja maar er zijn er nog zoals * FROM je kan je er ook wel enkele voorstellen
*FROM wordt dan al bij de gevaarlijke beschouwd maar men dient hoe dan ook een ; gebruiken om een tweede lijn te verkrijgen dus wordt die als untrust gezien

en al die spammers moet je melden bij ecops.be zo kunnen die ooit berecht of gestraft kunnen gestraft worden. De mogelijkheid bestaat dat bij identificatie ze hier niets meer te zoeken hebben.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan