Reactie pagina met captcha

Status
Niet open voor verdere reacties.

Mick Durst

Gebruiker
Lid geworden
21 feb 2004
Berichten
205
Beste lezer,

Ik ben niet heel bekend met php maar ik heb een eenvoudige reactie pagina in elkaar kunnen knutselen met wat hulp van google. Nu krijg ik wel eens spam en wil ik dit voorkomen door een captcha element in te voegen.

Ik heb nu dus een bestaand, werkend systeem en los daarvan een captcha systeem. Hoe koppel ik deze twee? Ik hoop dat jullie me kunnen helpen.

Mijn bestaande systeem bestaat uit drie elementen:
- de pagina met de reacties: gastenboek.php
Code:
<html>
<head>
<style type="text/css"> 
<!-- BODY {background:none transparent;}--> 
</style>
</head>
<body>

<?php 

echo '<BR><BR><a href="schrijf.php"><font face=verdana>Laat een reactie achter</font></a><br><br>'; 

$aBestand = file('gastenboek.txt'); 

if($aBestand) { 

    $aBestand = array_reverse($aBestand); 

    foreach($aBestand as $sBericht) { 

        $aBericht = explode('|',$sBericht); 

        echo '<font face=verdana size=2><b>Naam: '.$aBericht[0].'</b></font>'; 

        echo '<font face=verdana size=2><br>'.$aBericht[4].'</font><br><br><hr>'; 

    } 

} else { 

    echo '<font face=verdana>Er zijn nog geen berichten.</font>'; 

} 

?>
</body>
</html>

- de pagina met de invoer: schrijf.php
Code:
<html>
<head>
<style type="text/css"> 
<!-- BODY {background:none transparent;}--> 
</style>
</head>
<body>
<BR><BR><BR>
<?php 

$datum = date("d-m-Y / H:i"); 

$a=$_GET['a'];

if($a=='s'){

$naam=$_POST['naam'];

$bericht=$_POST['bericht'];

$bestand = fopen("gastenboek.txt", "a"); 

$bericht = str_replace("\n","<br>",$bericht); 

$bericht = str_replace("|","",$bericht); 

$naam = str_replace("|","",$naam);

fwrite($bestand, "$naam|$email|$datum|$REMOTE_ADDR|$bericht\n"); 

fclose($bestand); 

echo"<font face=verdana size =2>Bedankt voor uw bericht.<br><br><a href=gastenboek.php>Klik hier om terug te keren naar het gastenboek</font></a>"; 

} else { 

echo"<form method=post action=schrijf.php?a=s>"; 

echo"<font face=verdana size =2>Naam:</font><br><input type=text name=naam><br>"; 

$value=$_GET['bericht'];

?>
<BR>
<?

echo"<font face=verdana size =2>Bericht:</font><br><textarea cols=55 rows=10 name=bericht id=bericht>$value</textarea><br>"; 

echo"<input type=submit value='Verstuur'>"; 

echo"</form>"; 

} 

?>

</body>
</html>
- een leeg .txt bestand die gevuld wordt door bovenstaand.

De nieuwe bestanden die ik heb van captcha zijn:
- captcha.php
Code:
<?php 
// het random nr. aanmaken en gecodeerd opslaan in php sessie 

session_start();
$randomnr = rand(1000, 9999); 
$_SESSION['randomnr2'] = md5($randomnr);
// captcha plaatje met nummer maken - afmetingen kun je aanpassen gebruikte font
$im = imagecreatetruecolor(150, 60);
// Kleurenbepaling
$transparant = imagecolorallocate($im, 51, 80, 124);
$white = imagecolorallocate($im, 255, 255, 255); 
$grey = imagecolorallocate($im, 128, 128, 128); 
$black = imagecolorallocate($im, 0, 0, 0);
// zwarte rechthoek tekenen - afmetingen kun je aanpassen aan verschillende fonts
imagefilledrectangle($im, 0, 0, 300, 50, $black);
// hier - font.ttf' vervangen met de locatie van je eigen font bestand
$font = dirName(__FILE__).'/font/karate/Karate.ttf';
// schaduw toevoegen
imagettftext($im, 35, 0, 22, 24, $grey, $font, $randomnr);
// randomnr. toevoegen
imagettftext($im, 35, 0, 15, 26, $white, $font, $randomnr);
// voorkomen dat afbeelding ge-cached wordt
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache");
// plaatje verzenden naar browser
header ("Content-type: image/gif"); 
imagegif($im); 
imagedestroy($im); 
?>

- de html met de captcha, die dus uiteindelijk in schrijf.php moet komen (ga ik vanuit)
Code:
<html> 
<head>
<title>html formulier met php captcha</title>
</head>
<body>
<form method="post" action="write.php"> 
<input class="input" type="text" name="norobot"> 
<img src="captcha.php"><input type="submit" value="Toevoegen">
</form>
</body>
</html>

- de write.php. deze zou dus samen moeten gaan met het stukje "keer terug naar het gastenboek" in schrijf.php
Code:
<?php 
session_start();
if (md5($_POST['norobot']) == $_SESSION['randomnr2'])
{ // plaats hier php code voor geslaagde captcha
echo "goedzo - u bent geen robot"; 
}
else
{ // plaats hier php code voor gefaalde captcha
echo "U heeft de verkeerde code ingetypt";
} 
?>

Ik hoop dat jullie mij kunnen helpen want ik zie door de bomen het bos niet meer. Als mij pogingen falen constant door te weinig kennis.

Alvast vriendelijk bedankt voor de reacties.
 
Je kunt ipv een captcha beter een hidden botcheck doen, die zijn veel makkelijker te bouwen en veel lastiger te omzeilen.

Wat je doet is:

- een extra textfield opnemen in de pagina
- om dat textfield een <div> zetten, en die de CSS property display: none geven
- bovenaan je gastenboek kijken of er iets in dat textfield staat, en zo ja, direct een exit doen

Gebruikers zien het veld niet, en zullen het niet invullen (en dus nergens last van hebben en niet merken dat deze beveiliging er is)
Bots daarentegen zien het veld wel, zullen dat ook vullen met spam, en tegen de exit aanlopen waardoor hun informatie niet in het gastenboek terecht komt.

Simpel en doeltreffend ;)
 
Die kende ik nog niet, die is wel goed om te onthouden Frats!

Om je vraag van captcha te beantwoorden: (ik zou de oplossing van Frats doen, die lijkt me veel doeltreffender in jou geval.)
PHP:
<html>
<head>
<style type="text/css"> 
<!-- BODY {background:none transparent;}--> 
</style>
</head>
<body>
<BR><BR><BR>
<?php 

$datum = date("d-m-Y / H:i"); 

$a=$_GET['a'];

if($a=='s'){

$naam=$_POST['naam'];

$bericht=$_POST['bericht'];

$bestand = fopen("gastenboek.txt", "a"); 

$bericht = str_replace("\n","<br>",$bericht); 

$bericht = str_replace("|","",$bericht); 

$naam = str_replace("|","",$naam);

fwrite($bestand, "$naam|$email|$datum|$REMOTE_ADDR|$bericht\n"); 

fclose($bestand); 

echo"<font face=verdana size =2>Bedankt voor uw bericht.<br><br><a href=gastenboek.php>Klik hier om terug te keren naar het gastenboek</font></a>"; 

} else { 

echo"<form method=post action=schrijf.php?a=s>"; 

echo"<font face=verdana size =2>Naam:</font><br><input type=text name=naam><br>"; 

$value=$_GET['bericht'];

?>
<BR>
<?

echo"<font face=verdana size =2>Bericht:</font><br><textarea cols=55 rows=10 name=bericht id=bericht>$value</textarea><br>";

echo "<img src='captcha.php'><input type='text' name='norobot'>";

echo"<input type=submit value='Verstuur'>"; 

echo"</form>"; 

} 

?>

</body>
</html>
 
Klinkt goed Frats. Zou je alleen de gehele code inc. div kunnen geven?
Voordat ik weer de hele dag bezig ben om dat werkend te krijgen..

Beide bedankt!
 
Laatst bewerkt:
Ik vrees dat ik er te weinig van afweet wat het lukt me dus niet.
Dus als je me de code voor deze 2 stappen kunt geven, ben ik je zeer dankbaar:

- om dat textfield een <div> zetten, en die de CSS property display: none geven
- bovenaan je gastenboek kijken of er iets in dat textfield staat, en zo ja, direct een exit doen
 
HTML:
<div style='display: none'><input type='geefeennaam' value=''></div>

PHP:
if(!empty($_POST['geefnaam'])) {
  // of je geeft hier een fout melding, of stuurt de gebruiker terug naar de vorige pagina.
  exit;
}

De PHP code is het eerste wat er moet gebeuren alvorens hij het in het txt bestand gaat zetten of andere dingen gaat controleren.
 
Laatst bewerkt:
Bedankt T-J voor de snelle reactie.

Ik heb nu het volgende. Zou je kunnen kijken of het klopt? Want ik kan dit natuurlijk niet testen ;) Op de site zelf (www.linseys.nl, kopje reacties) geeft hij geen foutmeldingen in ieder geval.

Code:
<html>
<head>
<style type="text/css"> 
<!-- BODY {background:none transparent;}--> 
</style>
</head>
<body>
<BR><BR><BR>
<?php 

$datum = date("d-m-Y / H:i"); 

$a=$_GET['a'];

if($a=='s'){

$naam=$_POST['naam'];

$bericht=$_POST['bericht'];

$bestand = fopen("gastenboek.txt", "a"); 

$bericht = str_replace("\n","<br>",$bericht); 

$bericht = str_replace("|","",$bericht); 

$naam = str_replace("|","",$naam);

if(!empty($_POST['leegveld'])) {
  // of je geeft hier een fout melding, of stuurt de gebruiker terug naar de vorige pagina.
  exit;
}


fwrite($bestand, "$naam|$email|$datum|$REMOTE_ADDR|$bericht\n"); 

fclose($bestand); 

echo"<font face=verdana size =2>Bedankt voor uw bericht.<br><br><a href=gastenboek.php>Klik hier om terug te keren naar het gastenboek</font></a>"; 

} else { 

echo"<form method=post action=schrijf.php?a=s>";

echo"<div style='display: none'><input type='leegveld' value=''></div>";

echo"<font face=verdana size =2>Naam:</font><br><input type=text name=naam><br>"; 

$value=$_GET['bericht'];

?>

<BR>

<?

echo"<font face=verdana size =2>Bericht:</font><br><textarea cols=55 rows=10 name=bericht id=bericht>$value</textarea><br>";

echo"<input type=submit value='Verstuur'>"; 

echo"</form>"; 

} 

?>

</body>
</html>
 
Bedankt T-J voor de snelle reactie.

Ik heb nu het volgende. Zou je kunnen kijken of het klopt? Want ik kan dit natuurlijk niet testen ;) Op de site zelf (www.linseys.nl, kopje reacties) geeft hij geen foutmeldingen in ieder geval.

Code:
<html>
<head>
<style type="text/css"> 
<!-- BODY {background:none transparent;}--> 
</style>
</head>
<body>
<BR><BR><BR>
<?php 

$datum = date("d-m-Y / H:i"); 

$a=$_GET['a'];

if($a=='s'){

$naam=$_POST['naam'];

$bericht=$_POST['bericht'];

$bestand = fopen("gastenboek.txt", "a"); 

$bericht = str_replace("\n","<br>",$bericht); 

$bericht = str_replace("|","",$bericht); 

$naam = str_replace("|","",$naam);

if(empty($_POST['leegveld'])) { // Sorry, mijn fout. De ! had er niet voor gemoeten. ! betekend het tegenovergestelde. Dus True = False en False = True.
  // of je geeft hier een fout melding, of stuurt de gebruiker terug naar de vorige pagina.
  exit;
}


fwrite($bestand, "$naam|$email|$datum|$REMOTE_ADDR|$bericht\n"); 

fclose($bestand); 

echo"<font face=verdana size =2>Bedankt voor uw bericht.<br><br><a href=gastenboek.php>Klik hier om terug te keren naar het gastenboek</font></a>"; 

} else { 

echo"<form method=post action=schrijf.php?a=s>";

echo"<div style='display: none'><input type='leegveld' value=''></div>";

echo"<font face=verdana size =2>Naam:</font><br><input type=text name=naam><br>"; 

$value=$_GET['bericht'];

?>

<BR>

<?

echo"<font face=verdana size =2>Bericht:</font><br><textarea cols=55 rows=10 name=bericht id=bericht>$value</textarea><br>";

echo"<input type=submit value='Verstuur'>"; 

echo"</form>"; 

} 

?>

</body>
</html>

Ik had per ongelijk een ! voor empty() gezet, maar dat moet juist niet. dus deze heb ik nu weggehaald hierboven!

Ik zag net ook toevallig $bericht = str_replace("\n","<br>",$bericht); zien staan, maar daar is een functie voor die het altijd goed doet voor je.

$bericht = nl2br($bericht);
 
Laatst bewerkt:
Opzich wel goed dat je die fout maakte, want dan weet ik dat er iets niet klopt in het script, want hij plaatste mijn test bericht wel toen de vraagteken er stond!

Edit: ik heb nl2br ook vervangen. Dit heb ik nu:


<html>
<head>
<style type="text/css">
<!-- BODY {background:none transparent;}-->
</style>
</head>
<body>
<BR><BR><BR>
<?php

$datum = date("d-m-Y / H:i");

$a=$_GET['a'];

if($a=='s'){

$naam=$_POST['naam'];

$bericht=$_POST['bericht'];

$bestand = fopen("gastenboek.txt", "a");

$bericht = 2nlbr($bericht);

$bericht = str_replace("|","",$bericht);

$naam = str_replace("|","",$naam);

if(empty($_POST['leegveld'])) {
// of je geeft hier een fout melding, of stuurt de gebruiker terug naar de vorige pagina.
exit;
}


fwrite($bestand, "$naam|$email|$datum|$REMOTE_ADDR|$bericht\n");

fclose($bestand);

echo"<font face=verdana size =2>Bedankt voor uw bericht.<br><br><a href=gastenboek.php>Klik hier om terug te keren naar het gastenboek</font></a>";

} else {

echo"<form method=post action=schrijf.php?a=s>";

echo"<div style='display: none'><input type='leegveld' value=''></div>";

echo"<font face=verdana size =2>Naam:</font><br><input type=text name=naam><br>";

$value=$_GET['bericht'];

?>

<BR>

<?

echo"<font face=verdana size =2>Bericht:</font><br><textarea cols=55 rows=10 name=bericht id=bericht>$value</textarea><br>";

echo"<input type=submit value='Verstuur'>";

echo"</form>";

}

?>

</body>
</html>
 
Laatst bewerkt:
Ja, de !-teken betekend eigenlijk het tegenovergestelde, dus True -> False en False -> True.
Het klopt juist wel, hij moet er wel voorstaan. Als je het nu probeert zal hij de exit; geven. Een robot zal waarde in het veld zetten en de empty zal dan dus False geven, maar door de !-teken zal hij omgezet worden naar True en moet hij dus de exit; geven.
Hij werkte de eerste keer al goed!

Sorry, zal in het vervolg meer koffie drinken om scherp te blijven! :o
 
Hahaha oke ik ben al heel blij dat je me helpt! Alleen hij geeft een foutmelding op regel 23 en dat is:
$bericht = 2nlbr($bericht);
 
Regel 1: Functies beginnen nooit met een cijfer. ;)
De functie heet ook nl2br() (New Line 2 Break)
 
Super! het werkt! heel erg bedankt T-J :D Ik zal ook even koffie halen met mijn mooie overtyp actie :p

Wat is het verschil eigenlijk met $bericht = str_replace("\n","<br>",$bericht); ?
 
Het verschil is dat je niet alleen een \n zal tegenkomen, soms is er ook spraken van een \r of \n\r. nl2br pakt ze allemaal mee.
 
Misschien dat ik eerst maar een cursus php moet gaan volgen :P
Wat ik nu doe is eenvoudige scripts klakkeloos overnemen en meestal lukt het me wel om ze werkend te krijgen, maar dat is vaak met meer geluk dan wijsheid. Ik heb namelijk geen idee hoe daadwerkelijk de opbouw in elkaar steekt van een php document.

Bedankt voor de hulp T-J!
 
Zojuist toch een (spaanstalig) spam bericht gehad op de site :(

Het bevatte een link naar een 'blauwe pilletjes website'...
 
Kan je de schrijf.php nog een keer posten zoals hij nu op de website staat?
 
Ik vis dit eventjes van je site af en dat klopt dus niet :P

Je hebt dit:
HTML:
<input type='leegveld' value=''>

Maar het moet zo:
HTML:
<input type="text" name="leegveld" value="" />

Misschien helpt dat al :)
 
En weer bedankt voor de snelle reacties!

Volgens mij werkt het wel want als ik de ! weghaal (dus omgekeerde code -> als veld leeg is doet hij het niet) dan geeft hij de juiste foutcode! Helpt het dan wel om type=tekst toe te voegen?

Code:
<html>
<head>
<style type="text/css"> 
<!-- BODY {background:none transparent;}--> 
</style>
</head>
<body>
<BR><BR><BR>
<?php 

$datum = date("d-m-Y / H:i"); 

$a=$_GET['a'];

if($a=='s'){

$naam=$_POST['naam'];

$bericht=$_POST['bericht'];

$bestand = fopen("gastenboek.txt", "a"); 

$bericht = nl2br($bericht); 

$bericht = str_replace("|","",$bericht); 

$naam = str_replace("|","",$naam);

if(!empty($_POST['leegveld'])) {
  echo '<BR><BR>Er is een fout opgetreden. Klik <a href="schrijf.php"><font face=verdana>hier</font></a> om het nogmaals te proberen<br><br>';
  exit;
}


fwrite($bestand, "$naam|$email|$datum|$REMOTE_ADDR|$bericht\n"); 

fclose($bestand); 

echo"<font face=verdana size =2>Bedankt voor uw bericht.<br><br><a href=gastenboek.php>Klik hier om terug te keren naar het gastenboek</font></a>"; 

} else { 

echo"<form method=post action=schrijf.php?a=s>";

echo"<div style='display: none'><input type='leegveld' value=''></div>";

echo"<font face=verdana size =2>Naam:</font><br><input type=text name=naam><br>"; 

$value=$_GET['bericht'];

?>

<BR>

<?

echo"<font face=verdana size =2>Bericht:</font><br><textarea cols=55 rows=10 name=bericht id=bericht>$value</textarea><br>";

echo"<input type=submit value='Verstuur'>"; 

echo"</form>"; 

} 

?>

</body>
</html>

edit: regel is nu :

echo"<div style='display: none'><input type="tekst"name="leegveld" value=""></div>";
 
Laatst bewerkt:
Zie het antwoord van Frats! ;)

Als je het !-teken weghaalt, klopt het dat hij een exit uitvoert, dit omdat leegveld dan niet bestaat en dus leeg is.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan