Artykuły na każdy temat

[PHP] Matematyczny token/captcha

Dodano 16.01.2014r. o 21:21
Matematyczny token jest jednym ze sposobów weryfikacyjnych wobec zapytań (np. dodawania komentarzy, rejestracji, etc.), które potrzebujemy zweryfikować. Kiedyś ta metoda była bardzo popularna, lecz dziś według mojej opinii została zmarginalizowana przez narzędzia takie jak reCAPTCHA, Akismet czy Sblam! Ponadto dużym minusem dla tego rozwiązania jest fakt, że nie jest problemem dopisanie fragmentu kodu, który będzie odpowiadał za rozwiązywanie matematycznych zagadek przez co skuteczność takiej captchy jest praktycznie zerowa dla wyspecjalizowanych robotów sieciowych.
Kod:
<?php
session_start();

if(!empty($_POST['token']))
{
 if(trim($_POST['token']) == $_SESSION['token'])
 {
  echo 'Zna matematykę to niesamowite!';
 }
 else
 {
  echo 'Dyskalkulia!';
 }
}
else
{
 $operations = array('+''-''×''÷');
 $unknown_position rand(02);
 $random_word rand(01);
 $operation rand(03);
 $values random_equation($operation);
 $_SESSION['token'] = $values[$unknown_position];
 // echo '<pre>'.$values[0].' '.$operations[$operation].' '.$values[1].' = '.$values[2].'</pre>';

 for($h $i 0$h 3; ++$h)
 {
  if($unknown_position == $h)
  {
   $form[$h 2] = '<input name="token">';
  }
  else
  {
   $form[$h 2] = ($i == $random_word mark_my_words($values[$h]) : $values[$h]);
   ++$i;
  }
 }

 $form[1] = $operations[$operation];
 $form[3] = '=';
 // Bo implode()?
 ksort($form);
 echo '<form method="post">'.implode(' '$form).'</form>';
}

function random_equation($operation)
{
 switch($operation)
 {
  // Dodawanie
  case 0:
    $values[2] = rand(2100);
    $values[1] = rand(1, ($values[2] - 1));
    $values[0] = $values[2] - $values[1];
  break;

  // Odejmowanie
  case 1:
   $values[0] = rand(2100);
   $values[1] = rand(1, ($values[0] - 1));
   $values[2] = $values[0] - $values[1];
  break;

  // Mnożenie
  case 2:
   include './factors.php';
   $values[0] = rand(150);
   // Unfair draw
   $values[1] = $factors[$values[0]][array_rand($factors[$values[0]])];
   $values[2] = $values[0] * $values[1];
  break;

  // Dzielenie
  case 3:
   include './dividers.php';
   $values[0] = rand(2100);
   $values[1] = $dividers[$values[0]][array_rand($dividers[$values[0]])];
   $values[2] = $values[0] / $values[1];
  break;
 }

 return $values;
}

// Skrócona wersja funkcji
function mark_my_words($number)
{
 if($number == 100)
 {
  $value 'sto';
 }
 else
 {
  $words[] = array('jeden''dwa''trzy''cztery''pięć''sześć''siedem''osiem''dziewięć');
  $words[] = array('dziesięć''jedenaście''dwanaście''trzynaście''czternaście''piętnaście''szesnaście''siedemnaście''osiemnaście''dziewiętnaście');
  $words[] = array('dziesięć''dwadzieścia''trzydzieści''czterdzieści''pięćdziesiąt''sześćdziesiąt''siedemdziesiąt''osiemdziesiąt''dziewięćdziesiąt');

  if($number && $number 10)
  {
   $value $words[0][$number 1];
  }
  else
  {
   $numbers str_split($number);

   if($number && $number 20)
   {
    $value $words[1][$numbers[1]];
   }
   else
   {
    $value $words[2][$numbers[0] - 1];

    if($numbers[1] !== '0')
    {
     $value .= ' '.$words[0][$numbers[1] - 1];
    }
   }
  }
 }

 return $value;
}
?>
Plik factors.php:
Kod:
<?php
$factors[1] = array(123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100);
$factors[2] = array(1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950);
$factors[3] = array(123456789101112131415161718192021222324252627282930313233);
$factors[4] = array(12345678910111213141516171819202122232425);
$factors[5] = array(1234567891011121314151617181920);
$factors[6] = array(12345678910111213141516);
$factors[7] = array(1234567891011121314);
$factors[8] = array(123456789101112);
$factors[9] = array(1234567891011);
$factors[10] = array(12345678910);
$factors[11] = array(123456789);
$factors[12] = array(12345678);
$factors[13] = array(1234567);
$factors[14] = array(1234567);
$factors[15] = array(123456);
$factors[16] = array(123456);
$factors[17] = array(12345);
$factors[18] = array(12345);
$factors[19] = array(12345);
$factors[20] = array(12345);
$factors[21] = array(1234);
$factors[22] = array(1234);
$factors[23] = array(1234);
$factors[24] = array(1234);
$factors[25] = array(1234);
$factors[26] = array(123);
$factors[27] = array(123);
$factors[28] = array(123);
$factors[29] = array(123);
$factors[30] = array(123);
$factors[31] = array(123);
$factors[32] = array(123);
$factors[33] = array(123);
$factors[34] = array(12);
$factors[35] = array(12);
$factors[36] = array(12);
$factors[37] = array(12);
$factors[38] = array(12);
$factors[39] = array(12);
$factors[40] = array(12);
$factors[41] = array(12);
$factors[42] = array(12);
$factors[43] = array(12);
$factors[44] = array(12);
$factors[45] = array(12);
$factors[46] = array(12);
$factors[47] = array(12);
$factors[48] = array(12);
$factors[49] = array(12);
$factors[50] = array(12);
?>
Plik dividers.php:
Kod:
<?php
$dividers[2] = array(12);
$dividers[3] = array(13);
$dividers[4] = array(124);
$dividers[5] = array(15);
$dividers[6] = array(1236);
$dividers[7] = array(17);
$dividers[8] = array(1248);
$dividers[9] = array(139);
$dividers[10] = array(12510);
$dividers[11] = array(111);
$dividers[12] = array(1234612);
$dividers[13] = array(113);
$dividers[14] = array(12714);
$dividers[15] = array(13515);
$dividers[16] = array(124816);
$dividers[17] = array(117);
$dividers[18] = array(1236918);
$dividers[19] = array(119);
$dividers[20] = array(12451020);
$dividers[21] = array(13721);
$dividers[22] = array(121122);
$dividers[23] = array(123);
$dividers[24] = array(1234681224);
$dividers[25] = array(1525);
$dividers[26] = array(121326);
$dividers[27] = array(13927);
$dividers[28] = array(12471428);
$dividers[29] = array(129);
$dividers[30] = array(12356101530);
$dividers[31] = array(131);
$dividers[32] = array(12481632);
$dividers[33] = array(131133);
$dividers[34] = array(121734);
$dividers[35] = array(15735);
$dividers[36] = array(123469121836);
$dividers[37] = array(137);
$dividers[38] = array(121938);
$dividers[39] = array(131339);
$dividers[40] = array(12458102040);
$dividers[41] = array(141);
$dividers[42] = array(12367142142);
$dividers[43] = array(143);
$dividers[44] = array(124112244);
$dividers[45] = array(13591545);
$dividers[46] = array(122346);
$dividers[47] = array(147);
$dividers[48] = array(12346812162448);
$dividers[49] = array(1749);
$dividers[50] = array(125102550);
$dividers[51] = array(131751);
$dividers[52] = array(124132652);
$dividers[53] = array(153);
$dividers[54] = array(12369182754);
$dividers[55] = array(151155);
$dividers[56] = array(12478142856);
$dividers[57] = array(131957);
$dividers[58] = array(122958);
$dividers[59] = array(159);
$dividers[60] = array(123456101215203060);
$dividers[61] = array(161);
$dividers[62] = array(123162);
$dividers[63] = array(13792163);
$dividers[64] = array(1248163264);
$dividers[65] = array(151365);
$dividers[66] = array(123611223366);
$dividers[67] = array(167);
$dividers[68] = array(124173468);
$dividers[69] = array(132369);
$dividers[70] = array(125710143570);
$dividers[71] = array(171);
$dividers[72] = array(12346891218243672);
$dividers[73] = array(173);
$dividers[74] = array(123774);
$dividers[75] = array(135152575);
$dividers[76] = array(124193876);
$dividers[77] = array(171177);
$dividers[78] = array(123613263978);
$dividers[79] = array(179);
$dividers[80] = array(124581016204080);
$dividers[81] = array(1392781);
$dividers[82] = array(124182);
$dividers[83] = array(183);
$dividers[84] = array(123467121421284284);
$dividers[85] = array(151785);
$dividers[86] = array(124386);
$dividers[87] = array(132987);
$dividers[88] = array(124811224488);
$dividers[89] = array(189);
$dividers[90] = array(123569101518304590);
$dividers[91] = array(171391);
$dividers[92] = array(124234692);
$dividers[93] = array(133193);
$dividers[94] = array(124794);
$dividers[95] = array(151995);
$dividers[96] = array(123468121624324896);
$dividers[97] = array(197);
$dividers[98] = array(127144998);
$dividers[99] = array(139113399);
$dividers[100] = array(124510202550100);
?>
Ciężko mi sobie wyobrazić sytuację, w której wymagane będzie wywołanie tego kodu więcej niż jeden raz wobec jednego zapytania przesyłanego z zewnątrz jednak gdyby miało to miejsce to można pokusić się o optymalizację chociażby instrukcji include wewnątrz funkcji. Dodatkowo można uatrakcyjnić przedstawianie zagadek matematycznych korzystając chociażby z tego. Można również dodać możliwość przetwarzania tego, co zostało przesłane, jeżeli przyszło w formie słownej.

Komentarze

Publikowane komentarze są prywatnymi opiniami użytkowników serwisu. Serwis nie ponosi odpowiedzialności za treść opinii. W trosce o zachowanie poziomu dyskusji wszystkie komentarze podlegają akceptacji przed ich publikacją dlatego proszę cierpliwie czekać aż komentarz zostanie opublikowany.

CapaciousCore

Dodano 26.09.2015r. o 17:36
@Czytelnik owszem żyje jak widać. Po prostu miałem dłuższą przerwę, która była spowodowana sprawami prywatnymi. Więcej informacji tutaj.

Czytelnik

Dodano 13.06.2014r. o 14:26
Ta strona umarła czy jeszcze nie?

CapaciousCore

Dodano 29.01.2014r. o 11:48
@unknown done Wink

unknown

Dodano 25.01.2014r. o 00:13
Poprawcie

"Plik factors.php:"

na

"Plik dividers.php: "

przed drugim kodem pliku php.

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)