Jednostavna matematička SPAM i bot zaštita

Posted on April 19, 2010

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

» Filed Under PHP

Comments

5 Responses to “Jednostavna matematička SPAM i bot zaštita”

  1. Dobrica on April 16th, 2011 09:24

    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. Aleksandar Babić on April 16th, 2011 09:31

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

  3. Dobrica on April 20th, 2011 11:04

    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. Aleksandar Babić on April 20th, 2011 13:32

    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. Dragan on February 4th, 2012 15:12

    Fina skriptica,pokusacu je iskoristiti u svom projektu

Leave a Reply




Koliko je 11 i 8 ?
Please leave these two fields as-is:
VAŽNO! Morate rešiti zadatak :)

Uskoro se ovara novi sajt... Pronađite restoran u Beogradu na sajtu Restorani Beograd. Pogledajte restoranske menije, slike restorana, komentare posetilaca... Restoranski vodič kroz restorane u Beogradu. A ako želite dobar provod, Klubovi Beograd rezervišu mesto za vas u nekom od Beogradskih klubova.