За последние 24 часа нас посетил 34341 программист и 1711 роботов. Сейчас ищут 853 программиста ...

JavaScript class captchaCV

Тема в разделе "JavaScript и AJAX", создана пользователем Vladimir Kheifets, 5 мар 2025.

Метки:
  1. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Еренда устроена так:
    Кодирование и декодирование просходит на сервере.
    На сервера генерерируется и запоминается закодированная капча и отправляется клиенту.
    На клиенте капча декодируется для рисования.
    С клиента отправляется введённая капча и она кодируется на сервере перед валидацией.
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    (дополнение)
    Работы отвечают
    Код (Text):
    1. {"err":1,"msg":"Thank you for your feedbackThank you for your feedback.
    2. Unfortunately your message was not sent.
    3. Please try again later again"}
     
  3. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    Оно у вас и из веба сейчас не работает :)
    Особенно забавно видеть куски undefined на картинке :)

    [​IMG]

    В любом случае, все, что вы делаете на клиенте, будет скопировано в роботе.
    И в результате получается Windows Firewall.
    Удачи!
     
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Добрый день!
    Вы меня удивили. У Вас выбирается JS из кеш браузера.
    При тестирование рекомендуется чистить кэш.

    Так выводится уменя
    [​IMG]
    [​IMG]
     
  5. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    Да вы тоже всех нас тут, я бы сказал, сказочно (если вы понимание) удивляете :)
    Дело не в кеше, а в кривом коде.
    Вот варианты кода и токена, при которых после декодирования код содержит 5 символов, а должен содержать 6, отсюда и undefined при рисовании:
    Код (Text):
    1. ]OcfRN
    2. C7AHISDN2WGQMZFCPL9TRV3OJ6KBEUX851Y4
    https://ibb.co/9RZ3JhM

    А даже если и в кеше, если вы сейчас исправили кривой код, то до того, как я вам о нем сказал вы и не подозревали об этом :)

    А еще у вас иногда на клинте проверка проходит (на кнопке Senden), а на сервере нет https://ibb.co/XrRY7LXf
    Вместо того, чтобы сделать правильно, вы наворотили дичи, в которой сами же и запутались.
     
    #30 brevis, 13 мар 2025
    Последнее редактирование: 13 мар 2025
  6. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Добрый день!
    1. После Вашего сообщениия со скриншотом, код не изменялся.
    Ошибка, котоую Вы показали, могла быть только из-за кэша.
    2. Вы написали: код ]OcfRN содержит 5 символов, а должен содержать 6.
    Однако при вычислении Вы или робот не учли в ]OcfRN, первый символ
    ] - Closing bracket (135, 5D, 01011101) , с ним получается 6.
    3. Про то, что иногда... Я это заметил. Сейчас над этим работаю.

    Удачи!

    p.s. Обратите, пожалуйста, внимание на то. что я отвечаю на Ващи сообщения корректно.
     
  7. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    Что я написал -- видно в соответствующем сообщении.
    А написал я следующее:
    Процитирую вас же:
    Код (Text):
    1.  
    2. function dec(strIn, token) {
    3.   let shift = token.substr(0, 1).charCodeAt(0);
    4.   const A = token.substr(1).split("");
    5.   let outStr = [];
    6.   let arr = strIn.split("");
    7.   for (let i in arr) {
    8.     let value = arr[i];
    9.     outStr.push(A[value.charCodeAt(0) - shift]);
    10.   }
    11.   return outStr.join("");
    12. }
    13. const token = 'C7AHISDN2WGQMZFCPL9TRV3OJ6KBEUX851Y4';
    14. const strIn = ']OcfRN'; // input, 6 chars
    15. console.log(dec(strIn, token)); // output, 5 chars
    https://glot.io/snippets/h5frriiw78
     
    #32 brevis, 13 мар 2025
    Последнее редактирование: 13 мар 2025
  8. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
     
  9. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    @Vladimir Kheifets, не знаю что вы хотели написать, наверное что робот перестал работать :)
    Ну конечно, вы же придумали гениальную защиту: проверять время между запросами :)
    То есть просто вызов sleep обходит ваш замок, ключ от которого лежит под ковриком.

    PHP:
    1. <?php
    2. // Функция для извлечения кук из заголовков ответа
    3. function extractCookies($header) {
    4.     $cookies = [];
    5.     // Разбиваем заголовок по строкам
    6.     $lines = explode("\r\n", $header);
    7.     foreach ($lines as $line) {
    8.         if (preg_match('/^Set-Cookie:\s*([^;]+)/i', $line, $matches)) {
    9.             $cookies[] = $matches[1];
    10.         }
    11.     }
    12.     // Собираем куки в одну строку для заголовка Cookie
    13.     return implode('; ', $cookies);
    14. }
    15. function dec($strIn, $token) {
    16.     $shift = ord(substr($token, 0, 1));
    17.     $A = str_split(substr($token, 1));
    18.     $outStr = [];
    19.     $arr = str_split($strIn);
    20.     foreach ($arr as $value) {
    21.         $index = ord($value) - $shift;
    22.         $outStr[] = $A[$index];
    23.     }
    24.     return implode('', $outStr);
    25. }
    26. $url = 'https://www.alto-booking.com/developer/captchaCV/feedback/index.php';
    27. $ch = curl_init($url);
    28. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    29. curl_setopt($ch, CURLOPT_HEADER, true);
    30. curl_setopt($ch, CURLOPT_HTTPHEADER, [
    31.     'User-Agent: Robot',
    32. ]);
    33. $response = curl_exec($ch);
    34. // Определяем размер заголовка для разделения заголовков и тела
    35. $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    36. $header = substr($response, 0, $header_size);
    37. $body = substr($response, $header_size);
    38. // Извлекаем куки из заголовков
    39. $cookies = extractCookies($header);
    40. echo '[debug] cookies: ' . $cookies . PHP_EOL;
    41. // Функция для выполнения POST-запроса с заданными данными
    42. function doPost($url, $postData, $cookies = '') {
    43.     $ch = curl_init($url);
    44.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    45.     curl_setopt($ch, CURLOPT_POST, true);
    46.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
    47.         'Cookie: ' . $cookies,
    48.         'User-Agent: Robot',
    49.     ]);
    50.     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    51.     //curl_setopt($ch, CURLOPT_VERBOSE, 1);
    52.     $response = curl_exec($ch);
    53.     curl_close($ch);
    54.     return $response;
    55. }
    56. $captcha = doPost($url, json_encode(['nChars' => 6]), $cookies);
    57. echo '[debug] encoded code: ' . $captcha . PHP_EOL;
    58. sleep(2);
    59. $token = doPost('https://www.alto-booking.com/developer/captchaCV/feedback/js/module/token.js', [], $cookies);
    60. preg_match('/\'(.+)\';/', $token, $t);
    61. $token = $t[1];
    62. echo '[debug] token: ' . $token . PHP_EOL;
    63. sleep(2);
    64. $code = strtolower(dec($captcha, $token));
    65. echo '[debug] decoded code: ' . $code . PHP_EOL;
    66. sleep(2);
    67. doPost($url.'?', json_encode(['cv' => $code]), $cookies);
    68. sleep(2);
    69. print_r(json_decode(doPost($url, ['name' => 'test', 'email' => 'test@test', 'message' => 'test'], $cookies),true));
    [​IMG]

    Я все надеялся перейти к следующему этапу, проверить насколько легко распознать код с вашей картинки современными OCR средствами, но, увы, потерял интерес. Так как мы никак не можем пройти этап глупого робота...

    Я искренне надеюсь, что вы все же понимаете в чем тут проблема и просто демонстрируете упорство (зачем-то).
    Ибо если вы не понимаете -- то удача тут не поможет.
     
    #34 brevis, 14 мар 2025
    Последнее редактирование: 14 мар 2025
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Добрый день!
    Спасибо за Ваше упорство.
    Я понимаю в чём проблема.
    Вы меня немного опередили с роботом. Сделал последнюю доработку.
    Код (Text):
    1. [debug] cookies: PHPSESSID=56ce2c96138a3d2d0557be87185e247b
    2. [debug] encoded code: _ZgOUQ
    3. [debug] token: 4Z6WPKB5DE2JG1QFYHLOXUIVMANTR7CS8394
    4.  
    5. [debug] decoded code: r9c
    6. Array
    7. (
    8.     [err] => 1
    9.     [msg] => Thank you for your feedbackThank you for your feedback.
    10. Unfortunately your message was not sent.
    11. Please try again later again
    12. )
    Вы правы, что пора остановиться.
     
  11. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    И в чем же?
    Судя по тому, что вы "сделали последнюю доработку" (переместили токен в <img src="...">), вы не понимаете в чем проблема.
     
  12. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Добрый день!
    Проблема в том, что код js нельзя скрыть.
    Однако, если программа поддерживается, то и робот нужно постоянно дорабатывать, причём для этого необходимо каждый раз инспектировать код. С этим может справиться, только восококвалифицированный специалист.
    Как следствие этого возникает вопрос практической рентабильности этой затеи.
    Эту игру можно было бы продолжить, токен может в следующий раз оказаться не там и не тот, или ... ,
    но полагаю продолжать не стоит.
    Спасибо! Мне было очень приятно с Вами пообщаться.
    Удачи!
     
  13. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    А можно один раз сделать правильно.
    Но если ваша капча позиционируется как артефакт для игры, а не как настоящая капча, которая может быть установлена, например, на миллионы wordpress веб-сайтов, то конечно вопросов к ней нет. В качестве игрушки вполне себе имеет право на существование.
     
  14. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Я не занимаюсь игрушками и не пишу плагины для wordpress.
    Между прочим, в своих проектах капчу на js я не применяю.
    Случайно попалась на DEV Community js-canvas капча. Решил, со ссылкой на автора, поэкспериментировать с этой затеей.
    Так получился этот класс. Не для миллионов wordpress веб-сайтов.
     
  15. brevis

    brevis Активный пользователь

    С нами с:
    23 июл 2019
    Сообщения:
    95
    Симпатии:
    25
    Надеюсь это какой-то вид пост/мета/...- юмора.
    Ибо для последнего эксперимента вообще никакая логика в роботе не нужна. Достаточно ввести капчу один раз руками и потом ее использовать в каждом запросе:
    Код (Text):
    1.  
    2. curl 'https://alto-booking.com/developer/captchaCV/feedback/index.php' \
    3.   -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundaryTr6xOn5KALZDOtYT' \
    4.   --data-raw $'------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="name"\r\n\r\ntest\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="email"\r\n\r\ntest@test\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="message"\r\n\r\ntest\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT\r\nContent-Disposition: form-data; name="code"\r\n\r\nNTE5NDAy\r\n------WebKitFormBoundaryTr6xOn5KALZDOtYT--\r\n'
    [​IMG]Вам удачи. Ну а мне на этом позвольте откланяться, ибо играть в шахматы с голубями не интересно.