ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Защита от ботов. Captcha.

Защита от ботов. Captcha.

  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 14 июля 2007 г. 17:42

    Защита от ботов. Captcha.


    Для защиты от спама можно использовать так называемую картинку с кодом.

    Принцип работы:
    — Генерируется случайное число или случаный набор символов;
    — Этот код записывается в сессию;
    — Этот же код выводится в виде картинки (обычно с помощью библиотеки gd);
    — Введённый пользователем код сверяется с кодом, записанным в сессии.

    Таким образом мы отсекаем роботов, которые не могут считывать содержимое картинки.

    Подобный скрипт очень лечко написать самому, для этого необходимо почитать:
    http://ru2.php.net/manual/ru/function.imagegd2.php
    http://ru2.php.net/manual/ru/ref.session.php


    Можно скачать уже готовый скрипт:
    http://captcha.ru/kcaptcha/

    там же есть пример по установке

    вобще на этом сайте http://captcha.ru/ популярно объяснено, что такое капча, дополнительных способах защиты,

    алгоритмах взлома и т.д.

    наслождайтесь
    все умрут, а я изумруд
  • pasha

    Сообщения: 1048 Репутация: N Группа: Адекваты

    Spritz 2 августа 2007 г. 16:50, спустя 18 дней 23 часа 7 минут

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 2 августа 2007 г. 16:54, спустя 3 минуты 58 секунд

    По последовательности изображений часто гораздо легче определить исходные знаки.
    Во всяком случае не труднее, т.к. из гифа можно спокойно вычленить одно и работать с ним, как с обычной статической капчей.
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 2 августа 2007 г. 16:55, спустя 1 минуту 15 секунд

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 августа 2007 г. 23:24, спустя 16 дней 6 часов 28 минут





    Мда, тут человек сам-то не сможет прочесть…

    Спустя пару минут…
    А что написано-то? Вроде "vero.4" ???
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 18 августа 2007 г. 23:35, спустя 10 минут 28 секунд

    почти судя по всему ver0.4 все-таки :)
    но эт так, догадываюсь по смыслу
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 19 августа 2007 г. 0:32, спустя 57 минут 52 секунды


    почти судя по всему ver0.4 все-таки :)
    но эт так, догадываюсь по смыслу


    :))) хехе точно :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • XoxMa

    Сообщения: 135 Репутация: N Группа: Кто попало

    Spritz 21 марта 2008 г. 18:50, спустя 215 дней 19 часов 17 минут

    Нашёл хороший скрипт captch'и в инете, но вот проблемма: этот скрипт не выводит случайные цифры. Всегда рисует почему-то одно и тоже число (у меня это 8561). Может кто-нить сможет подправить? Тут всё подробно расписано:

    code.php:

    <?
    // Регистрируем переменную
    session_start();
    session_register("secret_number");

    function mt() {
    list($usec, $sec) = explode(' ', microtime());
    return (float) $sec + ((float) $usec * 100000);
    }

    header("Content-type: image/png");

    // создаем изображение
    $im=imagecreate(101, 26);

    // Выделяем цвет фона (белый)
    $w=imagecolorallocate($im, 255, 255, 255);

    // Выделяем цвет для фона (светло-серый)
    $g1=imagecolorallocate($im, 192, 192, 192);

    // Выделяем цвет для более темных помех (темно-серый)
    $g2=imagecolorallocate($im, 64,64,64);

    // Выделяем четыре случайных темных цвета для символов
    $cl1=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
    $cl2=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
    $cl3=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));
    $cl4=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128));

    // Рисуем сетку
    for ($i=0;$i<=100;$i+=5) imageline($im,$i,0,$i,25,$g1);
    for ($i=0;$i<=25;$i+=5) imageline($im,0,$i,100,$i,$g1);

    // Выводим каждую цифру по отдельности, немного смещая случайным образом
    imagestring($im, 5, 0+rand(0,10), 5+rand(-5,5), substr($_SESSION["secret_number"],0,1), $cl1);
    imagestring($im, 5, 25+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],1,1), $cl2);
    imagestring($im, 5, 50+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],2,1), $cl3);
    imagestring($im, 5, 75+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],3,1), $cl4);

    // Выводим пару случайных линий тесного цвета, прямо поверх символов.
    // Для увеличения количества линий можно увеличить,
    // изменив число выделенное красным цветом
    for ($i=0;$i<8;$i++) imageline($im,rand(0,100),rand(0,25),rand(0,100),rand(0,25),$g2);


    // Коэфициент увеличения/уменьшения картинки
    $k=1.7;

    // Создаем новое изображение, увеличенного размера
    $im1=imagecreatetruecolor(101*$k,26*$k);

    // Копируем изображение с изменением рамеров в большую сторону
    imagecopyresized($im1, $im, 0, 0, 0, 0, 101*$k, 26*$k, 101, 26);

    // Создаем новое изображение, нормального размера
    $im2=imagecreatetruecolor(101,26);

    // Копируем изображение с изменением рамеров в меньшую сторону
    imagecopyresampled($im2, $im1, 0, 0, 0, 0, 101, 26, 101*$k, 26*$k);

    // Генерируем изображение
    imagepng($im2);

    // Освобождаем память
    imagedestroy($im2);
    imagedestroy($im1);
    imagedestroy($im);
    ?>


    index.php:

    <?
    session_start();
    session_register("secret_number");

    if (intval($_SESSION["secret_number"])<1000) {
    srand(doubleval(microtime()));
    $_SESSION["secret_number"]=rand(1000,9999);
    }

    if ($_SERVER["REQUEST_METHOD"]=="POST") {

    $error=0;
    if ($_POST["secretcode"]!=$_SESSION["secret_number"] || intval($_POST["secretcode"])==0) $error=1;

    if ($error==0) {
    $_SESSION["secret_number"]=rand(1000,9999);

    // Выполняем необходимые действия с данными
    // ..
    print "Hello ".htmlspecialchars(StripSlashes($_POST["email"]));
    exit;
    }

    if ($error==1) print "<font color=red>Число с картинки введено неверно</font>";
    }

    // Выводим форму повторно
    // …
    ?>
    <form action="index.php" method="post">
    Ваш E-Mail:<br>
    <input type="text" name="email" value=""><br>
    <br>
    Введите код, который вы видете на картинке:<br>
    <input type="text" name="secretcode" value=""><br>
    <img src='code.php?<?=doubleval(microtime());?>' width=101 height=26 vspace=5>
    <br><br>
    <input type="submit">
    </form>
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 21 марта 2008 г. 19:43, спустя 52 минуты 58 секунд

    Вот это, крайне странная конструкция:

    <img src='code.php?><?=doubleval(microtime());?>' width=101 height=26 vspace=5>
  • XoxMa

    Сообщения: 135 Репутация: N Группа: Кто попало

    Spritz 21 марта 2008 г. 21:00, спустя 1 час 17 минут 6 секунд

    Значит, на что мне лучше исправить src='code.php?<?=doubleval(microtime());?>' ?
    Я случайно приписал ">" перед php?
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 21 марта 2008 г. 21:05, спустя 4 минуты 30 секунд

    Там > лишнее
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 28 марта 2008 г. 18:00, спустя 6 дней 20 часов 54 минуты

    Вот любопытная статья как про капчу, и в том числе по взлому капчи секьюрити лаб :) Умные статьи писать проще чем сделать самому. Еще есть ссылки на забугорные источники. http://www.xakep.ru/post/31268/default.asp

    Только всеравно непонятно про эффективность. Кажется что всяк кулик-капчист считает что он умнее, молча что-то делает, а в общем смысле все капчи получаются уязвимыми, причем может не по анализу картинки, сколько еще по обычным косякам в реализации (см. статью). Сразу оговорюсь, мой спич не для того чтобы кто-то сделал эту работу за меня (мне это и самому интересно). Проблема в том что вот сижу я и думаю, прежде чем что-то кодировать, мне лично нарисовать капчу даже в фотошопе стало тяжело с учетом всего изучанного. А обсуждать никто не хочет. Или все пишут статьи а юзают чужие решения? Не хотелось бы верить …
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 28 марта 2008 г. 18:23, спустя 23 минуты 15 секунд

    Фигня какая-то. А зачем генератору каптчи скармливать какую-то инициализирующую строку?
    Что сложно рандомный алгоритм зашить?

    В общем статья не об уязвимости каптчи как таковой, а о ее кривой реализации. (Как было совершенно верно замечено!).

    З.Ы. Судя по некоторым вопросам на форуме, боты обходящие каптчу и имеющие некоторое подобие искуственного интеллекта все же существуют. :) Но это явно очень сырые альфа-версии. :)
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 28 марта 2008 г. 19:01, спустя 38 минут 4 секунды

    http://www.xakep.ru/post/31268/default.asp

    Меня, честно говоря, поражает реализация каптчи, которая там описана.

    captcha.php?captcha_code=%7E%D32%7F%8F
    Угадайте, что нас заинтересовало? Правильно - «?captcha_code=%7E%D32%7F%8F».
    Вставляем ссылку в окно адреса браузера и начинаем играть.

    Один большой вопрос - ЗАЧЕМ передавать код гетом? Внутри скрипта нельзя сформировать, не? Глупость какая-то.
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 10 июня 2008 г. 12:23, спустя 73 дня 16 часов 21 минуту

    Вопрос. А может ли рисовалка капТчи существовать в виде функции и как будет выглядеть ее вызов из хтмл страницы? Как лучше та?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!