Kako ugraditi ovu reCAPTCHA-u?

Ako ne možeš riješiti problem, jednostavno iframaš http://wufoo.eu/
ja se pored njih ne bi nikada više zajebavao sa tako bitnim, a problematičnim stvarima.

Nema. Sve što captcha radi je u liniji 83 JS fajla od 10k linija. A botovi lako mogu da riješe problem iz linije 82 tako da će zaobilaziti prepreku na jednostavan način.

Evo najjednostavniji primjer (nije siguran ali je put kojim treba ići):

index.php

<?php
session_start();
$captchaRange = range(1, 30);

$captchaA = array_rand($captchaRange, 1);
$captchaB = array_rand($captchaRange, 1);
$_SESSION['captcha_sum'] = $captchaA + $captchaB;

// check for errors from session
<form action='contact.php' method='POST'>
...
...
<p>Solve math problem: <?php echo $captchaA . ' + ' . $captchaB; ?></p>
<input type="text" name="captcha_sum">
<button type="submit">Send</button>
</form>

contact.php

<?php
session_start();
if (!$_POST) {
    unset($_SESSION['captcha_sum']);
    header('Location: index.php');
}
if (!$_SESSION['captcha_sum']
    || !$_POST['captcha_sum']
    || (int)$_SESSION['captcha_sum'] !== (int)$_POST['captcha_sum']) {

        unset($_SESSION['captcha_sum']);
        // set $errors['captcha_sum'] that could be used on index.php page
        header('Location: index.php');
}
// proceed with saving/sending data from form
// and don't forget to unset captcha_sum at the end

Opet napominjem da je ovo najjednostavniji oblik ovoga što ti treba i služi samo k’o proof of concept, dosta stvari treba sagledati kako najbolje pristupiti izvedbi. Zbog toga treba koristiti neki PHP FW koji već ima zreo izveden session management.

Bitno je znati da header funkcija samo dodaje naredbu u header koja ce reci browseru da promjeni lokaciju.
header funkcija ne prekida izvrsenje PHP koda.
Stoga se uobicajeno koristi exit ili die zajedno sa header funkcijom

2 Likeova

Opaska na mjestu. Danak radu s FW-cima.
Zato sam i rek’o da se ne koristi as is već da se uzme k’o orijentir.
Isto bolje bi bilo cast-ovati u string nego u int

(string)$_SESSION['captcha_sum'] !== (string)$_POST['captcha_sum']

Najgore rjesenje ikad.
Vidio sam takva rjesenja, kljuc u ruke i onda kad treba netko drugi to odrzavat, nocna mora.
Posebno su takva rjesenja bila izrazena kod wp-a.

E hvala ti puno, s obzirom da nemam puno znanja za ovo što meni treba ne ostaje mi ništa drugo nego koristiti taj kod koji si ti napravio; ali imam dva pitanja

  1. ako je zadana vrijednost od 1 do 30 zašto mi onda nekad izbaci 0+1= ili 14+12= to mi nije jasno, samo želim da mi pišu vrijednosti koje sam zadala sa min i max

  2. nakon što kliknem na dugme submit preusmjeri me na contact.php i piše da je captcha ispravna pa me zanima kako da napravim da ukoliko nije ispravna captcha da pise ispod nje da nije ispravna a da ne redirekta.

Kod koji sam postavio nema veze sa JS postavkama (ako ih koristiš).
contact.php će samo uzeti u obzir šta je setovano u session na index.php strani.
Drugim riječima, ovaj code block što sam postavio gore uopšte ne sagledava neki JS captcha ako koristiš.

Pod 1. - vrijednosti se random generišu na svakom refresh-u index.php strane (ili ne kapiram najbolje šta me pitaš).

Pod 2. sam proizvoljno stavio form action prateći ovaj post

Postavi kod od oba fajla da ne gatam. :slight_smile:

Odradila sam ovako…

U index.php sam postavila ovo

    <?php
    $min_number = 1;
    $max_number = 15;

$random_number1 = mt_rand($min_number, $max_number);
$random_number2 = mt_rand($min_number, $max_number);
?>

`<form action="validateCaptcha.php" method="POST">
		<p>
			<?php
				echo $random_number1 . ' + ' . $random_number2 . ' = ';
			?>
			<input name="captchaResult" type="text" size="2" />

			<input name="firstNumber" type="hidden" value="<?php echo $random_number1; ?>" />
			<input name="secondNumber" type="hidden" value="<?php echo $random_number2; ?>" />
		</p>

		<p>
			<input type="submit" value="submit" />
		</p>
	</form>`

A u validateCaptcha.php ovo

<?php
		$captchaResult = $_POST["captchaResult"];
		$firstNumber = $_POST["firstNumber"];
		$secondNumber = $_POST["secondNumber"];

		$checkTotal = $firstNumber + $secondNumber;

		if ($captchaResult == $checkTotal) {
			echo '<h2 class="green">Captcha OK</h2>';
		} else {
			echo '<h2 class="red">Wrong Captcha. Try Again</h2>';
		}
	?>

Nadam se da je to sada u redu na neki način sam skontala kako ide i šta radi, napokon :slight_smile:

Zanima me šta trebam još napraviti kako bi se zaštitila od spamera, šta da izučavam, i jesam li sada barem sigurna od neke vrste spamova itd.

Ne treba ti posebna stranica za provjeru (osim ako ne bi koristila AJAX u tu svrhu).
Iz tog koda se može naslutiti da se forma može submit-ovati i kad je ispisano Wrong Captcha. Try Again.
Koristi $_SESSION (session_start()) za transport podataka izmedju različitih stranica/fajlova.

Edit: ne podataka iz forme, već sume iz provjere. Tj. Onda kad treba da je poznato porijeklo request-a (vlastita stranica npr.)

Mogu li nekako uraditi provjeru ove captche kao npr.

if (empty($_POST["name"])) {
        $name_error = "Invalid Captcha. Try Again.";
      } else {
        $name = test_input($_POST["name"]);
      }

Pomoću ovoga sam izvukla vrijednost 2 broja slučano generisana

<?php
$captchaResult = $_POST["captchaResult"];
$firstNumber = $_POST["firstNumber"];
$secondNumber = $_POST["secondNumber"];?>

I uz pomoć ovog sumiram te brojeve.

$checkTotal = $firstNumber + $secondNumber;

if ($captchaResult == $checkTotal) {
	// captcha is OK
} else {
	// wrong captcha
}

Zanima me mogu li nekako to konvertovati u nešto slično poput ovoga gore prvog što sam navela kao primjer.

Postoji dosta stvari koje se trebaju uraditi kako bi se obezbijedio minimum sigurnost.
Većina se može početi proučavati ovde i ovde.
Pomozi mi još jednom i objasni strukturu toga što radiš: dali postoji neka

/contact.php

strana sa koje želiš da pošalješ request iz forme (ime, poruka…) na istu tu stranu

/contact.php

?
Ako ne, daj mi strukturu strana/fajlova sa kojih šalješ request zajedno sa stranama koje primaju request (action="/some-other-file.php").
U svakom slučaju, iz prikazanih snoppet-a, trenutno nisam siguran koji fajl šalje a koji prima request.
Pitam iz razloga da bi’ bio u stanju da postavim neki prijedlog.
Isto tako, $_POST nije način kako treba slati ovu vrijednost jer je $_POST array najjednostavnija stvar za zaobići.