kode
never knows best
Защита от спама без капчи
Вопрос, насколько жизнеспособна такая схема (выложу в коде:
ВНИМАНИЕ ЭТО ЛИШЬ КОНЦЕПТ-ПРИМЕР написанный на коленке, УСПОКОЙТЕ СВОЁ ЗАНУДСТВО
Вопрос, насколько жизнеспособна такая схема (выложу в коде:
ВНИМАНИЕ ЭТО ЛИШЬ КОНЦЕПТ-ПРИМЕР написанный на коленке, УСПОКОЙТЕ СВОЁ ЗАНУДСТВО
PHP:
<?php
class Form_Guard {
private $formMap;
private $seed;
private $key;
public function __construct($seed=null){
$this->formMap = $formMap;
$this->seed = (!$seed)?$this->generateSeed():$this->getSeed($seed);
if(!$this->seed){
throw new Exception("Invalid form data!");
}
}
public function encodeName($field){
return base64_encode(mcrypt_encrypt(MCRYPT_3DES, $this->key, $field, MCRYPT_ECB));
}
public function decodeName($field){
return mcrypt_decrypt(MCRYPT_3DES, $this->key, base64_decode($field),MCRYPT_ECB);
}
public function decodeForm($gpc=null){
if(!$gpc){
$gpc = $_POST;
}
if(isset($gpc['s'])){
unset($gpc['s']);
}
$return = array();
foreach ($gpc as $key=>$value){
$decoded_key = $this->decodeName($key);
$return[$decoded_key] = $value;
}
return $return;
}
public function printSeed(){
echo "<input type=\"hidden\" name=\"s\" value=\"{$this->seed}\"/>";
}
protected function generateSeed($formkey=""){
$seed = md5(microtime(true).$_SERVER['HTTP_HOST']);
$this->key = md5(mt_rand(0,10000)+time());
$this->addSeed($seed,$key,750); //750 - 15 минут
return $seed;
}
protected function addSeed($seed, $key, $timeout){
$db = Registry('db');
$db->insert('form_guard',array('seed'=>$seed,'key'=>$key, 'expires'=>now()+$timeout));
return true;
}
protected function getSeed($seed){
$db = Registry('db');
$result = $db->selectOne('form_guard',array('seed'=>$seed,'expires'=>array('<',now())));
if($result){
$this->key = $result['key'];
}
return (empty($result))?false:$seed;
}
protected function deleteSeed($seed){
$db = Registry('db');
$db->delete('form_guard',array('seed'=>$seed));
return true;
}
}
$smarty->assign('gLoginForm',new Form_Guard($_POST['s']));
?>
<form action="" method="post">
{$gRegisterForm->printSeed()}
<input type="text" name="{$gRegisterForm->encodeName('login')}"/>
<input type="text" name="{$gRegisterForm->encodeName('password')}"/>
</form>