[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Cделал собственную капчу. Жду критики :)
Artur
Я сделал собственную капчу для регистрации на собственном форуме.
Не могу назвать себя про в области РНР, поэтому хотел бы спросить у знатоков - насколько уязвимо то, что я сделал?
Итак:
1) Есть 10 джепегов, в каждом по одной циферке.
2) При входе юзера на страницу с формой регистрации создается простая сессия (session_register), с одной переменной, которая хранит 4-значное рэндом число.
3) На месте изображения вместо джепегов <img src="captcha.php">.
4) captcha.php берет рэндом, хранящийся в сессии, и с помощью imageCreateFromJPEG создает соответствующий динамический джепег из четырех джепегов с циферками.
5) reg.php осуществляет проверку даннных, введенных в форму, в том числе соответствие введенных юзером циферок тому, что хранится в сессии (и соответствует выведенному джепегу)
6) если циферки юзер ввёл неправильно, регистрационная форма перегружается с уже новой сессией и соответственно новым рэндом-числом на динамическом джепеге; если ввёл верно, происходит регистрация и сессия дестроится.
.
Таким образом (насколько я понимаю) секретное число нигде не фигурирует, никаких input type="hidden" не треубется и вроде как всё безопасно.
Вопрос того насколько сложно выглядят циферки оставим в стороне.
Адрес дать не могу, извините, есть причины.
Прошу Вас оценить эту схему. Заранее признателен!



Спустя 8 минут, 2 секунды (14.09.2010 - 15:14) waldicom написал(а):
1. Скрипт будет просто летать на слабых машинках, это +
2. 10000 различных вариантов капчи (если я правильно посчитал... а я правильно посчитал), причем скорее всего у каждой свой md5. Перебираться такие варианты будут конечно миллион лет. Это +

Спустя 12 минут, 54 секунды (14.09.2010 - 15:27) Artur написал(а):
md5 не используется никак.

А минусы? ))

Спустя 25 секунд (14.09.2010 - 15:27) waldicom написал(а):
Цитата (Artur @ 14.09.2010 - 14:27)
md5 не используется никак.

А минусы? ))

эммм... мда...

Спустя 4 минуты, 14 секунд (14.09.2010 - 15:32) Artur написал(а):
Не могли бы Вы пояснить?

Спустя 4 минуты, 37 секунд (14.09.2010 - 15:36) waldicom написал(а):
Цитата (Artur @ 14.09.2010 - 14:32)
Не могли бы Вы пояснить?

Мог бы... Вы читали книжку "Вредные советы" Григория Остера. Вот тут та же самая идея.
В нормальном виде мой пост мог бы выглядеть так:
1. Скрипт будет нагружать сервер, причем этого можно избежать
2. Слишком мало вариантов капчи, причем те варианты, что есть, можно легко сравнить и следовательно обойти.

Спустя 17 минут, 1 секунда (14.09.2010 - 15:53) Artur написал(а):
1) Я понимаю, работа gd нагружает сервер, но у меня используются джепеги вес каждого из которых чуть больше килобайта. Разве это дает сколь-нибудь ощутимую нагрузку?
2.1) Если мало вариантов, можно сделать не 4 цифры, а, скажем, 8. Или кроме цифр добавить буквы. Это уже вопрос десятый. Главное, что мне бы хотелось понять - насколько достоин существования сам алгоритм?
2.2) Что Вы имеете ввиду под "можно легко сравнить"?

Спустя 7 минут, 53 секунды (14.09.2010 - 16:01) waldicom написал(а):
2.1. чем больше цифр, тем сложнее, думаю это ясно всем. Тут надо найти компромисс между безопасностью и удобством для пользователя. А если еще и буквы в игре, то вообще хорошо.
2.2. Полагаю, что алгоритм соединения картинок в одну большую у Вас один и тот же. Тогда берем все Ваши картинки, составляем 10000 капч, вычисляем их md5. Затем на странице берем md5 вашей капчи и сравниваем со своими. Если подошла - капча разгадана.

Спустя 26 минут, 11 секунд (14.09.2010 - 16:27) Michael написал(а):
Цитата (Artur @ 14.09.2010 - 14:06)
Прошу Вас оценить эту схему. Заранее признателен!

Что у тебя сделано против этого ?

Спустя 26 минут, 29 секунд (14.09.2010 - 16:54) Guest написал(а):
Micahel, ничего. А разве против "этого" можно что-то сделать?
Waldicom, Вы меня простите, я возможно чего-то круто недопонимаю, но где и как Вы возьмёте хэш текущей капчи?

Спустя 1 минута, 49 секунд (14.09.2010 - 16:56) Michael написал(а):
можно утяжелить грабберу отдачу картинки индусам, поглючить тоесть. laugh.gif

Спустя 9 секунд (14.09.2010 - 16:56) waldicom написал(а):
Цитата (Guest @ 14.09.2010 - 15:54)
я возможно чего-то круто недопонимаю, но где и как Вы возьмёте хэш текущей капчи?

Мы сейчас говорим о возможности обойти капчу, правильно?
В таком случае берем картинку текущей капчи (простыми словами скачиваем её себе на комп и рассчитываем её контрольную сумму)

Спустя 10 минут, 58 секунд (14.09.2010 - 17:07) DedMorozzz написал(а):
Michael
лишь не популярными мерами. Учитывая, что капча и так не популярная мера, ухудшать положение - явно не стоит. Лишь если будет волна спама от индусов. Там уже можно придумать очень много решений... Но для посетителя будет накладно.
А если это регистрация - то тут убрать капчу и заменить на подтверждение по мылу.

Спустя 3 минуты, 5 секунд (14.09.2010 - 17:10) Artur написал(а):
Waldicom - Да, мы говорим о возможности обойти такую капчу автоматически, что позволит роботу автоматически регистрироваться и спамить.
Чтобы получить хэш с картинки, Вам надо её своими глазами распознать. Взлом - уже не взлом, если для этого нужно работать своими глазами, правильно?
Я не пойму о чём Вы говорите.

Спустя 1 минута, 11 секунд (14.09.2010 - 17:11) twin написал(а):
Подтвеждение тоже давно обходится. Тут только свои изобретения помогают. А своими алгоритмами делиться - значит снижать эфективность.
Вот это задача для программиста, а не для кодера кстати. smile.gif

Цитата
Вам надо её своими глазами распознать.
Верно. Но один раз. А потом стопицот постов засунуть мерзких.

Спустя 4 минуты, 45 секунд (14.09.2010 - 17:16) Artur написал(а):
Twin - мой алгоритм очень прост, адрес сайта я не давал, так что эффективность снижена едва ли smile.gif
Чтоб мерзких постов не было, такая же капча легко прикручивается и к отправке сообщений (Конечно же только в том случае, если реально посыпется спам).

Спустя 3 минуты, 1 секунда (14.09.2010 - 17:19) Artur написал(а):
Waldicom - я так и не могу понять для чего тут может понадобится md5 при попытках обойти эту капчу.

Спустя 5 минут, 42 секунды (14.09.2010 - 17:24) twin написал(а):
Так о том и речь, что расковырять эту капчу - не велика задача. Если к ресурсу будет интерес, расковыряют за час и заспамят все подряд.

Скачают картинки, назовут 1.gif, 2.gif и так далее. Посчитают md5 хэш файлов, а потом будут сравнивать этот хэш с хэшем картинки на капче. Если они объединяются в одну - вариантов всего 10000 штук, так что ни первая часть аферы, ни вторая, затруднений не вызовут.

Спустя 18 минут, 28 секунд (14.09.2010 - 17:43) Artur написал(а):
Twin,
а сколько раз нужно нажать F5, чтобы получить 10 тыщ разных рэндомных четырехзначных чисел, и чтобы в итоге получить все возможные хеши? По-моему ооочень долго.

Спустя 2 минуты, 28 секунд (14.09.2010 - 17:45) DedMorozzz написал(а):
Разве? Первое что в голову пришло - ставлю на крон скрипт, который полученные данные логирует. И по утру я читаю все комбинации.

Спустя 1 час, 59 минут, 43 секунды (14.09.2010 - 19:45) Basili4 написал(а):
twin
Цитата (twin @ 14.09.2010 - 18:11)
А своими алгоритмами делиться - значит снижать эфективность.

Я вот тут не соглашусь. алгоритм можно выведать. И надеятся на то что ваш алгоритм не кто не узнает не стоит. вот если отдать ваш алгоритм на растерзание мне кажется будет больше пользы. будут видны слабые стороны и огрехи всяческие.

Спустя 20 часов, 51 минута, 40 секунд (15.09.2010 - 16:37) Sender написал(а):
А если оберазать md5 хэш c помощью substr(); ?

Тогда по идее, роботами не заспамят .

Спустя 5 минут, 6 секунд (15.09.2010 - 16:42) Basili4 написал(а):
Sender
Уменьшить количество вариантов. единственное что может действительно помочь это генерация случайного мусора на фоне. точки там запятые

Спустя 10 минут, 31 секунда (15.09.2010 - 16:52) Гость_Michael написал(а):
Цитата (DedMorozzz @ 14.09.2010 - 14:07)
Michael
лишь не популярными мерами. Учитывая, что капча и так не популярная мера, ухудшать положение - явно не стоит. Лишь если будет волна спама от индусов. Там уже можно придумать очень много решений... Но для посетителя будет накладно.
А если это регистрация - то тут убрать капчу и заменить на подтверждение по мылу.

посетитель разницы не заметит. Работы добавится программисту. И соответственно тому кто будет расковыривать.
Что посетитель увидит? - да обычное - какие то буквы и цифры и для них поле ввода.
Например можно три прозрачных картинки спозиционировать относительно друг друга. А чтобы "это" отдать индусам на распознание граберу придется собрать из них одну картинку, а для этого как минимум парсить таблицу стилей или js-код. Грабельщиков много, но за бесплатно тоже никто не работает, особенно когда не все так просто.

Спустя 41 минута, 55 секунд (15.09.2010 - 17:34) twin написал(а):
Я не понимаю, что за блажь делать капчу из картинок. Ведь гораздо надежнее, проще и экономичнее использовать шрифты. Вот я себе так представляю твой вариант:
<?php 

session_start();

$_SESSION['key'] = rand(0, 9) . rand(0, 9) . rand(0, 9) . rand(0, 9);

$d1 = imagecreatefromgif('./pic/'. $_SESSION['key'][0] .'.gif');
$d2 = imagecreatefromgif('./pic/'. $_SESSION['key'][1] .'.gif');
$d3 = imagecreatefromgif('./pic/'. $_SESSION['key'][2] .'.gif');
$d4 = imagecreatefromgif('./pic/'. $_SESSION['key'][3] .'.gif');

$im = imagecreatetruecolor(276, 74);

imagecopy($im, $d1, 0, 0, 0, 0, 69, 74);
imagecopy($im, $d2, 69, 0, 0, 0, 69, 74);
imagecopy($im, $d3, 138, 0, 0, 0, 69, 74);
imagecopy($im, $d4, 207, 0, 0, 0, 69, 74);

header('Content-type: image/gif');
imagegif($im);

Вычислить md5 хэши картинок - не велика проблема.
Даже если взять не 10000 вариантов, а всего 500, то условно каждый 20-й запрос будет успешным.

Ты наверно плохо представляешь этот алгоритпм. Капча скачивается на свой сервак и от этой картинки функцией md5_file() берется хэш. Он пишется в базу свместе со значением. Потом просто берем капчу с формы и сравниваем с тем, что есть в базе. Попали - ура. Не попали - обновляем капчу и снова. 500 вариантов можно за час набить.

Чтобы этого было сделать невозможно, нужно пустить случайных помех:
<?php 


session_start();

$_SESSION['key'] = rand(0, 9) . rand(0, 9) . rand(0, 9) . rand(0, 9);

$d1 = imagecreatefromgif('./pic/'. $_SESSION['key'][0] .'.gif');
$d2 = imagecreatefromgif('./pic/'. $_SESSION['key'][1] .'.gif');
$d3 = imagecreatefromgif('./pic/'. $_SESSION['key'][2] .'.gif');
$d4 = imagecreatefromgif('./pic/'. $_SESSION['key'][3] .'.gif');

$im = imagecreatetruecolor(276, 74);

imagecopy($im, $d1, 0, 0, 0, 0, 69, 74);
imagecopy($im, $d2, 69, 0, 0, 0, 69, 74);
imagecopy($im, $d3, 138, 0, 0, 0, 69, 74);
imagecopy($im, $d4, 207, 0, 0, 0, 69, 74);

$color = imagecolorallocate($im, 0, 0, 0);

for($i = 0; $i < 5; $i++)
imageline(
$im,
mt_rand(0, 100),
mt_rand(0, 74),
mt_rand(100, 276),
mt_rand(0, 74),
$color
);


header('Content-type: image/gif');
imagegif($im);

Тогда хэшей будет не 10000, а на несколько порядков больше и операция потеряет смысл.


Однако такую капчу весьма несложно разобрать по пикселям. И тупо прочитать надпись. Чем меньше вариантов, тем проще. По этому лучше использовать заковыристый шрифт. А это мало того, что увеличит к-во вариантов, снизит ресурсоемкость:
<?php 

session_start();

$_SESSION['key'] = rand(0, 9) . rand(0, 9) . rand(0, 9) . rand(0, 9);

$im = imagecreatetruecolor(170, 74);
$bg = imagecolorallocate($im, 245, 242, 240);
$color = imagecolorallocate($im, 0, 0, 0);

imagefill($im, 0, 0, $bg);
imagettftext($im, 50, 0, 10, 50, $color, '1.ttf', $_SESSION['key']);

for($i = 0; $i < 5; $i++)
imageline(
$im,
mt_rand(0, 100),
mt_rand(0, 74),
mt_rand(100, 170),
mt_rand(0, 74),
$color
);


header('Content-type: image/gif');
imagegif($im);


Теперь, если немного подумать, можно использовать не только цифры, но и буквы.
Эта борьба идет давно и такими простыми, как у тебя методами можно бороться только тогда, когда ты как индеец ДЖО никому не нужен. А если усложнять - неудобно юзеру. Поэтому думай, если что изобретешь - я первый на очереди.

Скрипт с шрифтом в аттаче на вс. случай.

Спустя 18 часов, 35 минут, 30 секунд (16.09.2010 - 12:10) Artur написал(а):
Twin, спасибо большое за совет, особенно за наглядный!
Это не блажь, это "как умею" )) Как писал "у первых строках", я не профессионал в программировании.
Недостатки мне ясны. Но, думаю, логично будет начать с того как есть сейчас. Главное ведь - аудитория! Мало ли, может у меня и правда Джо окажется :) Сначала надо раскрутить форум, потом подождать пока возникнут проблемы со спамом (если возникнут), и только потом думать каким образом укреплять защиту. Наверное так.

Спустя 29 минут, 21 секунда (16.09.2010 - 12:39) twin написал(а):
Абсолютно верное решение.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.