Jednostavna matematička SPAM i bot zaštita

stop spamKao rezultat testiranja i podešavanja Mercurial SCM, nastala je jedna jednostavna PHP klasa za zaštitu formulara od botovskog spamovanja. Vrlo jednostavna, svega 26 linija koda i svega pet jednostavnih metoda.

Ovakav sistem zaštite ste sigurno sretali širom Interneta i zasniva se na izračunavanju sume dva i više sabiraka. Npr. Izračunajte 2 plus 5.

<?php
class SpamProtection {
private $numbers = array();
private $salt = '!5p4mpr073c7%#';

public function getRandNumber($min = 1, $max = 5) {
return $this->numbers[] = mt_rand($min, $max);
}

public function getHash() {
return $this->makeHash($this->sum());
}

public function check($result, $hash) {
return !($this->makeHash($result) == $hash);
}

private function sum() {
return array_sum($this->numbers);
}

private function makeHash($result) {
return md5($this->salt . $result);
}
}
?>

Ideja je da korisnik upiše rezultat dva i više sabiraka i da se taj rezultat pošalje preko formulara, zajedno sa jednosmerno enkriptovanim pravim rezultatom. Na strani procesiranja formulara, rezultat koji je upisao korisnik se ponovo enkriptuje i upoređuje sa hash-om sa formulara. Hash je saltovan, zbog veće sigurnosti.

Evo i koda, na strani formulara.

// form.php
include "path/to/SpamProtection.php"
$spam = new SpamProtection();

echo 'Koliko je '. $spam->getRandNumber() .' + '. $spam->getRandNumber() .'<br />';
echo '<input type="text" name="spam_result" />';
echo '<input type="hidden" value="'. $spam->getHash() .'" name="spam_hash" />';

I na strani procesiranja formulara

// submit.php
include "path/to/SpamProtection.php"
$spam = new SpamProtection();

if($spam->check($_POST['spam_result'], $_POST['spam_hash'])) {
die("Spam protection!");
}

Kao što vidite iz primera, vrlo je jednostavna i lako se koristi, a što je najvažnije, vrlo je efikasna. Međutim, nije ni savršena, postoji dosta nedostataka, ali imati bilo kakvu zaštitu formulara je svakako bolje nego nemati je uopšte.

P.S. Ukoliko iskoristite ovu klasu u nekom svom projektu, ostavite komentar, biće mi drago 🙂

5 Comments

  1. Khm… odlicna klasa ali se ne bi ja igrao sa dva $_POST znaka… Bolje da cuvas rezultat u $_SESSION promenljivoj, nego u $_POST jer moze lako da se hakuje.

  2. U kom smislu može da se hakuje? Jel možeš da opišeš kako bi lako hakovao ovo?

  3. Pa ovako:
    kad pokrenes php kod za ispis svih komentara, dobijes i formu za unos jednog komentara. Ok, ta stranica je HTML, sto znaci da moze da se snimi na hard disk. Nakon snimanja dobijas HTML kod koji ima FORM tag i u njemu dva hidden polja.

    tebe nista ne sprecava da otvoris taj HTML kod i ubacis dve iste vrednosti u ta dva hiddent polja. Kad pritisnes submit, on salje podatke iz tih polja i provera ce uvek biti TURE. I onda neko remote-li moze da se spamuje. Zato u session promenljivoj drzis rezultat matematicke operacije i nikako ne moze da dodje do te promenljiva i do te informacije.

  4. Grešiš. Ukoliko bi u oba polja upisao istu vrednost, provera bi bila FALSE, zato što u jedno polje mora da se upiše broj, a u drugo saltovani md5 hash tog polja. Obrati pažnju na check metodu…

  5. Fina skriptica,pokusacu je iskoristiti u svom projektu