Kako ugraditi ovu reCAPTCHA-u?


#21

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.


#22

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.


#23

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


#24

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']

#25

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.


#26

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.


#27

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:


#28

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.


#29

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


#30

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.


#31

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.