За последние 24 часа нас посетили 17399 программистов и 1196 роботов. Сейчас ищут 1464 программиста ...

Рисунок с цифрами или словами для защиты форм от спама

Тема в разделе "Обработка изображений средствами PHP", создана пользователем aleXioid, 9 фев 2006.

  1. aleXioid

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

    С нами с:
    9 фев 2006
    Сообщения:
    7
    Симпатии:
    0
    Адрес:
    Беларусь, г.Минск
    Может у кого есть класс для создания и контроля рисунка с просьбой ввести слово или цифры, чтобы избежать спама при передаче данных из форм.

    Плиз, поделитесь...
     
  2. Zero

    Zero Guest

    я немного не в тему, но предлагаю просто сесть и написать самому ;) оно на пользу будет.
     
  3. Денч

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

    С нами с:
    4 фев 2006
    Сообщения:
    59
    Симпатии:
    0
    Да, написать это легко, но написать генерацию трудночитаемых картинок для ботов тоже надо уметь.

    посмотрите вот это - http://demiurg.livejournal.com/70914.html
    Там же и ссылка на исходник

    ЗЫ Присутствует ненормативная лексика :wink:
     
  4. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    можно сделать так, чтобы на изображении выводилось рандомное число прописью, а пользователь должен будет ввести это же число цифрами.
     
  5. Zero

    Zero Guest

    simpson
    хмм жестко :) ну вообще вроде от ботов спасет наверное рендомный бекграунд, и рендомной направление текса (угол) с некоторыми ограничениями, что кверх ногами не был текст.
     
  6. Michael

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

    С нами с:
    7 фев 2006
    Сообщения:
    54
    Симпатии:
    0
    simpson, ага, а еще можно вывести уравнение, попросить его решить и записать ответ)))
     
  7. Бутузов

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

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна
  8. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Zero, Michael
    живой пример: http://musthave.ru/forum/profile.php?mode=register&agreed=true
    не сочтите за рекламу...
    правда, такой метод расчитан на русско-язычную аудиторию, хотя и на английский с успехом можно переделать. :)

    не думаю. скорее всего есть боты, которые и такое обойдут.
     
  9. wolandino

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

    С нами с:
    5 фев 2006
    Сообщения:
    193
    Симпатии:
    0
    Адрес:
    Россия, Астрахань
  10. Zero

    Zero Guest

    simpson
    Там по моему три массива и рендомный выбор элемента в каждом из них:) А насчет градиента, думаю что иногда проще наделать готовых градиентов и потом их рисовать под текстом, или же циклом фигачить попиксельно :))) но это изврат имхо
     
  11. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Zero
    нет, там простая функция, которая берет рандомное число и отдает в прописном представлении :)
     
  12. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    1. Создаем файл с именем picture.php.
    2. Пишем туда код:
    Код (Text):
    1. session_start();
    2. $session_kod='';
    3. $im=imagecreate(90, 30);
    4. $bg=imagecolorallocate($im, 0xAA,0xAA,0xAA);
    5. $tc=imagecolorallocate($im, 0xFF,0xFF,0xAA);
    6. $pixcolor=imagecolorallocate($im, 0x00,0x00,0x00);
    7. $arr_letter=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z');
    8. $arr_x=array(3,19,35,51,68);
    9. for($i=1;$i<30;$i++) imagesetpixel($im, Rand(1,90), Rand(1, 30), $tc);
    10. $arr_kod=array();
    11. for ($i_zn=0;$i_zn<5;$i_zn++){$i_rand=$arr_letter[rand(0,24)];imagettftext($im,  15,rand(-15,15),$arr_x[$i_zn],rand(15,25),$tc,'Monotype.ttf', $i_rand);$arr_kod[]=$i_rand;}
    12. $security_kod=implode("", $arr_kod);
    13. session_register('session_kod');
    14. header("Content-type: image/jpeg");
    15. imagejpeg($im);
    16. imagedestroy($im);
    3. Сливаем файл шрифта который используем в папку где лежит скрипт.
    4. В файле с формой пишем <img src="picture.php">
    5. В файле, который проверяет данные формы, сравниваем значение поля в введенными символами и зарегистрированную сессию.
    З.Ы. вот что получилось у меня http://all-reclama.ru/picture.php
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    мне понравилось. пол часа сидел F5 жал ... медитация, блин!

    p.s. "охренеть! дайте две!" (с)
     
  14. C

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

    С нами с:
    28 май 2006
    Сообщения:
    326
    Симпатии:
    0
    Вы что издеваетесь? Думаете легко написать анализатор алфавита по пиксельному изображению - да никто этого даже делать не будет.
    Разве что ради сильно важного сайта. Проще просто руками зарегистрировать учётную запись для робота.

    А у меня проблема такая.
    Тоже хотел прикрутить к регистрации картинку, но не знаю как на ней сделать текст побольше. Пишу

    imagestring($im, 5, 0, 0, $code, $text_col);

    но тект выводится сильно мелкий.
    Может кто поможет.
    Увеличение циферки с пяти да любой большей не принесло изменений.
     
  15. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    мы не издеваемся. это суровая правда...
    убираем шумы, пиксели переписываем как текст, получаем шаблоны символов. дальше уже идет просто сравнение шаблонов с изображениями.

    http://php.net/imagettftext
     
  16. Danilevsky

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

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Обьясните почему так?
    есть файл: image.inc.php
    PHP:
    1. <?php
    2. $rand = rand(10000, 99999);
    3. $image = imagecreate(60, 30);
    4. $bgColor = imagecolorallocate ($image, 255, 255, 255);  
    5. $textColor = imagecolorallocate ($image, 0, 0, 0);  
    6. imagestring ($image, 5, 5, 8,  $rand, $textColor);  
    7. header('Content-type: image/jpeg');
    8. imagejpeg($image);
    9. imagedestroy($image);
    10. ?>
    Вставляю его в hmtl следующим способом:
    PHP:
    1. <img src="image.inc.php">
    php выводит картинку с 5-ю цифрами.
    ниже пишу:
    PHP:
    1. <?PHP
    2. echo $rand;
    3. ?>
    Так вот php выдает мне "PHP Notice: Undefined variable: rand"
    почему так? Точно так же я записывал $_SESSION['rand'] = $rand - нихрена такакая же ошибка: переменная пустая. Помогите плиз. Не могу никак эту варификацую обуздать.
     
  17. Mavir

    Mavir Guest

    Потому что переменная $rand находится в разных скриптах
     
  18. Danilevsky

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

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Mavir, а как тогда мне это значение ранд запихнуть в переменную?
     
  19. Danilevsky

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

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Mavir, спасибо. помоголо, забыл поставить session_start()
     
  20. Mavir

    Mavir Guest

    В скрипте, которые выводит <img src="image.inc.php">, рассчитывать переменную и писать в сессию. А при формировании рисунка брать это значение из сессии
     
  21. }{urrep

    }{urrep Активный пользователь

    С нами с:
    2 июл 2006
    Сообщения:
    1
    Симпатии:
    0
    А можно, пожалуста, поподробней как это сделать?
     
  22. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    Код (Text):
    1.  
    2. Допустим у нас есть форма, где picture.php - это код описанный выше:
    3. <FORM method="POST" action="check.php">
    4. <INPUT type="text" name="text" /><BR />
    5. <img src="picture.php"><BR />
    6. <INPUT type="submit" value="Агонь!!!">
    7. </form>
    В файле check.php проверяем:
    PHP:
    1.  
    2. <?php
    3. if ($_POST['text']==$_SESSION['session_kod']) {echo "Код введен верно";}
    4. else {echo "Код введен не верно"; }
    5. ?>
    6.  
     
  23. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    unset($_SESSION['session_kod']) незабываем
     
  24. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    jpgraph

    в jpgraph есть класс jpgraph_antispam

    см файл jpgraph/src/Examples/antispamex01.php
     
  25. MagnetiZ

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

    С нами с:
    20 июн 2006
    Сообщения:
    5
    Симпатии:
    0
    Помогите разобраться
    В форму регистрации я вставил тег
    <IMG SRC=”Imige.php”>

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

    Файл image.php
    <?
    /*код генерации рисунка
    * ….
    */
    Header("Cache-Control: no-cache,no-store,must-revalidate");
    Header("Cache-Control: post-check=0,pre-check=0,false");
    Header("Pragma: no-cache");
    Header("Content-type: image/png");
    imagePng($Image);
    imagedestroy($Image);
    ?>

    но это не помогает.
    Все равно выводится старый рисунок.

    И еще вопрос по поводу сессии.
    Я читал что нужно делать сессию специально для рисунка.
    У меня есть авторизация и при запуске скрипта уже создается сессия, которая существует до закрытия браузера.
    Как верно организовать специальную сессию для рисунка?