Ochrana proti SPAMu, chyba v Nette / v mojí implementaci?

Kcko
Člen | 468
+
0
-

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
+
0
-

@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. :-)

MajklNajt
Člen | 498
+
+1
-

@dakur recaptcha nie je až taká dokonalá, prejdu mi ňou 2–3 spamy týždenne a to nie je nejako extra navštevovaný web :)

Kcko
Člen | 468
+
0
-

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.