code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:ftxCaptcha -> ftxCaptcha.php
md5:0d2d62bf1ba4e12449d695f699042f04
sha1:07d78839da363bfd67045f5cfc114291f8e85be4
Download-Link:Download
  1. <?php
  2. class ftxCaptcha {
  3.         private $secret = 'ChangeThis!'; #Note: Change this!
  4.         private $Question = 'Question';
  5.         private $HashedAnswer = 'HashedAnswer';
  6.         private $lang = 'en';
  7.  
  8.         private $ops = [ '+', '-', '*' ];
  9.    
  10.         # Configure your languages:
  11.  
  12.         private $opsWords = [
  13.                 'en' => [ '+' => 'plus', '-' => 'minus'     , '*' => 'times'    ],
  14.                 'de' => [ '+' => 'plus', '-' => 'minus'     , '*' => 'mal'      ],
  15.                 'fr' => [ '+' => 'plus', '-' => 'temps'     , '*' => 'moins'    ],
  16.                 'gr' => [ '+' => 'συν' , '-' => 'μειωμένους', '*' => 'chrónous' ]
  17.         ];
  18.    
  19.         private $numberWords = [
  20.                 'en' => [ 'one' , 'two' , 'three', 'for'    , 'fife' , 'six'  , 'seven' , 'eight', 'nine' , 'ten'  ],
  21.                 'de' => [ 'eins', 'zwei', 'drei' , 'vier'   , 'fünf' , 'sechs', 'sieben', 'acht' , 'neun' , 'zehn' ],
  22.                 'fr' => [ 'un'  , 'deux', 'trois', 'quatre' , 'cinq' , 'six'  , 'sept'  , 'huit' , 'neuf' , 'dix'  ],
  23.                 'gr' => [ 'ένα' , 'δύο' , 'τρία' , 'τέσσερα', 'πέντε', 'έξι'  , 'επτά'  , 'οκτώ' , 'εννέα', 'δέκα' ]
  24.         ];
  25.  
  26.         public $buttonMessage = [
  27.                 'en' => 'solve',
  28.                 'de' => 'lösen',
  29.                 'fr' => 'desserrer',
  30.                 'gr' => 'λύσει'
  31.         ];
  32.  
  33.         function __construct( $lang = 'en' ) {
  34.  
  35.                 if ( $this -> secret == 'ChangeThis!' ) {
  36.                         trigger_error( 'You have to change the secret in „' . __FILE__ . '“ line 3.', E_USER_ERROR );
  37.                 }
  38.  
  39.                 $lang = trim( $lang );
  40.                 $this -> setLanguage( $lang );
  41.         }
  42.  
  43.         function setLanguage( $lang ) {
  44.  
  45.                 if (
  46.                         ! isset( $this -> opsWords[ $lang ] )
  47.                         or ! isset( $this -> numberWords[ $lang ] )
  48.                         or ! isset( $this -> buttonMessage[ $lang ] )
  49.                 ) {
  50.                         trigger_error( 'The language „' . $lang . '“ is not enabled. In this case i using „en“. Show the file „' . __FILE__ . '“ and edit lines 12:34', E_USER_NOTICE );
  51.                         $lang = 'en';
  52.                 }
  53.                 $this -> lang = $lang;
  54.                 $z1  = random_int( 0, count( $this->numberWords[ $lang ] ) - 1 );
  55.                 $z2  = random_int( 0, count( $this->numberWords[ $lang ] ) - 1 );
  56.                 $op  = random_int( 0, 2 );
  57.                 switch ( $this -> ops[ $op ] ) {
  58.                          case '+':
  59.                                 $erg = $z1 + $z2 + 2; break;
  60.                          case '-':
  61.                                 $erg = $z1 - $z2; break;
  62.                          case '*':
  63.                                 $erg = ( $z1 + 1 ) * ( $z2 + 1 ); break;
  64.                 }
  65.                 $this->HashedAnswer = $this -> mkHash( $erg );
  66.                 $this-> Question = $this -> numberWords[ $lang ] [ $z1 ]
  67.                                                   . ' '
  68.                                                   . $this -> opsWords[ $lang ][ $this -> ops[ $op ] ]
  69.                                                   . ' '
  70.                                                   . $this -> numberWords[ $lang ][ $z2 ];
  71.         }
  72.    
  73.         function mkHash( $s ) {
  74.                 return md5( ( $this -> secret . trim( $s ) ) );
  75.         }
  76.    
  77.         function getQuestion() {
  78.                 return $this -> Question;
  79.         }
  80.    
  81.         function getHashedAnswer() {
  82.                 return $this -> HashedAnswer;
  83.         }      
  84.    
  85.         function validateAnswer( $answer, $hash )  {
  86.                 $sHashed = $this -> mkHash( $answer );
  87.                 $hash    = trim ( $hash );
  88.                 return $sHashed ==  $hash;
  89.         }
  90.    
  91.         function getForm( $method = false, $target = false ) {
  92.                
  93.                 $r = '';
  94.  
  95.                 if ( $target ) {
  96.                         $target = " target='${target}'";
  97.                 }
  98.  
  99.                 if ( $method and ( strtoupper( $method ) == 'POST' or strtoupper( $method ) == 'GET' ) ) {
  100.                         $r .= "<form class='ftxCaptcha' method='${method}'${target}>" . PHP_EOL;
  101.                 }
  102.  
  103.                 $r .=  "<input type='hidden' name='ftxHash' value='" . $this->getHashedAnswer() . "'>";
  104.                 $r .=  "<label class='ftxCaptcha'>" . $this -> getQuestion() . " ist<input type='text' class='ftxCaptcha' required pattern='[0-9-]{1,4}' title='-999 … 9999' name='ftxAnswer' /></label>";
  105.  
  106.                 if ( $method and ( strtoupper( $method ) == 'POST' or strtoupper( $method ) == 'GET' ) ) {
  107.                         $r .=  "<button class='ftxCaptcha'>" . $this -> buttonMessage[ $this -> lang ] . "</button>" . PHP_EOL;
  108.                         $r .=  "</form>" . PHP_EOL;
  109.                 }
  110.                 return $r;
  111.         }
  112.        
  113.         function printForm( $method = false, $target = false ) {
  114.                 echo $this -> getForm( $method, $target );
  115.         }
  116. }
  117.  
  118. /*
  119. ** Usage and examples:**
  120. */
  121.  
  122. /*
  123.            
  124. require_once 'ftxCaptcha.php';
  125.  
  126. $captcha = new ftxCaptcha();
  127. $captcha -> getForm( 'POST' );
  128. echo PHP_EOL;
  129.  
  130. $captcha = new ftxCaptcha( 'de' );
  131. $captcha -> getForm(false);
  132. echo PHP_EOL;
  133.  
  134. $captcha -> setLanguage ( 'fr' );
  135. $captcha -> getForm(false);
  136. echo PHP_EOL;
  137.  
  138. $captcha -> setLanguage ( 'en' );
  139. $captcha -> getForm( false );
  140. echo PHP_EOL;
  141. #*/
  142.  
  143. /*
  144. ** Usage ofe the returns
  145. *
  146. * require_once 'ftxCaptcha.php';
  147. * $captcha = new ftxCaptcha();
  148. * if ( $captcha -> validateAnswer( $_POST['ftxAnswer'], $_POST['hash'] ) ) { ... }
  149. */
  150.