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

Leave a Reply