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}