Intereting Posts
Как создать пользователей через API от Zoho CRM Проблема обновления SSH Как установить cookie if is_page ('page')? следует ли использовать add_action ('init') или есть другое действие? Как показать общее количество просмотров по всем сообщениям для автора Как использовать плагин xili-language? сохранить содержимое в wordpress wp_post таблицу базы данных Проверьте, находится ли пользователь в сети? ссылка категории не работает для конкретного слизняка, работает для других Ссылка для 'Показать все категории событий' Как установить путь загрузки после переименования загружаемой папки в Multisite? Поле описания категории как редактор удалить тег <p> Как выбрать содержимое в текстовом режиме textrea в wp_editor? Разрешить пользователям WordPress «следовать» RSS-каналам авторов блога Редактирование плагина WordPress для добавления моей собственной функциональности Как защитить медиа-каталог с помощью .htaccess?

Проблема сеанса в PHP – попытка создания простой CAPTCHA

Я нашел сценарий CAPTCHA онлайн для самостоятельной формы контакта на моем сайте.

В моей папке темы у меня есть файл captcha_code_file.php :

 <?php /* * * this code is based on captcha code by Simon Jarvis * http://www.white-hat-web-design.co.uk/articles/php-captcha.php * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details: * http://www.gnu.org/licenses/gpl.html */ session_start(); //Settings: You can customize the captcha here $image_width = 110; $image_height = 35; $characters_on_image = 6; $font = './monofont.ttf'; //The characters that can be used in the CAPTCHA code. //avoid confusing characters (l 1 and i for example) $possible_letters = '23456789bcdfghjkmnpqrstvwxyz'; $random_dots = 0; $random_lines = 20; $captcha_text_color="0x#B9B098"; $captcha_noice_color = "0x#CEC7BA"; $code = ''; $i = 0; while ($i < $characters_on_image) { $code .= substr($possible_letters, mt_rand(0, strlen($possible_letters)-1), 1); $i++; } $font_size = $image_height * 0.75; $image = @imagecreate($image_width, $image_height); /* setting the background, text and noise colours here */ $background_color = imagecolorallocate($image, 255, 255, 255); $arr_text_color = hexrgb($captcha_text_color); $text_color = imagecolorallocate($image, $arr_text_color['red'], $arr_text_color['green'], $arr_text_color['blue']); $arr_noice_color = hexrgb($captcha_noice_color); $image_noise_color = imagecolorallocate($image, $arr_noice_color['red'], $arr_noice_color['green'], $arr_noice_color['blue']); /* generating the dots randomly in background */ for( $i=0; $i<$random_dots; $i++ ) { imagefilledellipse($image, mt_rand(0,$image_width), mt_rand(0,$image_height), 2, 3, $image_noise_color); } /* generating lines randomly in background of image */ for( $i=0; $i<$random_lines; $i++ ) { imageline($image, mt_rand(0,$image_width), mt_rand(0,$image_height), mt_rand(0,$image_width), mt_rand(0,$image_height), $image_noise_color); } /* create a text box and add 6 letters code in it */ $textbox = imagettfbbox($font_size, 0, $font, $code); $x = ($image_width - $textbox[4])/2; $y = ($image_height - $textbox[5])/2; imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code); /* Show captcha image in the page html page */ header('Content-Type: image/jpeg');// defining the image type to be shown in browser widow imagejpeg($image);//showing the image imagedestroy($image);//destroying the image instance $_SESSION['6_letters_code'] = $code; function hexrgb ($hexstr) { $int = hexdec($hexstr); return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int); } ?> 

Кажется, я не могу сохранить созданную сессию. Что мне нужно сделать, чтобы сделать эту работу? И как получить сеанс в другом файле, например if(empty($_SESSION['6_letters_code']) ?

Окончательное решение с сеансом – это .. не использовать сеанс.

В качестве примера в вашей форме вы можете вывести 3 поля:

  • поле изображения -> изображение captcha
  • текстовое поле ->, чтобы пользователи могли вставлять символы
  • скрытое поле -> содержит решение, но с помощью wp_create_nonce

Таким образом, при wp_verify_nonce формы вы можете сравнить вход пользователя со скрытым полевым вводом с помощью wp_verify_nonce и решить свою проблему без использования сеанса.

Я напишу код в классе, вы можете поместить весь этот код в файл, назовите его 'mycaptcha.php' и сохраните его в папке темы, после чего require_once его из functions.php .

 <?php class MyCaptcha { protected $code = ''; protected $letters = '23456789bcdfghjkmnpqrstvwxyz'; protected $chars_num; protected $tcolor; protected $ncolor; protected $width; protected $height; /** * Allow to configure some options, generate a random code and print the fields */ function __construct( $args = array() ) { $defaults = array( 'chars_num' => 6, 'dots' => 0, 'lines' => 20, 'width' => 110, 'height' => 35, 'tcolor' => 'B9B098', 'ncolor' => 'CEC7BA' ); $args = wp_parse_args( $args, $defaults ); foreach ( $args as $k => $v ) { $this->$k = $v; } $this->setCode(); $this->fields(); } /** * Print the fields */ protected function fields() { echo $this->getHidden(); echo $this->getImg(); echo $this->getText(); } /** * Generate a random code */ protected function setCode() { $i = 0; $len = strlen( $this->letters ) - 1; while ( $i < $this->chars_num ) { $this->code .= substr( $this->letters, mt_rand( 0, $len ), 1 ); $i++; } } /** * Print hidden field */ protected function getHidden() { return wp_nonce_field( $this->code , md5(__CLASS__) . '_n', FALSE, FALSE ); } /** * Print text field */ protected function getText() { $f = '<label>%s<input type="text" name="%s" value="" autocomplete="off" /></label>'; return sprintf( $f, __('Type the captcha:', 'your-textdomain'), md5(__CLASS__) ); } /** * Print captcha image */ protected function getImg() { $f = '<img src="%s" width="%d" height="%d" alt="" />'; $data = array( 'c' => self::encode( $this->code ), 'size' => "{$this->width}x{$this->height}", 'dots' => "{$this->dots}", 'lines' => "{$this->lines}", 'tcolor' => "{$this->tcolor}", 'ncolor' => "{$this->ncolor}" ); $url = add_query_arg( $data, get_template_directory_uri() . '/captcha_img.php' ); return sprintf( $f, $url, $this->width, $this->height ); } /** * Verify the nonce */ static function verify() { $method = filter_input( INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_STRING ); $type = strtoupper( $method ) === 'GET' ? INPUT_GET : INPUT_POST; $nonce = filter_input( $type, md5(__CLASS__) . '_n', FILTER_SANITIZE_STRING ); $code = filter_input( $type, md5(__CLASS__), FILTER_SANITIZE_STRING ); return ! empty($code) && ! empty($nonce) && wp_create_nonce( $code ) === $nonce; } /** * Convert an hexadecimal color to an rgb array color */ static function hexrgb( $hex ) { $int = hexdec( $hex ); return array( "red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int ); } /** * encode the code to avoid put plan code in image url */ private static function encode( $code ) { $iv_size = mcrypt_get_iv_size( MCRYPT_BLOWFISH , MCRYPT_MODE_ECB ); $iv = mcrypt_create_iv( $iv_size, MCRYPT_RAND ); $key = md5( __CLASS__ ); $enc = mcrypt_encrypt( MCRYPT_BLOWFISH , $key, $code, MCRYPT_MODE_ECB, $iv); return urlencode( base64_encode( $enc ) ); } /** * Decode the code */ static function decode( $encoded ) { $code = urldecode( base64_decode( $encoded ) ); $iv_size = mcrypt_get_iv_size( MCRYPT_BLOWFISH , MCRYPT_MODE_ECB ); $iv = mcrypt_create_iv( $iv_size, MCRYPT_RAND ); $key = md5( __CLASS__ ); return mcrypt_decrypt( MCRYPT_BLOWFISH , $key, $code, MCRYPT_MODE_ECB, $iv ); } } 

Убедитесь, что на страте нет пробелов или пустых строк (до <?php ) или в конце файла.

Класс требует наличия другого файла в папке темы captcha_img.php который должен быть помещен в папку темы. Этот файл будет содержать код, который вы опубликовали, только немного измененный:

 <?php // require the class @require_once __DIR__ . '/mycaptcha.php'; // defaults $w = 110; $h = 35; $random_dots = 0; $random_lines = 20; $captcha_text_color = "0x#B9B098"; $captcha_noice_color = "0x#CEC7BA"; /* get code */ $code = filter_input( INPUT_GET, 'c', FILTER_SANITIZE_STRING ); if ( empty( $code ) ) die( '' ); $code = MyCaptcha::decode( $code ); /* get settings */ $sizes = filter_input( INPUT_GET, 'size', FILTER_SANITIZE_STRING ); if ( ! empty( $sizes ) ) { $s = explode( 'x', $sizes ); if ( is_numeric($s[0]) && (int) $s[0] > 0 ) $w = (int) $s[0]; if ( isset($s[1]) && is_numeric($s[1]) && (int) $s[1] > 0 ) $h = (int) $s[1]; } $dots = (int) filter_input( INPUT_GET, 'dots', FILTER_SANITIZE_NUMBER_INT ); if ( $dots > 0 ) $random_dots = $dots; $lines = (int) filter_input( INPUT_GET, 'lines', FILTER_SANITIZE_NUMBER_INT ); if ( $dots > 0 ) $random_lines = $lines; $tcolor = (string) filter_input( INPUT_GET, 'tcolor', FILTER_SANITIZE_STRING ); if ( strlen($tcolor) === 6 ) $captcha_text_color = "0x#{$tcolor}"; $ncolor = (string) filter_input( INPUT_GET, 'ncolor', FILTER_SANITIZE_STRING ); if ( strlen($ncolor) === 6 ) $captcha_noice_color = "0x#{$ncolor}"; /* prepare image */ $font = './monofont.ttf'; $font_size = $h * 0.75; $image = @imagecreate($w, $h); $bg_color = imagecolorallocate($image, 255, 255, 255); $arr_text_color = MyCaptcha::hexrgb($captcha_text_color); $text_color = imagecolorallocate( $image, $arr_text_color['red'], $arr_text_color['green'], $arr_text_color['blue'] ); $arr_noice_color = MyCaptcha::hexrgb($captcha_noice_color); $image_noise_color = imagecolorallocate( $image, $arr_noice_color['red'], $arr_noice_color['green'], $arr_noice_color['blue'] ); /* generating dots randomly in background of image */ for( $i=0; $i < $random_dots; $i++ ) { imagefilledellipse( $image, mt_rand(0, $w), mt_rand(0, $h), 2, 3, $image_noise_color ); } /* generating lines randomly in background of image */ for( $i=0; $i < $random_lines; $i++ ) { imageline( $image, mt_rand(0, $w), mt_rand(0, $h), mt_rand(0, $w), mt_rand(0, $h), $image_noise_color ); } /* create a text box and add 6 letters code in it */ $textbox = imagettfbbox( $font_size, 0, $font, $code ); $x = ( $w - $textbox[4] ) / 2; $y = ( $h - $textbox[5] ) / 2; imagettftext( $image, $font_size, 0, $x, $y, $text_color, $font , $code); /* output captcha image */ header('Content-Type: image/jpeg'); imagejpeg($image); imagedestroy($image); 

Опять же, убедитесь, что в начале нет пробелов или пустых строк (до <?php ) или в конце файла.

Как использовать

Поля для печати

В формах просто использовать <?php new MyCaptcha; ?> <?php new MyCaptcha; ?> для вывода трех полей с использованием настроек по умолчанию.

Вы можете настроить количество букв, ширину и высоту изображения, цвета, количество строк и точек, передающих массив аргументов конструктору, например

  <div class="my_captcha"> <?php $args = array( 'chars_num'=> '8', // number of characters 'tcolor' => 'FFFFFF', // text color 'ncolor' => '999999', // noise color 'dots' => 50, // number of dots 'lines'=> 40 // number of lines, 'width'=>'220' // number of width, 'height'=>'70' // number of height ); new MyCaptcha( $args ); ?> </div> 

проверить

В файле или в функции, обрабатывающей форму, вы можете просто проверить:

 $is_captcha_corrent = MyCaptcha::verify(); 

Больше ничего. Конечно, если вы используете внешний файл для обработки формы, этот файл должен загружать WordPress.

Оба файла доступны в Gist здесь .