LINUXTALKS.CO

Текстовая капча

 , ,

L


0

1

<?php

echo '<body bgcolor="#aaa"><pre>';
captcha();
echo '</pre>';

function captcha() {
    $captcha_random = captcha_random_string();
    $captcha_glyphs = captcha_alpha_numeric();
    $captcha_inject = '01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%&?@';

    for ($i = 0; $i < 7; $i++) {
        for ($c = 0; $c < strlen($captcha_random); $c++) {
            $char = $captcha_random[$c];
            $char = $captcha_glyphs[$char];
            $char = $char[$i];
            $fill = array();
            for ($n = 0; $n < strlen($char); $n++) {
                $x = $char[$n];
                $r = $captcha_inject[rand(0, strlen($captcha_inject) - 1)];
                $hi_r = 16+rand()%50;
                $hi_g = 16+rand()%50;
                $hi_b = 16+rand()%50;
                $lo_r = 200+rand()%50;
                $lo_g = 200+rand()%50;
                $lo_b = 200+rand()%50;
                $hi = sprintf("%x%x%x", $hi_r, $hi_g, $hi_b);
                $lo = sprintf("%x%x%x", $lo_r, $lo_g, $lo_b);
                if ($x == '#') {
                    $x = "<font color=$hi><b>$r</b></font>";
                }
                else {
                    $x = "<font color=$lo><b>$r</b></font>";
                }
                $fill[] = $x;
            }
            echo implode($fill);
        }
        echo "\n";
    }
}

function captcha_random_string($length = 10) {

    $alphanumeric = '1457ACEFHIJKLMNPRTUVWXYZ';
    $randomstring = array();

    for ($i = $length; $i > 0; $i--) {
        $n = rand(0, 23);
        $randomstring[] = $alphanumeric[$n];
    }

    return implode($randomstring);

}

function captcha_alpha_numeric() {

    $alphanumeric = array(
        '1' => array(
            "   #    ",
            "  ##    ",
            " # #    ",
            "   #    ",
            "   #    ",
            "   #    ",
            " #####  ",
        ),
        '4' => array(
            "#       ",
            "#    #  ",
            "#    #  ",
            "#    #  ",
            "####### ",
            "     #  ",
            "     #  ",
        ),
        '5' => array(
            "####### ",
            "#       ",
            "#       ",
            "######  ",
            "      # ",
            "#     # ",
            " #####  ",
        ),
        '7' => array(
            "####### ",
            "#    #  ",
            "    #   ",
            "   #    ",
            "  #     ",
            "  #     ",
            "  #     ",
        ),
        'A' => array(
            "   #    ",
            "  # #   ",
            " #   #  ",
            "#     # ",
            "####### ",
            "#     # ",
            "#     # ",
        ),
        'C' => array(
            " #####  ",
            "#     # ",
            "#       ",
            "#       ",
            "#       ",
            "#     # ",
            " #####  ",
        ),
        'E' => array(
            "####### ",
            "#       ",
            "#       ",
            "#####   ",
            "#       ",
            "#       ",
            "####### ",
        ),
        'F' => array(
            "####### ",
            "#       ",
            "#       ",
            "#####   ",
            "#       ",
            "#       ",
            "#       ",
        ),
        'H' => array(
            "#     # ",
            "#     # ",
            "#     # ",
            "####### ",
            "#     # ",
            "#     # ",
            "#     # ",
        ),
        'I' => array(
            "###     ",
            " #      ",
            " #      ",
            " #      ",
            " #      ",
            " #      ",
            "###     ",
        ),
        'J' => array(
            "      # ",
            "      # ",
            "      # ",
            "      # ",
            "#     # ",
            "#     # ",
            " #####  ",
        ),
        'K' => array(
            "#    #  ",
            "#   #   ",
            "#  #    ",
            "###     ",
            "#  #    ",
            "#   #   ",
            "#    #  ",
        ),
        'L' => array(
            "#       ",
            "#       ",
            "#       ",
            "#       ",
            "#       ",
            "#       ",
            "####### ",
        ),
        'M' => array(
            "#     # ",
            "##   ## ",
            "# # # # ",
            "#  #  # ",
            "#     # ",
            "#     # ",
            "#     # ",
        ),
        'N' => array(
            "#     # ",
            "##    # ",
            "# #   # ",
            "#  #  # ",
            "#   # # ",
            "#    ## ",
            "#     # ",
        ),
        'P' => array(
            "######  ",
            "#     # ",
            "#     # ",
            "######  ",
            "#       ",
            "#       ",
            "#       ",
        ),
        'R' => array(
            "######  ",
            "#     # ",
            "#     # ",
            "######  ",
            "#   #   ",
            "#    #  ",
            "#     # ",
        ),
        'T' => array(
            "####### ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
        ),
        'U' => array(
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            " #####  ",
        ),
        'V' => array(
            "#     # ",
            "#     # ",
            "#     # ",
            "#     # ",
            " #   #  ",
            "  # #   ",
            "   #    ",
        ),
        'W' => array(
            "#     # ",
            "#  #  # ",
            "#  #  # ",
            "#  #  # ",
            "#  #  # ",
            "#  #  # ",
            " ## ##  ",
        ),
        'X' => array(
            "#     # ",
            " #   #  ",
            "  # #   ",
            "   #    ",
            "  # #   ",
            " #   #  ",
            "#     # ",
        ),
        'Y' => array(
            "#     # ",
            " #   #  ",
            "  # #   ",
            "   #    ",
            "   #    ",
            "   #    ",
            "   #    ",
        ),
        'Z' => array(
            "####### ",
            "     #  ",
            "    #   ",
            "   #    ",
            "  #     ",
            " #      ",
            "####### ",
        ),
    );

    return $alphanumeric;

}
★★★★★★

парсер написать легко только потому что буквы тёмного цвета, слишком маленькая сумма R+G+B, но если буквально одну-две буквы пропускать и делать их под цвет фона, то парсер угадыватель капчи обосрётся и не разгадает ничего

дискасс

Spoofing    
★★★★★★
Linux / Firefox

парсерсу надо будет каждый font color= цвет смотреть, если светлый цвет, значит это фон, если тёмный, значит часть буквы. но какой буквы? глифы то тоже можно рисовать любые. а ещё одну-две буквы (кусочки начертания глифа) пропустить и сделать под цвет фона, и всё, и приехали.

не напишешь разгадыватель капчи.

ммм?

Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Spoofing

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

Harald    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Harald

раз-два-три, спуфингокапча поломайся!

$ ffmpeg -i fsa9i5.png -vf "avgblur=sizeX=8,edgedetect=high=0.5:low=0.1:mode=colormix" -f mjpeg - | tesseract stdin stdout --psm 8 -l eng

LTNUXTALKS)

ну почти, I упорно за T принимает, надо подкрутить параметры где-то, дальше лень было

Harald    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Spoofing

но если буквально одну-две буквы пропускать и делать их под цвет фона

А если кластеризовать цвета букв?

И вообще, если под картинку будет писаться парсер то почему тогда не закрашивать прямоугольной буквы в цвет этой буквы и только потом вести дальнейшую разработку?

torvn77    
★★★
Android / Chrome
Ответ на: комментарий от torvn77

Думаю что капча должна содержать междустроковый текст.
Например одному и тому же заданию "найди зелёное" может соответствовать такие варианты теста:
. Фотографии различных дебилок все зелённого цвета, но одна из них Грета Тумберг
. Фотографии разных протестов на одной из которых одна женщина обливает красной жидкостью другую женщину
. Куча чёрнобелых фотографий одна из которых Есентуки, Полюстрово и т.д.
. Чёрнобелые фотографии автомашин одна из которых советские Жигули(зелёные машины популярны только в СССР)
. Чёрнобелые фотографии разных агрегатов одна из которых фрезерный или токарный станок(в СССР их красили в зелёный цвет)

Теже фотки станков могут быть в задании "найди красное" или "найди страшный предмет"

При этом если рядом со станком показана косоворотка то ответом на поиск красного становится она(ибо она красная сейчас)

torvn77    
★★★
Последнее исправление: torvn77 (всего исправлений: 3)

Android / Chrome
Ответ на: комментарий от w

я не хотел компилировать php gd библиотеку для работы с графикой, поэтому текстовая капча лучше тем, что

  1. будет отображаться даже в консольных браузерах

  2. не требует php gd

Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от XoFfiCEr

Без обид. Вот опять ты хуйню сморозил. Пхпинфо это тупо встроенная функция, которая вываливает все, что есть в данной сборке пхп. А есть ли там искомые модули, зависит от того, как этот пхп был собран. И нынешний современный пхп еще более сегментирован на отдельные модули, чем старые версии. А что там и как у этого ниньзи спуфинга собрано – вообще, как обычно, черт ногу сломит.

deep-purple    
★★★★★★★★★★
Android / Firefox