Spam

Status
Niet open voor verdere reacties.

lerrie

Gebruiker
Lid geworden
2 nov 2010
Berichten
300
Ik heb in dit gastenboek (http://www.goodnightladies.nl/gastenboek.php) een onzichtbaar veld gezet tegen bots en spammers. Deze werkt goed, de comment en naam van de spammer/bot wordt niet gepost, alleen wordt er wel een lege post naar mijn database gestuurd. Hierdoor komt er ook een lege post terug in mijn gastenboek (zie gatenboek). Dus er komt een post in mijn gastenboek zonder inhoud. hou kan ik, dmv van mij php script voorkomen dat dit gebeurt?

Dit is nu mijn code, zoals je ziet staat er wel iets tegen de bots "IF... die".
PHP:
<?php

include 'mysql.php';

if ( isset( $_POST['info'] ) && $_POST['info'] !== "" ) {
  die();
}

// html variabelen ophalen

$naam = $_POST['naam'];
$boodschap = $_POST['boodschap'];

// variabele om het tijdstip van de boodschap in database op te slaan.

$datum= time();

// sql insert die je in de database gaat doen

$sql ="INSERT INTO gastenboek(naam, boodschap, datum)
VALUES ('".$naam."', '".$boodschap."', '".$datum."')";

//uitvoeren van de query :

if (!($temp = mysql_query($sql,$connection)))

showerror();

header ( "Location: http://www.goodnightladies.nl/gastenboek.php" );

?>

Bedankt
 
Dat script ziet er redelijk waterdicht uit...

Tenzij je mensen hebt die gewoon op de "verstuur" knop drukken zonder iets in te vullen zou er geen rij gemaakt moeten worden, want het anti-spam script heeft een "die()" die ervoor zorgt dat er niks gebeurd.

Wat je nog kunt doen is controleren of er een naam en boodschap zijn ingevuld, en zo niet een foutmelding geven, maar dat betekent wel dat je zelf het eea moet scripten. Je zult bovenaan een controle moeten doen of $_POST['boodschap'] en $_POST['naam'] niet leeg zijn, en zo wel dan zul je een pagina moeten tonen met een foutmelding, of de foutmelding moeten vermelden op de pagina met het gastenboek zelf.
 
Als ik nu op de verstuur knop druk zonder iets in te vullen geeft hij al aan dat er niks is ingevuld. Het moet dus ergens anders aan liggen maar heb geen idee wat?
 
Die melding wordt dan gegeneerd door iets anders dan dit script, want ik zie die bescherming niet in je script terugkomen.

Hm als ik op je website kijk zie ik dat het een javascriptje is. Die zijn niet erg betrouwbaar voor dit soort controles, je zou er ook nog een moeten maken in PHP zelf, voor mensen die dus geen javascript hebben of bots die rechtstreeks naar de link gaan van dat scriptje ipv via de website.
 
Ok maar ik heb hier weinig verstand van. Hoe moet ik dit doen?

Groeten
 
Ok maar ik heb hier weinig verstand van. Hoe moet ik dit doen?

Groeten

Ik weet het niet zeker maar ik zou is afzien van die die(); en het volgende neerzetten .


PHP:
<?php
 
include 'mysql.php';
 
if ( isset( $_POST['info'] ) && $_POST['info'] !== "" ) {
 
}
else{
 
// html variabelen ophalen
 
$naam = $_POST['naam'];
$boodschap = $_POST['boodschap'];
 
// variabele om het tijdstip van de boodschap in database op te slaan.
 
$datum= time();
 
// sql insert die je in de database gaat doen
 
$sql ="INSERT INTO gastenboek(naam, boodschap, datum)
VALUES ('".$naam."', '".$boodschap."', '".$datum."')";
 
//uitvoeren van de query :
 
if (!($temp = mysql_query($sql,$connection)))
 
showerror();
 
header ( "Location: http://www.goodnightladies.nl/gastenboek.php" );
}
?>

Zoals je ziet heb ik

PHP:
if ( isset( $_POST['info'] ) && $_POST['info'] !== "" ) {
  die();
}

Vervangen door

PHP:
if ( isset( $_POST['info'] ) && $_POST['info'] !== "" ) {
}
else{

Ik weet niet of dit het probleem verhelpt, maar probeer het is.


Verder wil ik je eropwijzen dat het verstandig is je $_POST variabelen te "escapen"

Gewoon om te voorkomen dat mensen gaan spelen met aanhalingstekens.

Dit is al wat beter :

PHP:
$naam = mysql_real_escape_string($_POST['naam']);
$boodschap = mysql_real_escape_string($_POST['boodschap']);

Succes ermee!
 
ff een vraagje, weet iemand hoe een bot te werk gaat?

Zal een bot altijd de eerste form pakken op een pagina of zal hij zoeken naar al de forms op een pagina!
 
Als je je dingetjes ophaalt van je database om ze neer te zetten, kan je ook een if(!empty("$boodschap")) doen en dan past echo'en / printen... Voor de rest gebruik je een header zonder exit...
 
Naast het php script dat verbinding maakt met de database heb ik dit:

PHP:
 <?php

//Mysql DATA selecteren


$query="SELECT * FROM gastenboek ORDER BY id DESC";
if (!($temp = mysql_query($query,$connection)))

showerror();

//mysql data weergeven

while ($gastenboek = mysql_fetch_array($temp))

{


echo"
<div><h6>Naam: <strong>".$gastenboek ['naam']."</strong> &nbsp; |  &nbsp; Datum: ".date("j-m-y, H:i:s", $gastenboek ['datum'])."</h6></div>
<div><h5>".$gastenboek ['boodschap']."</h5></div>
&nbsp;
&nbsp;
&nbsp;

 ";
 
}

?>
 
Hier komt die:

PHP:
<?php
 
//Mysql DATA selecteren
 
 
$query="SELECT * FROM gastenboek ORDER BY id DESC";
if (!($temp = mysql_query($query,$connection)))
 
showerror();
 
//mysql data weergeven
 
while ($gastenboek = mysql_fetch_array($temp))
 
{
 
if((!empty($gastenboek ['naam'])) && (!empty($gastenboek ['datum'])) && (!empty($gastenboek ['boodschap']))) {
 
echo"
<div><h6>Naam: <strong>".$gastenboek ['naam']."</strong> &nbsp; |  &nbsp; Datum: ".date("j-m-y, H:i:s", $gastenboek ['datum'])."</h6></div>
<div><h5>".$gastenboek ['boodschap']."</h5></div>
&nbsp;
&nbsp;
&nbsp;
 
 ";
 }
}
 
?>

Wat die nu dus doet is eerst kijken of de datum boodschap en(&&) naam niet(!) leeg zijn en dan pas uitvoeren.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan