code.fastix.org

Dateiansicht:

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