News:

Want to get involved in developing SMF, then why not lend a hand on our github!

Main Menu

Визуальная проверка при регистрации.

Started by viacheslav, December 06, 2006, 08:47:50 AM

Previous topic - Next topic

viacheslav

День добрый.
Вот сегодня сменил версию форума с RC3 на 1.1 Final. И вот какой баг. Перестал работать аудиопроизношение букв проверки, произносилось только первые 3 буквы, остальные две нет. Сравнил со старым форумом, в итоге в новом в Subs-Sound.php отремировал внизу строчку:  header('Content-Length: ' . $file_size); - и все заработало.

Вопрос 1. Что это было, баг в финальной версии? Или это только мне повезло?

Вопрос 2.1: Эти буква проверки визуализации процитать не может ни один нормалный человек! Ни у меня , ни у кого-нибудь в офисе (без использования аудиопрослушивания) не получилось. Подскажите, мож есть умельцы, чтоб подкрутить такого без установки модов?

Вопрос 2.2: Короче тот же вопрос о нечетабельных буквах, но с другой стороны. Тут угораздило поставить форум на некий виндовый сервак, на котором уже стоял Апач. Тоже версию 1.1 Final. И представляете, там эти буковки визуальной проверки экзотические конечно, но вполне читабельные!! Начал разбираться, и вот что понял. Все зависит от значения некого переменного use_graphic_library. При одном значении картинка будет генериться невменяемая, а при другом он генериться, собирая gif-картинки нужных букв из папки fonts\... Вопрос, кто знает, чтобы подкрутить (задать некое фиксированное значение этому use_graphic_library или как-то иначе), чтоб окно визуальной проверки генерировалось именно вторым способом.

Кстати, частично вот сейчас решил проблему нечетабельности. В Register.php сменил диапазон отображаемых бкув на цифры (а заодно и в PersonalMessage.php). Понять цифры то значительно проще, чем буквы. Но вопросы остаются.

†MavN†

можно посмотреть Subs-Graphics.php там прописываются параметры генерации картинок в частно фон цвет и все остальное правда поскольку я не программер влезть на столько глубоко просто не могу :(

viacheslav

Да, я тоже не программер. Тоже понял, что это там, но вот понять ентот текст...
Попробовал просто убрать некие строки - откровенная ерунда получается.
В общем пока остановился на цифрах. Записал к ним (цифрам) звуковые файлы. А без визуальной проверки спамеры так и лезут. С цифрами вроде пока боты не срабатывают.
Хотя конечно я бы с большим удовольствием оставил буквы (но уж больно существующие не читабельны).

Если кто нашел способ изменить этот Subs-Graphics.php так, чтоб буквы были бы более читабельны человеком (но в разумных пределах, чтоб бот не смог бы их так запросто прочитать) - был бы рад этот способ узнать.

†MavN†

вообще бот графику не читает :) ;) проверка идет на другом уровне

viacheslav

Quote from: †MavN† on December 08, 2006, 02:35:11 AM
вообще бот графику не читает :) ;) проверка идет на другом уровне
Тогда я не совсем понимаю нужность этих хитронаписанных букв. Можете растолковать чайнику, если возможно конечно.

RXL

viacheslav, посмотри тут пару статей о методах распознавания некоторых простых реализаций CAPTCHA: http://www.captcha.ru/articles/
Позновательно.
От туда и вывод: если тебе сложно прочесть, то надежость компьютерного распознования будет очень низкая - значит защита достаочно высокая.

vityusha

А у меня такой вопрос - после перехода с 1.1RC3 на 1.1Final не могу установить Advanced Visual Verification 1.1 mod (версия от 10 декабря). После нажатия на "установить" выдается информационное окно пакета, где есть "Установочные действия пакета". Там напротив "Изменение файла"  стоит "Ошибка", или в английском варианте "Execute modification" - "Modification parse error". После этого, если продолжить установку, то мод делает вид что установился, но самом деле нигде не появляется. В SMF 1.1RC3 и мод версии 1.0 вставали и работали просто на ура.

Облазил все форумы связанные с SMF (или как мне кажется все) но как решить эту проблему так и не нашел. Почему-то у всех все работает.

Помогите, пожалуйста, кто может.

†MavN†

а сам мод официально поддерживает 1.1 финал

vityusha

В том-то и дело, официально поддерживает 1.1. В Топике про этот мод только спасибы стоят, значит ставится у людей. Хотя нашелся один человек с проблемой как у меня.

Mithril

Сегодня его ставил. Без особенных проблем. А у Вас форум реквизиты к ftp не забыл, случаем? Может, ему прав на изменения не достаёт, он и не меняет..

Roman Jankovski

#10
Изменил функцию в Subs-Graphics.php, теперь капча выглядит куда более цивильно. Форум юзаю второй день, моды писать не умею, потому выкладываю так: :)

// Create the image for the visual verification code.
function showCodeImage($code)
{
  global $settings;

  // Is this GD2? Needed for pixel size.
  $testGD = get_extension_funcs('gd');
  $gd2 = in_array('imagecreatetruecolor', $testGD) && function_exists('imagecreatetruecolor');
  unset($testGD);

  // The amount of pixels inbetween characters.
  $character_spacing = 1;

  // The color of the characters shown (red, green, blue).
  $foreground_color = array(64, 101, 136);
  $background_color = array(236, 237, 243);

  // Has the theme author requested a custom color?
  if (isset($settings['verification_foreground'], $settings['verification_background']))
  {
    $foreground_color = $settings['verification_foreground'];
    $background_color = $settings['verification_background'];
  }

  if (!is_dir($settings['default_theme_dir'] . '/fonts'))
    return false;

  // Get a list of the available fonts.
  $font_dir = dir($settings['default_theme_dir'] . '/fonts');
  $font_list = array();
  $ttfont_list = array();
  while ($entry = $font_dir->read())
  {
    if (preg_match('~^(.+)\.gdf$~', $entry, $matches) === 1)
      $font_list[] = $entry;
    elseif (preg_match('~^(.+)\.ttf$~', $entry, $matches) === 1)
      $ttfont_list[] = $entry;
  }

  if (empty($font_list))
    return false;

  // Create a list of characters to be shown.
  $characters = array();
  $loaded_fonts = array();
  for ($i = 0; $i < strlen($code); $i++)
  {
    $characters[$i] = array(
      'id' => $code{$i},
      'font' => array_rand($font_list),
    );

    $loaded_fonts[$characters[$i]['font']] = null;
  }

  // Load all fonts and determine the maximum font height.
  foreach ($loaded_fonts as $font_index => $dummy)
    $loaded_fonts[$font_index] = imageloadfont($settings['default_theme_dir'] . '/fonts/' . $font_list[$font_index]);

  // Determine the dimensions of each character.
  $total_width = $character_spacing * strlen($code) + 10;
  $max_height = 0;
  foreach ($characters as $char_index => $character)
  {
    $characters[$char_index]['width'] = imagefontwidth($loaded_fonts[$character['font']]);
    $characters[$char_index]['height'] = imagefontheight($loaded_fonts[$character['font']]);

    $max_height = max($characters[$char_index]['height'], $max_height);
    $total_width += $characters[$char_index]['width'];
  }

  // Create an image.
  $code_image = imagecreate($total_width, $max_height);

  // Draw the background.
  $bg_color = imagecolorallocate($code_image, $background_color[0], $background_color[1], $background_color[2]);
  imagefilledrectangle($code_image, 0, 0, $total_width - 1, $max_height - 1, $bg_color);

  // Randomize the foreground color a little.
  for ($i = 0; $i < 3; $i++)
    $foreground_color[$i] = rand(max($foreground_color[$i] - 3, 0), min($foreground_color[$i] + 3, 255));
  $fg_color = imagecolorallocate($code_image, $foreground_color[0], $foreground_color[1], $foreground_color[2]);

  // Color for the dots.
  for ($i = 0; $i < 3; $i++)
    $dotbgcolor[$i] = $background_color[$i] < $foreground_color[$i] ? rand(0, max($foreground_color[$i] - 10, 0)) : rand(min($foreground_color[$i] + 10, 255), 255);
  $randomness_color = imagecolorallocate($code_image, $dotbgcolor[0], $dotbgcolor[1], $dotbgcolor[2]);

  // Fill in the characters.
  $cur_x = 0;
  foreach ($characters as $char_index => $character)
  {
    // Can we use true type fonts?
    $can_do_ttf = function_exists('imagettftext');
    if (!empty($can_do_ttf))
    {
      // GD2 handles font size differently.
      $font_size = $gd2 ? rand(15, 18) : rand(20, 25);

      // Work out the sizes - also fix the character width cause TTF not quite so wide!
      $font_x = $cur_x + 5;
      $font_y = $max_height - rand(5, 8);

      // What font face?
      if (!empty($ttfont_list))
      {
        $fontface = $settings['default_theme_dir'] . '/fonts/' . $ttfont_list[rand(0, count($ttfont_list) - 1)];
        //log_error($fontface);
      }

      // What color are we to do it in?
      $is_reverse = 0;
      $char_color = imagecolorallocate($code_image, rand(max($foreground_color[0] - 2, 0), $foreground_color[0]), rand(max($foreground_color[1] - 2, 0), $foreground_color[1]), rand(max($foreground_color[2] - 2, 0), $foreground_color[2]));

      $angle = rand(-100, 100) / 10;
      $show_letter = $character['id'];
      $fontcord = @imagettftext($code_image, 18, $angle, $font_x, $font_y, $char_color, $fontface, $show_letter);
      if (empty($fontcord))
        $can_do_ttf = false;
      elseif ($is_reverse)
      {
        imagefilledpolygon($code_image, $fontcord, 4, $fg_color);
        // Put the character back!
        imagettftext($code_image, 18, $angle, $font_x, $font_y, $randomness_color, $fontface, $show_letter);
      }

      if ($can_do_ttf)
        $cur_x = max($fontcord[2], $fontcord[4]) + 3;
    }

    if (!$can_do_ttf)
    {
      // Rotating the characters a little...
      if (function_exists('imagerotate'))
      {
        $char_image = function_exists('imagecreatetruecolor') ? imagecreatetruecolor($character['width'], $character['height']) : imagecreate($character['width'], $character['height']);
        $char_bgcolor = imagecolorallocate($char_image, $background_color[0], $background_color[1], $background_color[2]);
        imagefilledrectangle($char_image, 0, 0, $character['width'] - 1, $character['height'] - 1, $char_bgcolor);
        imagechar($char_image, $loaded_fonts[$character['font']], 0, 0, $character['id'], imagecolorallocate($char_image, rand(max($foreground_color[0] - 2, 0), $foreground_color[0]), rand(max($foreground_color[1] - 2, 0), $foreground_color[1]), rand(max($foreground_color[2] - 2, 0), $foreground_color[2])));
        $rotated_char = imagerotate($char_image, rand(-100, 100) / 10, $char_bgcolor);
        imagecopy($code_image, $rotated_char, $cur_x, 0, 0, 0, $character['width'], $character['height']);
        imagedestroy($rotated_char);
        imagedestroy($char_image);
      }
 
      // Sorry, no rotation available.
      else
        imagechar($code_image, $loaded_fonts[$character['font']], $cur_x, floor(($max_height - $character['height']) / 2), $character['id'], imagecolorallocate($code_image, rand(max($foreground_color[0] - 2, 0), $foreground_color[0]), rand(max($foreground_color[1] - 2, 0), $foreground_color[1]), rand(max($foreground_color[2] - 2, 0), $foreground_color[2])));
      $cur_x += $character['width'] + $character_spacing;
    }
  }

  // Make the background color transparent.
  imagecolortransparent($code_image, $bg_color);

  // Add some randomness to the background.
  for ($i = rand(0, 2); $i < $max_height; $i += rand(1, 3))
    for ($j = rand(0, 10); $j < $total_width; $j += rand(1, 15))
      imagesetpixel($code_image, $j, $i, rand(0, 1) ? $fg_color : $randomness_color);

  // Put in some lines too.
  $num_lines = 2;
  for ($i = 0; $i < $num_lines; $i++)
  {
    if (rand(0, 1))
    {
      $x1 = rand(0, $total_width);
      $x2 = rand(0, $total_width);
      $y1 = 0; $y2 = $max_height;
    }
    else
    {
      $y1 = rand(0, $max_height);
      $y2 = rand(0, $max_height);
      $x1 = 0; $x2 = $total_width;
    }

    imageline($code_image, $x1, $y1, $x2, $y2, rand (0, 1) ? $fg_color : $randomness_color);
  }

  // Show the image.
  if (function_exists('imagegif'))
  {
    header('Content-type: image/gif');
    imagegif($code_image);
  }
  else
  {
    header('Content-type: image/png');
    imagepng($code_image);
  }

  // Bail out.
  imagedestroy($code_image);
  die();
}


Это для версии 1.1.1, если что.

†MavN†

Выглядит нормально :) к вечеру мод сделаем :) вывесим здесь если захочешь опубликуешь его здесь же на офф сайте

†MavN†

в общем мод сделал так что можете пользоваться

qwerty12345

Quote from: viacheslav on December 06, 2006, 08:47:50 AM
Вопрос 2.2: Короче тот же вопрос о нечетабельных буквах, но с другой стороны. Тут угораздило поставить форум на некий виндовый сервак, на котором уже стоял Апач. Тоже версию 1.1 Final. И представляете, там эти буковки визуальной проверки экзотические конечно, но вполне читабельные!! Начал разбираться, и вот что понял. Все зависит от значения некого переменного use_graphic_library. При одном значении картинка будет генериться невменяемая, а при другом он генериться, собирая gif-картинки нужных букв из папки fonts\... Вопрос, кто знает, чтобы подкрутить (задать некое фиксированное значение этому use_graphic_library или как-то иначе), чтоб окно визуальной проверки генерировалось именно вторым способом.
В Windows версии используются ttf шрифты, а в nix* системах  букв из папки fonts\, они там заданы картинками, можно попробовать подкорректировать шрифты на картинке.

Advertisement: