login  Naam:   Wachtwoord: 
Registreer je!
 Forum

beveiliging formulier captcha en cookies

Offline Murderer - 01/03/2012 18:32
Avatar van MurdererLid Ter gelegenheid van een bruiloft ben ik bezig met een simpele 'Save the date' website, waarop de genodigden hun gegevens invullen in een simpel contactformulier. Dit is allemaal gelukt. Echter wil ik het nog een beetje beveiligen. Allereerst wil ik reCAPTCHA toevoegen om te voorkomen dat bots het formulier invullen. Dit is me inmiddels een beetje gelukt, alleen kan ik het formulier nog steeds opsturen zonder reCAPTCHA in te vullen. Kennelijk wordt er eerder verzonden dan gecontroleerd door reCAPTCHA. Volgens mij komt dit omdat de code niet op de goede plaats staat. Hoe los ik dit op? Als leek zie ik dit niet. Hopelijk kunnen jullie me helpen.

Daarnaast wil ik graag een cookie aan de pagina toevoegen, zodat genodigden het formulier niet (per ongeluk) meerdere keren in kunnen vullen. Hoe voeg ik zo'n cookie toe en hoe controleer ik vervolgens op de aanwezigheid ervan? Ik heb hier vandaag al heel veel over gelezen over de functie setcookie() en de superglobal $_COOKIE maar toch kom ik er niet helemaal uit, misschien willen jullie wat voorbeelden plaatsen of concrete suggesties doen. Want ik snap vooral niet goed waar ik de cookie moet aanmaken zodat hij pas aangemaakt wordt nadat het formulier succesvol is verzonden. Ook weet ik niet goed waar ik de controle op een reeds bestaande cookie (en dus een reeds ingevuld formulier) moet uitvoeren.

Dank u! Hieronder mijn script:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
  4. <head>
  5. <title>
  6. Mattijs &amp; Willemijn gaan trouwen! - 16 juni 2012
  7. </title>
  8.  
  9. <meta http-equiv="content-type" content="application/xml; charset=utf-8" />
  10. <meta http-equiv="Author" content="bartcrum.com - Bart Crum" />
  11. <meta name="Language" content="NL" />
  12. <meta name="expires" content="never" />
  13. <meta name="security" content="PUBLIC" />
  14. <meta name="charset" content="ISO-8859-1" />
  15. <meta name="REVISIT-AFTER" content="1 DAY" />
  16. <meta name="distribution" content="Global" />
  17. <meta name="robots" content="ALL,INDEX,FOLLOW" />
  18. <meta name="publisher" content="http://www.bartcrum.com/mattijs&willemijn/" />
  19. <meta name="copyright" content="Copyright &copy;2012 - www.bartcrum.com" />
  20. <meta name="keywords" content="trouwen, mattijs kaak, willemijn olthoff, 16 juni, 2012, historisch museum, muziek, dans, openingsdans, amsterdam, 020, a'dam, " />
  21. <meta name="description" content="Welkom. Dit is de 'Save the Date' website voor de bruiloft van Mattijs en Willemijn. Ook wordt er van u gevraagd uw stem uit te brengen op een van de genoemde
  22. nummers voor de openingsdans. Bij voorbaat dank." />
  23.  
  24.  
  25. <!-- computerhulp.batrcrum.com, voor al uw computer problemen. -->
  26.  
  27. <script type="text/javascript">
  28. <!--
  29. window.status="Copyright &copyright2012 - www.bartcrum.com"
  30. //-->
  31. </script>
  32.  
  33. <link href="incl_styles.css" rel="stylesheet" type="text/css" />
  34.  
  35. </head>
  36.  
  37. <?php
  38. if(mysql_connect('localhost','',''))
  39. {
  40. }
  41. else
  42. {
  43. echo 'Kan geen verbinding maken met het database';
  44. exit;
  45. }
  46.  
  47. require_once('recaptchalib.php');
  48.  
  49. // Get a key from https://www.google.com/recaptcha/admin/create
  50. $publickey = "";
  51. $privatekey = "";
  52.  
  53. # the response from reCAPTCHA
  54. $resp = null;
  55. # the error code from reCAPTCHA, if any
  56. $error = null;
  57.  
  58. # was there a reCAPTCHA response?
  59. if ($_POST["recaptcha_response_field"]) {
  60. $resp = recaptcha_check_answer ($privatekey,
  61. $_SERVER["REMOTE_ADDR"],
  62. $_POST["recaptcha_challenge_field"],
  63. $_POST["recaptcha_response_field"]);
  64.  
  65. if ($resp->is_valid) {
  66. echo "You got it!";
  67. } else {
  68. # set the error code so that we can display it
  69. $error = $resp->error;
  70. }
  71. }
  72.  
  73. $email = addslashes($_POST['email']);
  74. $postcode = addslashes($_POST['postcode']);
  75. $telefoonnr = addslashes($_POST['telefoonnr']);
  76.  
  77. if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST))
  78. {
  79. $aFouten = array();
  80. if($_POST['voornaam'] == '')
  81. {
  82. $aFouten[] = 'Je hebt geen voornaam ingevuld';
  83. }
  84. if($_POST['achternaam'] == '')
  85. {
  86. $aFouten[] = 'Je hebt geen achternaam ingevuld';
  87. }
  88. if($_POST['adres'] == '')
  89. {
  90. $aFouten[] = 'Je hebt geen adres ingevuld';
  91. }
  92. if(!preg_match('~^[0-9]{4}?[a-z]{2}$~i', $postcode))
  93. {
  94. $aFouten[] = 'Je hebt geen geldige postcode ingevuld';
  95. }
  96. if($_POST['woonplaats'] == '')
  97. {
  98. $aFouten[] = 'Je hebt geen woonplaats ingevuld';
  99. }
  100. if(!preg_match('~^[a-z0-9][a-z0-9_.\-]*@([a-z0-9]+\.)*[a-z0-9][a-z0-9\-]+\.([a-z]{2,6})$~i', $email))
  101. {
  102. $aFouten[] = 'Je hebt een ongeldig emailadres ingevuld';
  103. }
  104. if(!preg_match('~^[0-9]{10}?$~i', $telefoonnr))
  105. {
  106. $aFouten[] = 'Je hebt geen geldig telefoonnummer ingevuld';
  107. }
  108. if($_POST['aantal'] == '')
  109. {
  110. $aFouten[] = 'Je hebt niet ingevuld met hoeveel personen je komt';
  111. }
  112. if($_POST['track'] == '')
  113. {
  114. $aFouten[] = 'Je hebt nog geen openingsnummer gekozen!';
  115. }
  116.  
  117. if(count($aFouten) != 0)
  118. {
  119. echo "<div id=\"fouten\">
  120. De volgende fouten zijn opgetreden bij het invoeren van je gegevens:
  121. <BR /><ul type=\"square\">";
  122. for($Fi = 0; $Fi < count($aFouten); $Fi++)
  123. {
  124. echo "<li>".$aFouten[$Fi]."</li>";
  125. }
  126. echo "</ul>
  127. <a href=\"javascript:history.go(-1);\" class=\"linkterug\">Klik hier om terug te keren en het formulier goed in te vullen.</a>
  128. </div>";
  129. }
  130. else
  131. {
  132. mysql_query("INSERT INTO bruiloft (voornaam,achternaam,adres,postcode,woonplaats,email,telefoonnr,aanwezig,aantal,track) VALUES ('".mysql_real_escape_string($_POST['voornaam'])."','".mysql_real_escape_string($_POST['achternaam'])."','".mysql_real_escape_string($_POST['adres'])."','".mysql_real_escape_string($_POST['postcode'])."','".mysql_real_escape_string($_POST['woonplaats'])."','".mysql_real_escape_string($_POST['email'])."','".mysql_real_escape_string($_POST['telefoonnr'])."','".mysql_real_escape_string($_POST['aanwezig'])."','".mysql_real_escape_string($_POST['aantal'])."','".mysql_real_escape_string($_POST['track'])."')") or die (mysql_error());
  133.  
  134. echo "<div id=\"dank\">
  135. Bedankt! De gegevens zijn succesvol opgeslagen in de database.
  136. <BR />
  137. We verheugen ons ontzettend op je/jullie komst. We zien elkaar op 16 juni!
  138. <BR />
  139. Liefs,
  140. <BR /><BR />
  141. Willemijn & Mattijs
  142. </div>";
  143. }
  144.  
  145. }
  146. else
  147. {
  148. ?>
  149.  
  150. <body>
  151.  
  152. <div id="container">
  153. <div id="plaatje" align="center">
  154. <img src="" id="plaatje" />
  155. </div>
  156.  
  157. <div id="form" align="center">
  158. <form method="POST" action=" <?=$_SERVER['PHP_SELF']?> ">
  159.  
  160. <table border="0" width="100%">
  161. <tr>
  162. <td width="45%">
  163. Voornaam:
  164. </td>
  165. <td width="55%">
  166. <input type="text" name="voornaam" id="voornaam" size="20" maxlength="30" />
  167. </td>
  168. </tr>
  169. <tr>
  170. <td width="45%">
  171. Achternaam:
  172. </td>
  173. <td width="55%">
  174. <input type="text" name="achternaam" id="achternaam" size="25" maxlength="40" />
  175. </td>
  176. </tr>
  177. <tr>
  178. <td width="45%">
  179. Adres:
  180. </td>
  181. <td width="55%">
  182. <input type="text" name="adres" id="adres" size="30" maxlength="50" />
  183. </td>
  184. </tr>
  185. <tr>
  186. <td width="45%">
  187. Postcode:
  188. </td>
  189. <td width="55%">
  190. <input type="text" name="postcode" id="postcode" size="10" maxlength="6" />
  191. </td>
  192. </tr>
  193. <tr>
  194. <td width="45%">
  195. Woonplaats:
  196. </td>
  197. <td width="55%">
  198. <input type="text" name="woonplaats" id="woonplaats" size="25" maxlength="45" />
  199. </td>
  200. </tr>
  201. <tr>
  202. <td width="45%">
  203. E-mail:
  204. </td>
  205. <td width="55%">
  206. <input type="text" name="email" id="email" size="25" maxlength="50" />
  207. </td>
  208. </tr>
  209. <tr>
  210. <td width="45%">
  211. Telefoonnummer:
  212. </td>
  213. <td width="55%">
  214. <input type="text" name="telefoonnr" id="telefoonnr" size="20" maxlength="10" />
  215. </td>
  216. </tr>
  217. <tr>
  218. <td width="45%">
  219. Kom je naar de bruiloft op zaterdag 16 juni 2012?
  220. </td>
  221. <td width="55%">
  222. <input type="radio" name="aanwezig" id="aanwezig" value="aanwezig" CHECKED /> Aanwezig
  223. <input type="radio" name="aanwezig" id="aanwezig" value="afwezig" /> Afwezig
  224. </td>
  225. </tr>
  226. <tr>
  227. <td width="45%">
  228. Zo ja, met hoeveel personen in totaal?
  229. </td>
  230. <td width="55%">
  231. <select name="aantal" id="aantal">
  232. <option value="" SELECTED>Maak een keuze</option>
  233. <option value="1">1 persoon</option>
  234. <option value="2">2 personen</option>
  235. </select>
  236. </td>
  237. </tr>
  238. <tr>
  239. <td width="45%">
  240. Met welk nummer moeten we het feest openen?
  241. </td>
  242. <td width="55%">
  243. <select name="track" id="track">
  244. <option value="" SELECTED>Maak een keuze</option>
  245. <option value="move like jagger">Maroon 5 ft. Christina Aguilera - Move Like Jagger</option>
  246. <option value="sex on fire">Kings of Leon - Sex on Fire</option>
  247. <option value="jetlag">Simple Plan ft. Natasha Bedingfield - Jetlag</option>
  248. <option value="fight for your right">Beastie Boys - Fight for your Right</option>
  249. <option value="hold on">Wilson Phillips - Hold On</option>
  250. <option value="bride in june">Seven Brides for Seven Brothers - Bride in June</option>
  251. <option value="100 procent pure love">Crystal Waters - 100% pure love</option>
  252. <option value="sing it back">Moloko - Sing it Back</option>
  253. <option value="baby">Justin Bieber ft. Ludacris - Baby</option>
  254. <option value="i follow rivers">Lukke Li - I follow rivers (The Magician Remix)</option>
  255. </select>
  256. </td>
  257. </tr>
  258. <tr>
  259. <td width="45%">
  260. </td>
  261. <td width="55%">
  262. <?php
  263. echo recaptcha_get_html($publickey, $error);
  264. ?>
  265. </td>
  266. </tr>
  267. <tr>
  268. <td width="45%">
  269. </td>
  270. <td width="55%">
  271. <input type="reset" value="Beginwaarden" />
  272. <input type="submit" value="Verzenden" />
  273. </td>
  274. </tr>
  275. </table>
  276. </form>
  277. <?
  278. }
  279. ?>
  280. </div>
  281.  
  282. </div>
  283. </body>
  284. </html>

5 antwoorden

Gesponsorde links
Offline Pieter - 02/03/2012 07:06
Avatar van Pieter Gouden medaille

SEO guru
Je moet de hele validatie van je code plaatsen waar de "You got it!" staat, ipv erachter te beginnen. En vergeet natuurlijk ook niet je public en private key straks in te vullen. 
Offline Maarten - 02/03/2012 10:35
Avatar van Maarten Erelid Of die captcha validatie in je huidige validatie opnemen, en dan die $error opnemen in $aFouten ipv deze te echo'en.
Bedankt door: Murderer
Offline Murderer - 02/03/2012 11:25 (laatste wijziging 02/03/2012 11:25)
Avatar van Murderer Lid Maarten,

Dank. Ik ben al eerder bezig geweest die captcha validatie er zo in te verwerken.
Ik heb het nu als volgt gedaan, maar ook dat werkt niet.

  1. if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST))
  2. {
  3. $aFouten = array();
  4. if($_POST['voornaam'] == '')
  5. {
  6. $aFouten[] = 'Je hebt geen voornaam ingevuld';
  7. }
  8. if($_POST['track'] == '')
  9. {
  10. $aFouten[] = 'Je hebt nog geen openingsnummer gekozen!';
  11. }
  12. # was there a reCAPTCHA response?
  13. if($_POST['recaptcha_response_field']) {
  14. $resp = recaptcha_check_answer ($privatekey,
  15. $_SERVER['REMOTE_ADDR'],
  16. $_POST['recaptcha_challenge_field'],
  17. $_POST['recaptcha_response_field']);
  18.  
  19. if ($resp->error) {
  20. $aFouten[] = $error;
  21. }
  22. }
  23.  
  24. if(count($aFouten) != 0)
  25. {
  26. echo '<div id="fouten">
  27. De volgende fouten zijn opgetreden bij het invoeren van je gegevens:
  28. <BR /><ul type="square">';
  29. for($Fi = 0; $Fi < count($aFouten); $Fi++)
  30. {
  31. echo '<li>'.$aFouten[$Fi].'</li>';
  32. }
  33. echo '</ul>
  34. <a href="javascript:history.go(-1);" class="linkterug">Klik hier om terug te keren en het formulier goed in te vullen.</a>
  35. </div>';
  36. }
  37. else
  38. {
  39.  
  40. mysql_query.......


Vervolgens volgt de mysql query. Helemaal bovenaan de pagina, dus voor het stuk code dat hierboven staat heb ik de require_once() en public en private keys van de captcha.

  1. <?php
  2. require_once('recaptchalib.php');
  3.  
  4. // Get a key from https://www.google.com/recaptcha/admin/create
  5. $publickey = '6LeyXs4SAAAAACeQhD2pbOPYFJsjuF8bLwYblu-D';
  6. $privatekey = '6LeyXs4SAAAAAEzvulClhzKLhRuqO_MlqnKps9VQ';
  7.  
  8. # the response from reCAPTCHA
  9. $resp = null;
  10. # the error code from reCAPTCHA, if any
  11. $error = 'De reCAPTCHA code klopt niet. Probeer het opnieuw';
  12. ?>
Offline Maarten - 02/03/2012 11:49
Avatar van Maarten Erelid Doe eens:
  1. if($_POST['recaptcha_response_field']) {
  2. if(trim($_POST['captcha_response_field']) == '') {
  3. $aFouten[] = 'het ding invullen aub';
  4. } else {
  5. // Hier heb je dan je validatie, is goed volgens mij
  6. }
  7. } else {
  8. $aFouten[] = 'er is geen captcha response.. dus dan zou de veldnaam wel eens fout kunnen zijn.';
  9. }
Offline keverineke - 04/03/2012 20:52
Avatar van keverineke Lid Even zeggen dat je bij de input "aanwezig", "afwezig" 2X als id en name "aanwezig" zeget hebt. ;)
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.21s