Recaptcha response in verzonden contactformulier verwijderen/verbergen

Status
Niet open voor verdere reacties.

Elsvanl

Gebruiker
Lid geworden
29 mrt 2020
Berichten
7
Beste,

Kan iemand me tonen waar en welke code ik kan gebruiken om het g-recaptcha-response antwoord te verwijderen in de verzonden email?
Zie voorbeeld email:

Form submission:

Name:
Els

Email:
info@xxxxx.be

Message:

Test contactformulier website.


G-recaptcha-response:
03AHaCkAaH3A_6PHuUvYbs2gjCTJoDmb6_x0fvpcvhwNpG5fVCL_aNhj_y64IohvP2_BVuFKAdZH
v7F6-O_aa5FGXIQLyu6gph-5STdqQ-JI5QOme6bFLEC3b6PpMex-do46D6yZQ-i8M7YAunJQ-mWF
-vxFJJBZkStoZyOHBY47iBZmmTxj_mOMpL_emu9Ho2mMGCU6sLBGD16j77kCo6NmFP6aYqLpwPbC
qd4cFv2hfanXmWDkSF57gwTASzfSrHbftdsgP4X6we3NhKqcBAHFQW8CTvERJtt9pHx2TYld_cUi
4vGNJWsq5B-O6KPbboCt5a98-jzQ7Fa_LbN7gIrkYZno-0OMZ6CFXGTYKBVrsOMZ54DW-yjCOMyX
sdPDxUbUvC2ubug2OC



Hierbij de formhandler.php script:

<?php
namespace FormGuide\Handlx;
use FormGuide\PHPFormValidator\FormValidator;
use PHPMailer;
use FormGuide\Handlx\Microtemplate;
use Gregwar\Captcha\CaptchaBuilder;

/**
* FormHandler
* A wrapper class that handles common form handling tasks
* - handles Form validations using PHPFormValidator class
* - sends email using PHPMailer
* - can handle captcha validation
* - can handle file uploads and attaching the upload to email
*
* ==== Sample usage ====
* $fh = FormHandler::create()->validate(function($validator)
* {
* $validator->fields(['name','email'])
* ->areRequired()->maxLength(50);
* $validator->field('email')->isEmail();
*
* })->useMailTemplate(__DIR__.'/templ/email.php')
* ->sendEmailTo('you@website.com');
*
* $fh->process($_POST);
*/
class FormHandler
{
private $emails;
public $validator;
private $mailer;
private $mail_template;
private $captcha;
private $attachments;
private $recaptcha;

public function __construct()
{
$this->emails = array();
$this->validator = FormValidator::create();
$this->mailer = new PHPMailer;
$this->mail_template='';

$this->mailer->Subject = "Contactformulier website De Vierschaar";

$host = isset($_SERVER['SERVER_NAME'])?$_SERVER['SERVER_NAME']:'localhost';
$from_email ='forms@'.$host;
$this->mailer->setFrom($from_email,'Contactformulier website',false);

$this->captcha = false;

$this->attachments = [];

$this->recaptcha =null;

}

/**
* sendEmailTo: add a recipient email address
* @param string/array $email_s one or more emails. If more than one emails, pass the emails as array
* @return The form handler object itself so that the methods can be chained
*/
public function sendEmailTo($email_s)
{
if(is_array($email_s))
{
$this->emails =array_merge($this->emails, $email_s);
}
else
{
$this->emails[] = $email_s;
}

return $this;
}

public function useMailTemplate($templ_path)
{
$this->mail_template = $templ_path;
return $this;
}

/**
* [attachFiles find the file uplods and attach to the email]
* @param array $fields The array of field names
*/
public function attachFiles($fields)
{
$this->attachments = array_merge($this->attachments, $fields);
return $this;
}

public function getRecipients()
{
return $this->emails;
}

/**
* [validate add Validations. This function takes a call back function which receives the PHPFormValidator object]
* @param function $validator_fn The funtion gets a validator parameter using which, you can add validations
*/
public function validate($validator_fn)
{
$validator_fn($this->validator);
return $this;
}

public function requireReCaptcha($config_fn=null)
{
$this->recaptcha = new ReCaptchaValidator();
$this->recaptcha->enable(true);
if($config_fn)
{
$config_fn($this->recaptcha);
}
return $this;
}
public function getReCaptcha()
{
return $this->recaptcha;
}

public function requireCaptcha($enable=true)
{
$this->captcha = $enable;
return $this;
}

public function getValidator()
{
return $this->validator;
}

public function configMailer($mailconfig_fn)
{
$mailconfig_fn($this->mailer);
return $this;
}

public function getMailer()
{
return $this->mailer;
}

public static function create()
{
return new FormHandler();
}

public function process($post_data)
{
if($this->captcha === true)
{
$res = $this->validate_captcha($post_data);
if($res !== true)
{
return $res;
}
}
if($this->recaptcha !== null &&
$this->recaptcha->isEnabled())
{
if($this->recaptcha->validate() !== true)
{
return json_encode([
'result'=>'recaptcha_validation_failed',
'errors'=>['captcha'=>'ReCaptcha Validation Failed.']
]);
}
}

$this->validator->test($post_data);

//if(false == $this->validator->test($post_data))
if($this->validator->hasErrors())
{
return json_encode([
'result'=>'validation_failed',
'errors'=>$this->validator->getErrors(/*associative*/ true)
]);
}

if(!empty($this->emails))
{
foreach($this->emails as $email)
{
$this->mailer->addAddress($email);
}
$this->compose_mail($post_data);

if(!empty($this->attachments))
{
$this->attach_files();
}

if(!$this->mailer->send())
{
return json_encode([
'result'=>'error_sending_email',
'errors'=> ['mail'=> $this->mailer->ErrorInfo]
]);
}
}

return json_encode(['result'=>'success']);
}

private function validate_captcha($post)
{
@session_start();
if(empty($post['captcha']))
{
return json_encode([
'result'=>'captcha_error',
'errors'=>['captcha'=>'Captcha code not entered']
]);
}
else
{
$usercaptcha = trim($post['captcha']);

if($_SESSION['user_phrase'] !== $usercaptcha)
{
return json_encode([
'result'=>'captcha_error',
'errors'=>['captcha'=>'Captcha code does not match']
]);
}
}
return true;
}


private function attach_files()
{

foreach($this->attachments as $file_field)
{
if (!array_key_exists($file_field, $_FILES))
{
continue;
}
$filename = $_FILES[$file_field]['name'];

$uploadfile = tempnam(sys_get_temp_dir(), sha1($filename));

if (!move_uploaded_file($_FILES[$file_field]['tmp_name'],
$uploadfile))
{
continue;
}

$this->mailer->addAttachment($uploadfile, $filename);
}
}

private function compose_mail($post)
{
$content = "Form submission: \n\n";
foreach($post as $name=>$value)
{
$content .= ucwords($name).":\n";
$content .= "$value\n\n";
}
$this->mailer->Body = $content;
}
}



Alvast bedankt!
Mvg,
Els
 
Je code is onleesbaar.
Zet deze eens tussen php-tags, door op de PHP-knop te drukken tijdens het bewerken?
 
Is deze zo beter leesbaar?
Alvast bedankt.

PHP:
<?php
namespace FormGuide\Handlx;
use FormGuide\PHPFormValidator\FormValidator;
use PHPMailer;
use FormGuide\Handlx\Microtemplate;
use Gregwar\Captcha\CaptchaBuilder;

/**
* FormHandler
* A wrapper class that handles common form handling tasks
* - handles Form validations using PHPFormValidator class
* - sends email using PHPMailer
* - can handle captcha validation
* - can handle file uploads and attaching the upload to email
*
* ==== Sample usage ====
* $fh = FormHandler::create()->validate(function($validator)
* {
* $validator->fields(['name','email'])
* ->areRequired()->maxLength(50);
* $validator->field('email')->isEmail();
*
* })->useMailTemplate(__DIR__.'/templ/email.php')
* ->sendEmailTo('you@website.com');
*
* $fh->process($_POST);
*/
class FormHandler
{
private $emails;
public $validator;
private $mailer;
private $mail_template;
private $captcha;
private $attachments;
private $recaptcha;

public function __construct()
{
$this->emails = array();
$this->validator = FormValidator::create();
$this->mailer = new PHPMailer;
$this->mail_template='';

$this->mailer->Subject = "Contactformulier website De Vierschaar";

$host = isset($_SERVER['SERVER_NAME'])?$_SERVER['SERVER_NAME']:'localhost';
$from_email ='forms@'.$host;
$this->mailer->setFrom($from_email,'Contactformulier website',false);

$this->captcha = false;

$this->attachments = [];

$this->recaptcha =null;

}

/**
* sendEmailTo: add a recipient email address
* @param string/array $email_s one or more emails. If more than one emails, pass the emails as array
* @return The form handler object itself so that the methods can be chained
*/
public function sendEmailTo($email_s)
{
if(is_array($email_s))
{
$this->emails =array_merge($this->emails, $email_s);
}
else
{
$this->emails[] = $email_s;
}

return $this;
}

public function useMailTemplate($templ_path)
{
$this->mail_template = $templ_path;
return $this;
}

/**
* [attachFiles find the file uplods and attach to the email]
* @param array $fields The array of field names
*/
public function attachFiles($fields)
{
$this->attachments = array_merge($this->attachments, $fields);
return $this;
}

public function getRecipients()
{
return $this->emails;
}

/**
* [validate add Validations. This function takes a call back function which receives the PHPFormValidator object]
* @param function $validator_fn The funtion gets a validator parameter using which, you can add validations
*/
public function validate($validator_fn)
{
$validator_fn($this->validator);
return $this;
}

public function requireReCaptcha($config_fn=null)
{
$this->recaptcha = new ReCaptchaValidator();
$this->recaptcha->enable(true);
if($config_fn)
{
$config_fn($this->recaptcha);
}
return $this;
}
public function getReCaptcha()
{
return $this->recaptcha;
}

public function requireCaptcha($enable=true)
{
$this->captcha = $enable;
return $this;
}

public function getValidator()
{
return $this->validator;
}

public function configMailer($mailconfig_fn)
{
$mailconfig_fn($this->mailer);
return $this;
}

public function getMailer()
{
return $this->mailer;
}

public static function create()
{
return new FormHandler();
}

public function process($post_data)
{
if($this->captcha === true)
{
$res = $this->validate_captcha($post_data);
if($res !== true)
{
return $res;
}
}
if($this->recaptcha !== null &&
$this->recaptcha->isEnabled())
{
if($this->recaptcha->validate() !== true)
{
return json_encode([
'result'=>'recaptcha_validation_failed',
'errors'=>['captcha'=>'ReCaptcha Validation Failed.']
]);
}
}

$this->validator->test($post_data);

//if(false == $this->validator->test($post_data))
if($this->validator->hasErrors())
{
return json_encode([
'result'=>'validation_failed',
'errors'=>$this->validator->getErrors(/*associative*/ true)
]);
}

if(!empty($this->emails))
{
foreach($this->emails as $email)
{
$this->mailer->addAddress($email);
}
$this->compose_mail($post_data);

if(!empty($this->attachments))
{
$this->attach_files();
}

if(!$this->mailer->send())
{
return json_encode([
'result'=>'error_sending_email',
'errors'=> ['mail'=> $this->mailer->ErrorInfo]
]);
}
}

return json_encode(['result'=>'success']);
}

private function validate_captcha($post)
{
@session_start();
if(empty($post['captcha']))
{
return json_encode([
'result'=>'captcha_error',
'errors'=>['captcha'=>'Captcha code not entered']
]);
}
else
{
$usercaptcha = trim($post['captcha']);

if($_SESSION['user_phrase'] !== $usercaptcha)
{
return json_encode([
'result'=>'captcha_error',
'errors'=>['captcha'=>'Captcha code does not match']
]);
}
}
return true;
}


private function attach_files()
{

foreach($this->attachments as $file_field)
{
if (!array_key_exists($file_field, $_FILES))
{
continue;
}
$filename = $_FILES[$file_field]['name'];

$uploadfile = tempnam(sys_get_temp_dir(), sha1($filename));

if (!move_uploaded_file($_FILES[$file_field]['tmp_name'],
$uploadfile))
{
continue;
}

$this->mailer->addAttachment($uploadfile, $filename);
}
}

private function compose_mail($post)
{
$content = "Form submission: \n\n";
foreach($post as $name=>$value)
{
$content .= ucwords($name).":\n";
$content .= "$value\n\n";
}
$this->mailer->Body = $content;
}
}
 
Hoe roep je deze class aan?

Ik zie het al: Ik zal zo even een mooie oplossing bakken :)
 
Laatst bewerkt:
Vervang de compose_mail functie door onderstaande, en het veld wordt eruit gefilterd.

PHP:
private function compose_mail($post) {
  $ignore_fields = array('G-recaptcha-response','nog_een_veld', 'eventueel_nog_een_veld');
  $content = "Form submission: \n\n";
  foreach($post as $name=>$value) {
     if(!in_array($name,$ignore_fields)) {
        $content .= ucwords($name).":\n";
        $content .= "$value\n\n";
     }
  }

  $this->mailer->Body = $content;
}

Ook andere velden die je wilt negeren kan je toevoegen aan de array.
Voor de OO-liefhebbers: Ik had er ook een setting van kunnen maken, maar ik wil nu even geen moeilijke integratie leveren :)
 
Laatst bewerkt:
Bedankt voor uw antwoord.
Ik heb deze code vervangen en heb het ook eens getest zonder hoofdletter G maar nu wil hij het contactformulier niet verzenden maar hij geeft ook geen syntax errors aan.
Wat zou ik nog kunnen proberen?
Alvast bedankt!

PHP:
private function compose_mail($post) {
  $ignore_fields = array('G-recaptcha-response');
  $content = "Form submission: \n\n";
  foreach($post as $name=>$value) {
     if(!in_array($name,$ignore_fields)) {
        $content .= ucwords($name).":\n";
        $content .= "$value\n\n";
     }
  }
 
  $this->mailer->Body = $content;
}
 
Wat zegt de error log?

je moet wel de hoofdletter gebruiken uiteraard.
Hier zie ik geen syntaxfouten, dus ik denk dat je het verkeerd overgenomen hebt, of wat meer gesloopt hebt dan nodig is?
 
Laatst bewerkt:
Ik krijg geen error log, noch de melding wanneer er iets fout is gegaan met het verzenden van het bericht.
Hij blijft 'hangen' wanneer ik op verzenden druk.
 
Vreemd? En als je terug gaat naar de vorige situatie?
 
Dan verzend hij de email correct maar met de G-recaptch-response code.

Hierbij de Recaptchavalidator.php:

PHP:
<?php
namespace FormGuide\Handlx;

class ReCaptchaValidator
{
	private $enabled;
	private $secret;
	public function __construct()
	{
		$this->enabled=false;
	}
	
	public function isEnabled()
	{
		return $this->enabled;	
	}

	public function enable($enable)
	{
		$this->enabled = $enable;
	}

	public function initSecretKey($key)
	{
		$this->secret = $key;
	}

	public function validate()
	{
		if(empty($_POST['g-recaptcha-response']))
		{
			return false;
		}

		$captcha=$_POST['g-recaptcha-response'];

		$url = 
		'https://www.google.com/recaptcha/api/siteverify?secret='.$this->secret.'&response='.$captcha.'&remoteip='.$_SERVER['REMOTE_ADDR'];

		$resp_raw = file_get_contents($url);

		$response=json_decode($resp_raw, true);

		if(!empty($response['success']) && $response['success'])
		{
			return true;
		}
		return false;
	}
}

En de handler.php:

PHP:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
/*
Tested working with PHP5.4 and above (including PHP 7 )

 */
require_once './vendor/autoload.php';

use FormGuide\Handlx\FormHandler;


$pp = new FormHandler(); 

$validator = $pp->getValidator();
$validator->fields(['Name','Email'])->areRequired()->maxLength(50);
$validator->field('Email')->isEmail();
$validator->field('Message')->maxLength(6000);


$pp->requireReCaptcha();
$pp->getReCaptcha()->initSecretKey('XXXXXXXXXXXXXXXXXXXXXXXX');


$pp->sendEmailTo('info@xxxxxxxxxxx.be'); // ← Your email here

echo $pp->process($_POST);

Moet ik hieraan misschien ook nog iets aanpassen?
Alvast bedankt.
 
Laatst bewerkt door een moderator:
Wel raar dat het script met mijn wijziging niks doet?

Als ik die functie op simpele wijze zo uitvoer, dan filtert hij die reCaptcha-code er gewoon uit?
Overigens is dit niet om te kopiëren en te plakken. Het demonstreert enkel de werking!
https://3v4l.org/DPjkN
PHP:
<?php

function compose_mail($post) {
  $ignore_fields = array('G-recaptcha-response');
  $content = "Form submission: \n\n";
  foreach($post as $name=>$value) {
     if(!in_array($name,$ignore_fields)) {
        $content .= ucwords($name).":\n";
        $content .= "$value\n\n";
     }
  }
 
  return $content;
}

$array = array(
    'lala' => 'tralala',
    'waai' => 'woei',
    'G-recaptcha-response'=> 'nee'

);
echo compose_mail($array);

Dus je sloopt naar mijn idee meer dan je moet aanpassen?
 
Laatst bewerkt:
Op deze manier is het gelukt!
Super, heel erg bedankt!

PHP:
private function compose_mail($post)
	{
	    
	    
	    $ignore_fields = array('g-recaptcha-response');
	    
		$content = "Form submission: \n\n";
	foreach($post as $name=>$value) {
     if(!in_array($name,$ignore_fields)) { 
		    
			$content .= ucwords($name).":\n";
			$content .= "$value\n\n";
		}
		$this->mailer->Body  = $content;
	}
}
	}
 
Wat was het probleem nou? Want aan mijn code lag het niet.
 
Hoofdletter G-recaptcha-response verandert naar kleine letter g-recaptcha-response en was op het einde van het script een extra bracket vergeten toe te voegen.
Nu werkt het perfect, dankuwel voor deze oplossing!
 
Die bracket was het dan geweest.
 
#10 Recaptchavalidator.php

Regel 30
$_POST['g-recaptcha-response']
Het lijkt erop dat het 'g-recaptcha-response' met kleine letters is.

#10 handler.php

Regel 23
Secret key weggehaald, vervangen door X'en
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan