Ochrana proti SPAMu, chyba v Nette / v mojí implementaci?
- Kcko
- Člen | 468
Ahoj,
dosti mě otravují spamy, takže jsem nasadil
- Google recaptchu v2
- vlastní podmínky pro odfiltrování spammerů
Docela to ustalo, ale stejně mi párkrát za den přijde SPAM, který by
projít neměl.
Používám Nette 2.4 a přijde mi, že snad to snad vůbec nechytne
onValidate event.
<?php
protected function createComponentContactForm()
{
$control = $this->contactFormFactory->create();
$control['createForm']->onValidate[] = array($this, 'validateForm');
$control['createForm']->onSuccess[] = $this->contactFormFormSubmitted;
return $control;
}
?>
<?php
public function validateForm($btn)
{
$form = $btn->getForm();
$values = $form->getValues(TRUE);
$response = null;
// check secret key
$reCaptcha = new \ReCaptcha('xxxxxxxx');
//$form = $btn->getForm();
$values = $form->getValues(TRUE);
if ($values['message']) {
if ((stripos($values['message'], 'http') !== false)
|| stripos($values['message'], 'www') !== false) {
$form->addError('Sorry, ale odkazy nejsou povoleny (ochrana proti SPAMU)');
}
elseif (!preg_match("/(ě|š|č|ř|ž|ý|á|í|é|ť|ó|ú|ů|ň|Ě|Š|Č|Ř|Ž|Ý|Á|Í|É|Ť|Ó|Ú|Ů|Ň)/", $values['message'])) {
$form->addError('Zadejte alespoň jedno slovo s diakritikou (ochrana proti SPAMU)');
}
}
if (isset($_POST["g-recaptcha-response"]) && $_POST["g-recaptcha-response"])
{
$response = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$_POST["g-recaptcha-response"]
);
}
if ($response != null && $response->success)
{
}
else
{
$form->addError('Pravděpodobně jste ROBOT nebo jste zapomněl(a) zaškrtnout tlačítko "Nejsem Robot"');
}
$this->redrawControl('ajaxContactForm');
$this->redrawControl('flashMessages');
}
?>
A když si to zkusím vložit, tak se to zachytí viz https://bit.ly/3tojykE
Nenapadá vás něco?
- dakur
- Člen | 493
@Kcko Nejsem si úplně jistý, jak se Nette chová k
$_POST
poli, jestli ho při vyhodnocování formulářů
nepromazává nebo tak něco. Každopádně přistupovat přímo k
$_POST
není úplně dobré, lepší by bylo si ten input definovat
ve formu nebo aspoň vytahovat přes nějaké
$this->getParameter()
či $this->getPost()
nebo
jak se to jmenuje.
Taky je podle mě zbytečné mít další kontroly, když už máš recaptchu, ta to odfiltruje docela spolehlivě.
Jinak bych v tvém případě určitě zkusil to prokrokovat debuggerem, to je na to docela adept. :-)
- Kcko
- Člen | 468
dakur napsal(a):
@Kcko Nejsem si úplně jistý, jak se Nette chová k
$_POST
poli, jestli ho při vyhodnocování formulářů nepromazává nebo tak něco. Každopádně přistupovat přímo k$_POST
není úplně dobré, lepší by bylo si ten input definovat ve formu nebo aspoň vytahovat přes nějaké$this->getParameter()
či$this->getPost()
nebo jak se to jmenuje.Taky je podle mě zbytečné mít další kontroly, když už máš recaptchu, ta to odfiltruje docela spolehlivě.
Jinak bych v tvém případě určitě zkusil to prokrokovat debuggerem, to je na to docela adept. :-)
Ahoj,
díky za reakci.
$_POST pole nepromazává, to by to přece nefungovalo ne :-)
A hlavně ty další podmínky jsou splněné viz jeden ze screenů.
Prostě mi přijde, jako by nějakým způosobem byl skipnutý onValidate (nějakým způsobem spammer přeskočí).
Existuje tento nástroj http://xevil.net/en/ a z toho mi to taky občas chodí ;-) ,
mám všude V2, možná je tedy na čase V3.
Ale pořád nechápu, jak se přes to dostane.