Formulier beveiligen tegen spam

  • Onderwerp starter Onderwerp starter miem
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

miem

Gebruiker
Lid geworden
24 feb 2002
Berichten
797
Ik heb een formulier op een website en daar komt spam op binnen. Ik heb gelezen dat je een timestamp kan gebruiken en een hidden input veld dat je een normale naam geeft, maar dat niet ingevuld moet worden in je formulier kunt stoppen en daarop checker of een spamrobot het formulier invult.

Nu ben ik maar een knip en plak phper en ik kom er niet uit hoe ik deze twee beveiliginen zou kunnen inbouwen. Is er iemand die me op weg kan helpen?

Dit is ongeveer het formulier dat ik nu gebruik:

PHP:
<?php 
@mysql_connect($MySQLHost, $MySQLGebruikersnaam, $MySQLWachtwoord) or die("Er kon geen verbinding worden gemaakt met de MySQL database.");
@mysql_select_db($MySQLDatabaseNaam) or die("De database kon niet geselecteerd worden!");
?>

<?php
function getip()
    {
        if(@$_SERVER['HTTP_X_FORWARDED_FOR'])
        {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        elseif(@$_SERVER['HTTP_CLIENT_IP'])
        {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            return $_SERVER['REMOTE_ADDR'];
        }
    }
    
    
function stripslashes_deep($value) {
        $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
        return $value;
        $_POST = array_map('stripslashes_deep', $_POST);
}	
    
$ipadres = getip();


// Einde functie om het e-mail adres te controleren
if($_SERVER['REQUEST_METHOD'] == 'POST') 
{
    
if(empty($_POST['voornaam'])) {
    echo "<p class=\"bold roze\">U heeft geen voornaam ingevuld.</p>";
  }
if(empty($_POST['achternaam'])) {
    echo "<p class=\"bold roze\">U heeft geen achternaam ingevuld.</p>";
  }
if(empty($_POST['email'])) {
    echo("<p class=\"bold roze\">Het e-mail adres is ongeldig!</p>");
  }
  
else {


$datum = date("d.m.Y H:i");
$ipadres = getip();

    $voornaam = stripslashes_deep($_POST['voornaam']);
    $achternaam= stripslashes_deep($_POST['achternaam']);
    $email= stripslashes_deep($_POST['email']);
	
$email = trim($email);

mysql_query("INSERT INTO $DatabaseTabel VALUES ('id',
 '".$voornaam."',
'".$achternaam."',
'".$email."',
'".$ipadres."',
'".$datum."')");


$headers = "From: $voornaam $achternaam <$email>\n"; //afzender 
$headers .= "Bcc: mij@email.nl\r\n";  


mail("$email","Bevestiging inschrijving","Beste $voornaam $achternaam,\n\nU heeft zich aangemeld.\n\nMet vriendelijke groet,\nMijn naam", $headers);

echo "<script language=\"javascript\" type=\"text/javascript\">window.location='inschrijf_bedankt.php'</script>\n";
}

}
  
?>	

<h1>Inschrijf formulier</h1>
<p><span class="roze">*</span> = verplicht veld</p>
<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
<p>Voornaam<span class="roze">*</span>:<br />
<input name="voornaam" type="text" /></p>
<p>Achternaam<span class="roze">*</span>:<br />
<input name="achternaam" type="text" /></p>
<p>E-mail adres<span class="roze">*</span>:<br />
<input type="text" name="email" /></p>
<p><input type="submit" name="actie" value="Verstuur" class="button" /></p>
</form>
 
Laatst bewerkt:
Ik weet niet hoe een timestamp iets zou moeten beveiligen, maar een hidden veld dat niet ingevuld mag worden is vrij simpel; je moet een gewoon 'text' input gebruiken en dat verbergen met CSS.

HTML:
<div style="display: none">
Dit veld niet invullen!
<input type="text" name="botcheck" value="" />
</div>

Vervolgens check je in PHP of dat veld leeg is, en zo niet, ga je niet verder:

PHP:
if ( isset ( $_POST['botcheck'] ) && $_POST['botcheck'] !== '' ) {
  exit;
}
 
Bedankt voor je antwoord. Ik kan een hidden input wel met css onzichtbaar maken, maar waar moet ik die php code plaatsen?
 
Boven aan de pagina zou moeten werken.

Je moet er wel even op letten dat op dit moment er geen output is; als een gebruiker om een of andere reden toch wat in weet te vullen ziet die dus alleen een wit scherm.

Je kunt er een melding achter plakken oid;

PHP:
if ( isset ( $_POST['botcheck'] ) && $_POST['botcheck'] !== '' ) {
  echo 'Hier je bericht.';
  exit;
}
 
Dank je wel, ik heb nu geen tijd, maar ga het morgen uitproberen.
 
Dank je wel, het werkt. Nu maar hopen dat de spambotjes er niet meer door komen. ;)
 
Hoi,

Ik heb deze code met succes beveiligt tegen spam, er komt echt niets meer binnen maar nu wil ik het integreren in een standaard Joomla 2.5 formulier want de captcha is echt vreselijk die ervoor gebruikt wordt.
Nu wil ik dat die php code werkt in mijn Joomla formulier maar ik krijg het niet voor elkaar (ik ben geen phper).

Dit is het verzend formlier:

Code:
<?php

 /**
 * @version		$Id: default_form.php 11845 2009-05-27 23:28:59Z robs
 * @package		Joomla.Site
 * @subpackage	com_contact
 * @copyright	Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidation');
JHtml::_('behavior.tooltip');
 if (isset($this->error)) : ?>
	<div class="contact-error">
		<?php echo $this->error; ?>
	</div>
  <?php endif; ?>   
               



    

<div class="contact-form">
	<form id="contact-form" action="<?php echo JRoute::_('index.php'); ?>" method="post" class="form-validate">
		<fieldset>



			<legend><?php echo JText::_('COM_CONTACT_FORM_LABEL'); ?></legend>
			<div class="opmaak_velden">
            <dl>
				<dt><?php echo $this->form->getLabel('contact_name'); ?></dt>
				<dd><?php echo $this->form->getInput('contact_name'); ?></dd>
				<dt><?php echo $this->form->getLabel('contact_email'); ?></dt>
				<dd><?php echo $this->form->getInput('contact_email'); ?></dd>
                <dt><?php echo $this->form->getLabel('contact_tel'); ?></dt> 
				<dd><?php echo $this->form->getInput('contact_tel'); ?></dd>
				<dt><?php echo $this->form->getLabel('contact_subject'); ?></dt>
				<dd><?php echo $this->form->getInput('contact_subject'); ?></dd>
				<dt><?php echo $this->form->getLabel('contact_message'); ?></dt>
				<dd><?php echo $this->form->getInput('contact_message'); ?></dd>
				<?php 	if ($this->params->get('show_email_copy')){ ?>
						<dt id="verstuur_email"><?php echo $this->form->getLabel('contact_email_copy'); ?></dt>
						<dd id="verstuur_email"><?php echo $this->form->getInput('contact_email_copy'); ?></dd>
				<?php 	} ?>
                <div id="verplicht"><?php echo JText::_('COM_CONTACT_FORM_VERPLICHT'); ?></div>
			<?php //Dynamically load any additional fields from plugins. ?>
			     <?php foreach ($this->form->getFieldsets() as $fieldset): ?>
			          <?php if ($fieldset->name != 'contact'):?>
			               <?php $fields = $this->form->getFieldset($fieldset->name);?>
			               <?php foreach($fields as $field): ?>
			                    <?php if ($field->hidden): ?>
			                         <?php echo $field->input;?>
			                    <?php else:?>
			                         <dt>
			                            <?php echo $field->label; ?>
			                            <?php if (!$field->required && $field->type != "Spacer"): ?>
			                               <span class="optional"><?php echo JText::_('COM_CONTACT_OPTIONAL');?></span>
			                            <?php endif; ?>
			                         </dt>
			                         <dd><?php echo $field->input;?></dd>
			                    <?php endif;?>
			               <?php endforeach;?>
			          <?php endif ?>
			     <?php endforeach;?>
				<dt></dt>
				<dd><button class="button validate" type="submit"><?php echo JText::_('COM_CONTACT_CONTACT_SEND'); ?></button>
					<input type="hidden" name="option" value="com_contact" />
					<input type="hidden" name="task" value="contact.submit" />
					<input type="hidden" name="return" value="<?php echo $this->return_page;?>" />
					<input type="hidden" name="id" value="<?php echo $this->contact->slug; ?>" />
                    
						
                        
					<?php echo JHtml::_( 'form.token' ); ?>
				</dd>
			</dl>
           </div>

           
                              
		</fieldset>
	</form>
</div>

Dit is de controller:
Code:
<?php
/**
 * @package		Joomla.Site
 * @subpackage	Contact
 * @copyright	Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.application.component.controllerform');

class ContactControllerContact extends JControllerForm
{
	public function getModel($name = '', $prefix = '', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, array('ignore_request' => false));
	}

	public function submit()
	{
		// Check for request forgeries.
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Initialise variables.
		$app	= JFactory::getApplication();
		$model	= $this->getModel('contact');
		$params = JComponentHelper::getParams('com_contact');
		$stub	= JRequest::getString('id');
		$id		= (int)$stub;

		// Get the data from POST
		$data = JRequest::getVar('jform', array(), 'post', 'array');

		$contact = $model->getItem($id);


		$params->merge($contact->params);

		// Check for a valid session cookie
		if($params->get('validate_session', 0)) {
			if(JFactory::getSession()->getState() != 'active'){
				JError::raiseWarning(403, JText::_('COM_CONTACT_SESSION_INVALID'));

				// Save the data in the session.
				$app->setUserState('com_contact.contact.data', $data);

				// Redirect back to the contact form.
				$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$stub, false));
				return false;
			}
		}

		// Contact plugins
		JPluginHelper::importPlugin('contact');
		$dispatcher	= JDispatcher::getInstance();

		// Validate the posted data.
		$form = $model->getForm();
		if (!$form) {
			JError::raiseError(500, $model->getError());
			return false;
		}

		$validate = $model->validate($form, $data);

		if ($validate === false) {
			// Get the validation messages.
			$errors	= $model->getErrors();
			// Push up to three validation messages out to the user.
			for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) {
				if ($errors[$i] instanceof Exception) {
					$app->enqueueMessage($errors[$i]->getMessage(), 'warning');
				} else {
					$app->enqueueMessage($errors[$i], 'warning');
				}
			}

			// Save the data in the session.
			$app->setUserState('com_contact.contact.data', $data);

			// Redirect back to the contact form.
			$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$stub, false));
			return false;
		}

		// Validation succeeded, continue with custom handlers
		$results	= $dispatcher->trigger('onValidateContact', array(&$contact, &$data));

		foreach ($results as $result) {
			if ($result instanceof Exception) {
				return false;
			}
		}

		// Passed Validation: Process the contact plugins to integrate with other applications
		$results = $dispatcher->trigger('onSubmitContact', array(&$contact, &$data));

		// Send the email
		$sent = false;
		if (!$params->get('custom_reply')) {
			$sent = $this->_sendEmail($data, $contact);
		}

		// Set the success message if it was a success
		if (!($sent instanceof Exception)) {
			$msg = JText::_('COM_CONTACT_EMAIL_THANKS');
		} else {
			$msg = '' ;
		}

		// Flush the data from the session
		$app->setUserState('com_contact.contact.data', null);

		// Redirect if it is set in the parameters, otherwise redirect back to where we came from, , zelf toegevoegd $tel en contact_tel
		if ($contact->params->get('redirect')) {
			$this->setRedirect($contact->params->get('redirect'), $msg);
		} else {
			$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$stub, false), $msg);
		}

		return true;
	}

	private function _sendEmail($data, $contact)
	{
			$app		= JFactory::getApplication();
			$params 	= JComponentHelper::getParams('com_contact');
			if ($contact->email_to == '' && $contact->user_id != 0) {
				$contact_user = JUser::getInstance($contact->user_id);
				$contact->email_to = $contact_user->get('email');
			}
			$mailfrom	= $app->getCfg('mailfrom');
			$fromname	= $app->getCfg('fromname');
			$sitename	= $app->getCfg('sitename');
			$copytext 	= JText::sprintf('COM_CONTACT_COPYTEXT_OF', $contact->name, $sitename);

			$name		= $data['contact_name'];
			$email		= $data['contact_email'];
			$tel		= $data['contact_tel'];
			$subject	= $data['contact_subject'];
			$body		= $data['contact_message'];

			// Prepare email body, , zelf toegevoegd $tel en taal 'COM_CONTACT_COPYTELEFOON'
			$prefix = JText::sprintf('COM_CONTACT_ENQUIRY_TEXT', JURI::base());
			$body	= $prefix."\n".$name.' <'.$email.'>'.''.'<'.$tel.'>'."\r\n\r\n".stripslashes($body);

			$mail = JFactory::getMailer();
			$mail->addRecipient($contact->email_to);
			$mail->addReplyTo(array($email, $name));
			$mail->setSender(array($mailfrom, $fromname));
			$mail->setSubject($sitename.': '.$subject);
			$mail->setBody($body);
			$sent = $mail->Send();

			//If we are supposed to copy the sender, do so.

			// check whether email copy function activated, zelf toegevoegd $tel
			if ( array_key_exists('contact_email_copy', $data)  ) {
				$copytext		= JText::sprintf('COM_CONTACT_COPYTEXT_OF', $contact->name, $sitename, $tel);
				$copytext		.= "\r\n\r\n".$body;
				$copysubject	= JText::sprintf('COM_CONTACT_COPYSUBJECT_OF', $subject);

				$mail = JFactory::getMailer();
				$mail->addRecipient($email);
				$mail->addReplyTo(array($email, $name));
				$mail->setSender(array($mailfrom, $fromname));
				$mail->setSubject($copysubject);
				$mail->setBody($copytext);
				$sent = $mail->Send();
			}

			return $sent;
	}
}

Er wordt ook een xml bestand gebruikt.

Hopelijk kaniemand mij helpenmet dit. Volgens mij is het simpel maar ik zie het gewoon niet!

Groetjes,
Stephanie
 
Dag Stephanie, het onderwerp waarin je deze vraag stelt is al héél erg oud; ik sluit deze, en vraag je hierbij om een eigen topic te openen :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan