Rychlý antispam filtr pro CakePHP

Tento antispamový filtr je založen na dvou předpokladech. Zaprvé, že roboti si s javascriptem stále neporadí. Zadruhé, že jsou nenažraní a chtějí se pochlubit svými všetečnými odkazy, kde to jen jde. Tento zlepšovák obyčejné uživatele nijak nepoškodí a funguje i bez javascriptu a CSS.

Tvorba formuláře

Nejdůležitější jsou inputy antispam a blank.


	<?php
		echo $this->Form->create('Contact');
		echo $this->Form->input('name');
		echo $this->Form->input('email');
		echo $this->Form->input('text', array('escape' => false));
		?> <div class="antispamInput"> <?php
			echo $this->Form->input('antispam', array('label' => __('Please confirm your humanity by writing "pizza".'), 'div' => false));
		?> </div><div class="blankInput"> <?php
			echo $this->Form->input('blank', array('label' => __('Leave this field blank.'), 'div' => false));
		?> </div> <?php
		echo $this->Form->end(__('Send'));
	?>

Do políčka antispam by měl uživatel, jak již jeho popisek naznačuje, vepsat slovo pizza, zatímco blank by měl uživatel nechat prázdné.

Validace na straně serveru

Předpokládá se, že pro daný formulář existuje také model. Pokud formulář data neukládá, není špatné mu přesto model vytvořit (a jednoduše tak ověřovat tvar emailu a obdobná data) a nastavit mu public $useTable = false;.


public $validate = array(
	'antispam' => array(
		'required' => true,
		'rule' => '/^pizza$/i',
		'message' => 'You are robot, aren\'t you! Try writing "pizza" here or just contact me directly via mail.',
	),
	'blank' => array(
		'required' => true,
		'rule' => '/^$/i',
		'message' => 'You are robot, aren\'t you! Try not filling this field or just contact me directly via mail.',
	),
);

Neobtěžujme uživatele

Chceme přeci odlákat spammery a jiné prodejce erotických pomůcek, ne potenciální zákazníky! Proto přichází ke slovu javascript, který stačí přihodit do HTML hned za formulář:


document.querySelector('.antispamInput').style.display = 'none';
document.querySelector('#ContactAntispam').value = 'pizza';

Ten skryje políčko, které se má zaplnit pizzou a zároveň ho za uživatele ochotně vyplní

Druhé políčko, které má zůstat prázdné, není potřeba nějak složitě řešit. Prostě ho jen schováme pomocí CSS. :) .blankInput{display:none}

5.5.2013 Ondřej Henek