CodeigniterのCAPTCHAヘルパー拡張機能



最近、空き時間と何か役に立つことをしたいという願望から、Codeigniterで悲惨なキャプチャヘルパーの拡張機能を書くことにしました。



このアシスタントを使用する必要があった場合は、生成されたすべてのキャプチャ画像を保存して、ページにさらに出力することをご存じでしょう。 これは、作成された各ファイルとガベージコレクションを追跡し使用済みまたはステッチ済みを削除するという形で、不必要なジェスチャーにつながります。





ファイルはプロジェクトフォルダに蓄積されます。



これに注意を払わずに標準的なソリューションを使用すると、テキストのランダムな行の表示に問題のある学校があることに気付くことがあります。 その結果、ユーザーの神経が損なわれます。





8個のランダムな文字を生成しますが、図では6個だけが表示され、残りは右の境界線を超えて「なくなっています」。



また、出力時の画像のサイズを除き、外観の調整は一切ありません。

したがって、これらの欠点を考慮して、タスクを作成するように設定されました。



タスク:

  1. ハードドライブへのファイルの記録を削除し、画像を直接ブラウザにストリーミングします。
  2. 文字が画像の境界を超える場合のエラーを修正します。
  3. ランダム文字列の長さを指定する機能を追加します。
  4. フレームありとフレームなしの画像を作成する機能を追加します。
  5. 画像にランダムな配色の生成を追加します。




実装:

MY_captcha_helper.php
function create_captcha_stream($data = '') { $defaults = array('word' => '', 'img_width' => 150, 'img_height' => 30, 'font_path' => '', 'random_str_length' => '5', 'border' => TRUE); foreach ($defaults as $key => $val) { if ( ! is_array($data)) { if ( ! isset($$key) OR $$key == '') { $$key = $val; } } else { $$key = ( ! isset($data[$key])) ? $val : $data[$key]; } } if ( ! extension_loaded('gd')) { return FALSE; } // ----------------------------------- // Do we have a "word" yet? // ----------------------------------- if ($word == '') { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $str = ''; for ($i = 0; $i < $random_str_length; $i++) { $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1); } $word = $str; } // ----------------------------------- // Determine angle and position // ----------------------------------- $length = strlen($word); $angle = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0; $x_axis = rand(6, (360/$length)-16); $y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height); // ----------------------------------- // Create image // ----------------------------------- if (function_exists('imagecreatetruecolor')) { $im = imagecreatetruecolor($img_width, $img_height); } else { $im = imagecreate($img_width, $img_height); } // ----------------------------------- // Assign colors // ----------------------------------- /* RAND */ $red = rand(50, 100); $green = rand(50, 100); $blue = rand(50, 100); $bg_color = imagecolorallocate($im, 255, 255, 255); $border_color = imagecolorallocate($im, $red, $green, $blue); $text_color = imagecolorallocate($im, $red+30, $green+30, $blue+30); $grid_color = imagecolorallocate($im, $red+60, $green+60, $blue+60); $shadow_color = imagecolorallocate($im, 255, 240, 240); // ----------------------------------- // Create the rectangle // ----------------------------------- ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color); // ----------------------------------- // Create the spiral pattern // ----------------------------------- $theta = 1; $thetac = 7; $radius = 16; $circles = 20; $points = 32; for ($i = 0; $i < ($circles * $points) - 1; $i++) { $theta = $theta + $thetac; $rad = $radius * ($i / $points ); $x = ($rad * cos($theta)) + $x_axis; $y = ($rad * sin($theta)) + $y_axis; $theta = $theta + $thetac; $rad1 = $radius * (($i + 1) / $points); $x1 = ($rad1 * cos($theta)) + $x_axis; $y1 = ($rad1 * sin($theta )) + $y_axis; imageline($im, $x, $y, $x1, $y1, $grid_color); $theta = $theta - $thetac; } // ----------------------------------- // Write the text // ----------------------------------- $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; if ($use_font == FALSE) { $font_size = 7; $x = rand(1, $img_width-(($length*$font_size)*2)); $y = 0; } else { $font_size = 12; $x = rand(1, $img_width-($length*$font_size)); $y = $font_size+2; } for ($i = 0; $i < strlen($word); $i++) { if ($use_font == FALSE) { $y = rand(1 , $img_height-($font_size*3)); imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color); $x += ($font_size*2); } else { $y = rand($font_size , $img_height-($font_size/3)); imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1)); $x += $font_size; } } // ----------------------------------- // Create the border // ----------------------------------- if ($border == TRUE) { imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color); } // ----------------------------------- // Generate the image // ----------------------------------- header("Content-type: image/jpeg"); ImageJPEG($im); ImageDestroy($im); return $word; }
      
      







キャプチャを作成する元の機能は、基礎として採用されました。



使用例:

アシスタント拡張機能を接続する方法は、 Codeigniterのドキュメントで簡単に見つけることができるため、ここではコピーアンドペーストを行いません。



入力するコントローラーを作成します。

 $this->load->helper('captcha'); $prefs = array( //  ,     'word' => 'text', //  'img_width' => 100, //   (int) 'img_height' => 30, //   (int) 'random_str_length' => 5, //    (int) 'border' => FALSE, //   (bool) 'font_path' => 'path_to_.ttf' //     ); $word = create_captcha_stream($prefs); $this->session->set_flashdata('word', $word);
      
      







関数create_captcha_stream



生成された文字列を返し、画像をブラウザにストリームで表示します。

その後、ユーザーが入力したデータと比較するために、セッションに行を追加します。



したがって、ユーザーに画像を表示するには、キャプチャを表示するフォームのテンプレートにタグを追加します。

<img src=” yoursite.com/ ” />









生成されたキャプチャの例



これで、キャプチャがセッションに出力されると、ブラウザーの画像に表示される行が書き込まれます。



入力されたデータの検証:

 $captcha = trim($this->input->post('captcha')); //      $word = $this->session->flashdata('word'); //     if ($word == $captcha) { echo "Login sucsessfull"; } else { echo "Bad login"; }
      
      







strtolower()



小文字変換関数を使用して、大文字と小文字の区別を削除できます。



この記事は標準的なキャプチャの改善例であり、ここでは新しい超自然的なことは説明しません。



All Articles