23:42 

Код безопасности (PHP)

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
Я сейчас работаю над страницей регистрации одного сайта. Несколько часов думал, как реализовать код безопасности аля защита от ботов.
Вот до чего додумался.

Какой смысл генерить каждый раз новый код? Можно вообще использовать только одну картинку типа "1+9=" введите результат. Бот все равно пробиться не сможет.
А можно сделать десять картинок заранее и пустить их на произвольное отображение.
Если выбрана (показана) картинка номер 1 - переменной code присваевается значение, указанное на картинке, например - 16. Если картинка 7 - значение 79. И так далее.
После чего введенный пользователем код сравнивается со значением переменной code и если совпадает - велком!

Я так и сделал, но хотелось бы как можно реже ошибаться.
Потому у меня несколько вопросов:

1. Чем мой вариант не подходит?
2. Нарушена ли безопасность?
3. Как поступают профессионалы?

@темы: PHP, Безопасность

Комментарии
2008-01-31 в 00:03 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Чем мой вариант не подходит?
1 раз вручную настраивается бот и защита перестает работать. ИМХО, название картинки и адрес и значение проверочной переменной не должны иметь прямого соответствия. Именно поэтому код генерирующийся по какому-либо алгоритму обойти можно только зная алгоритм, а в вашем случае система обходиться сопоставлением.

2008-01-31 в 00:10 

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
FVA

Это были условные обозначения. Имя переменной, код и название картинки.
Для ясности.)

2008-01-31 в 00:41 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Константин Гуськов
Ясно. =) В общем на самом деле, не так важно что на картинке, важно то, чтобы вычисление прямой закономерности между кодом и результатом было практически невозможным. =) Ну, это не считая распознавания картинки и прочих интеллектуальных наворотов у ботов.

2008-01-31 в 00:52 

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
FVA

Если боты реально научатся понимать изображения - алгоритмы уже не спасут=)
То есть мой вариант использовать можно? Главное спрятать поглубже переменную, хранящую истинный код?

2008-01-31 в 01:32 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Константин Гуськов,
Да, вполне можно. =) Еще один совет - можно использовать не только картинки вида "1+1=", но и например "три - 1 это".

2008-01-31 в 02:57 

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
FVA

Благодарю.=)

2008-01-31 в 03:08 

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

2008-01-31 в 04:33 

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
FVA

О! Спасибо. Кто бы мне еще объяснил, каким образом боты умудряются понимать нарисованное..
Если ради безопасности приходится прибегать даже к анимации.

2008-01-31 в 04:41 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Константин Гуськов Серьезный бот - это довольно сложное приложение, которое не только умеет заполнять и сабмитить формы. Это многоуровневый паук, совмещающий в себе функции поискового бота, анализатора контента. Ко многим подключаются OCR-приложения (системы распознования символов), тот же FineReader, например.

2008-01-31 в 05:46 

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
FVA

Система распознавания символов.. каких? Графических?
В любом случае сайт, над которым я сейчас работаю, далеко не контакт Дурова.
Так что вряд ли к нам заглянут столь серьезные гости.=)
Нет?

2008-01-31 в 06:13 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Константин Гуськов
Система распознавания символов.. каких? Графических?
ru.wikipedia.org/wiki/OCR
Так что вряд ли к нам заглянут столь серьезные гости
Если будет выгодно у вас спамить - придут. =)

2008-01-31 в 09:45 

Константин Гуськов
True или False? Вот в чем вопрос.. © A. Fatred
FVA

Проект рассчитан на 250 пользователей. Особой выгоды для спама не вижу.
Но все же постараюсь повысить защиту. На всякий случай.=)
Спасибо за ссылку.

2008-01-31 в 11:05 

alhames
alhames.ru
Проблема весьма актуальна, потому я как приеду поделюсь накопленным материалом.

Что касается картинок "2+2=", то они не помогут, если бот "умеет читать" -простую арифметику он точно знает, а вот некоторые пользователи, как показывает практика -нет :о)

2008-01-31 в 12:23 

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
я вобще где-то видел скрипт, который принтит через пыхыпы на картинку, любым шрифтом (помому очень простой скрипт т.к функиция из php ref), почему бы тем кому надо, его не погуглить и не по пользовать (делаем картинку, выдаем хэш сид по timestamp + IP как primary key, + ответ чтобы потом сравнить с сабмитом)- тогда без OCR боту точно никак. А можно и совместить это с одним из вышеупомянутых вариантов.

Или генерить вместо цифр - random string, и сохранять вместо ответа

з.ы если параноя, то можно помимо текста нарисовать туда пару линий, чтобы было тяжелее распознавать (не то чтобы оно сильно помогло :D)

2008-01-31 в 15:16 

Джей Ди
Всё будет Кока-Кола.
<?
$text=getenv('QUERY_STRING');
$text=sqrt(base_convert($text,12,10)/3);
if (strlen($text)!=5) exit();
$im=imagecreate(90,40);
$white=imagecolorallocate($im,255,255,255);
imageColorTransparent($im,$white);
imagefill($im,0,0,$white);
$size=24;
$color=imagecolorallocate($im,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));
imageTTFText($im,$size,0,10,30,$color,$_SERVER['DOCUMENT_ROOT'].'/themes/font.ttf',$text);
Header("Content-type: image/png");
ImagePng($im);
ImageDestroy($im);
?>


Мой вариант... любой шрифт на любой картинке...

2008-01-31 в 16:00 

Itsygo
Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
<?
$text=getenv('QUERY_STRING');
$text=sqrt(base_convert($text,12,10)/3);
if (strlen($text)!=5) exit();
$im=imagecreate(90,40);
$white=imagecolorallocate($im,255,255,255);
imageColorTransparent($im,$white);
imagefill($im,0,0,$white);
$size=24;
$color=imagecolorallocate($im,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));
imageTTFText($im,$size,0,10,30,$color,$_SERVER['DOCUMENT_ROOT'].'/themes/font.ttf',$text);
Header("Content-type: image/png");
ImagePng($im);
ImageDestroy($im);
?>

Мой вариант... любой шрифт на любой картинке...


гаф! :)

пасиб за наглядный пример.

2008-01-31 в 16:22 

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
Если надо могу привести алгоритм кодирования числа (5 цифр вроде) в код для сценария...
может тогда уже с случайными stringами (вкл числа), чтобы интереснее :)?

2008-01-31 в 17:00 

Джей Ди
Всё будет Кока-Кола.
Itsygo лень было делать, я же не параноик. )
Надеюсь куда кидать картинку и шрифт догадаетесь. )

2008-01-31 в 17:32 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Волчонок Джей

Для того чтобы обойти твою защиту достаточно одного посещения сайта человеком для настройки бота. Вот банальнейший скрипт который регистрирует пользователя в обход твоей системы. Если его поставить в цикл... Вобщем сам понимаешь - ничего хорошего.
<?
$url 
"www.stroigid.com";

$lol fsockopen($url80$errno$errstr30);

$post "next=1";
$len strlen($post);

$out "POST /new_contractor.php HTTP/1.1 \r\n";
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)\r\n";
$out .= "Referer: www.stroigid.com/new_contractor.php\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Host: $url\r\n";
$out .= "Content-Length: $len\r\n\r\n";

$out .= "$post\r\n";

fputs($lol$out);

$сoоkiе "";
while (!
feof($lol)) {
   
$line fgets($lol128);
    if (
$line == "\n")
        break;

    if (!(
strpos($line"Set-coоkie:") === false)) {
       
$сoоkiе .= trim(substr($linestrlen("Set-coоkie:"), strpos($line";") - strlen
           
("Set-coоkie:") + 1));

    }
}

$сoоkiе str_replace("\n"""$сoоkiе);
fclose($lol);

$lol fsockopen($url80$errno$errstr30);

$post 'contractor[company]=Test&contractor[name]=Test&contractor[adress]=&contractor[phone_code]=017&contractor[phone]=7777777&contractor[secred_code]=183530410&contractor[code]=15566&next=1';

$len strlen($post);

$out "POST /new_contractor.php HTTP/1.1 \r\n";
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)\r\n";
$out .= "Referer: www.stroigid.com/new_contractor.php\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Host: $url\r\n";
$out .= "сoоkiе: $сoоkiе\r\n";
$out .= "Content-Length: $len\r\n\r\n";

$out .= "$post\r\n";

fputs($lol$out);

while (!
feof($lol))
    echo 
fgets($lol128);
fclose($lol);
?>

2008-01-31 в 17:36 

Джей Ди
Всё будет Кока-Кола.
FVA знаю. ) Именно по этому я не изменял данный скрипт (скрипту 3 года) по уходу с этой фирмы.
Текущие версии работают через сессии. Модернизировать можете сами, тут главный принцип вывода.

P.S. Круто, их нынешний програмист даже не додумался изменить код, хотя я указывал на это место. XDDDD

2008-01-31 в 17:39 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Волчонок Джей Нет, тема-то как раз не о принципах вывода, а об уровне безопасности. =) Совершенно не важно ЧТО выводить, вопрос в том КАК скрыть реальное значение от различных вариантов обхода. =)

2008-01-31 в 17:56 

Джей Ди
Всё будет Кока-Кола.
FVA я банально использую сессии... о их краже пока не слышал, поэтому сплю спокойно.

2008-01-31 в 18:08 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Волчонок Джей Аналогично, но это не для всех "банально" =)

2008-01-31 в 18:23 

Itsygo
Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
FVA,

я так понял главная претензия к

$text=getenv('QUERY_STRING');
$text=sqrt(base_convert($text,12,10)/3);


:P? так это никто и не будет пользовать :)



2008-01-31 в 18:49 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Itsygo Нет, претензия не к алгоритму вычисления строки из кода, а то что связка секретный код->строка всегда одинаковая и сам секретный код передается в форме, что позволяет его подменить. Это приводит к тому, что достаточно знать всего одну свзяку код-строка, чтобы полностью обойти систему.

2008-02-01 в 10:53 

Itsygo
Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
Нет, претензия не к алгоритму вычисления строки из кода, а то что связка секретный код->строка всегда одинаковая и сам секретный код передается в форме, что позволяет его подменить. Это приводит к тому, что достаточно знать всего одну свзяку код-строка, чтобы полностью обойти систему.

input type="hidden" name="contractor[secred_code]" value=
понятненько, т.е мона просто сабмитить value и соотв. код c картинки.

мдя. не заметил, скроля код, который ты запостил (точнее было влом скролить).

cпасибо.

з.ы а session эт через печеньки?

2008-02-01 в 11:10 

Джей Ди
Всё будет Кока-Кола.
Itsygo нет, сессии храняться на сервере и доступ к ним имеет только сценарий к которому обращается юзверь.

2008-02-01 в 11:32 

Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
гм, а примера нет (я так понял на большинстве форумов SID стринг в строке это UID/PK сессии, a инфа о сессии на серваке в бд)?

2008-02-01 в 12:36 

FVA
Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Почитать:
сессии

2008-02-02 в 03:24 

Itsygo
Geza Anda pl Mozart-PC 21 in CM K467-I Allegro Maestoso[13:54].flac
Почитать:
сессии


sps

     

@web-программирование

главная