Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Мой аналог каптче
 
 автор: sl1p   (06.04.2010 в 14:08)   письмо автору
 
 

Возможно велосипед так как читал про это в нете, но решил сделать сам.
Посмотрите пожалуйста, есть ли какието уязвимости и как может выиграть здесь каптча?

<?php
class pseudo_form {
        
        private 
$sessionName "_pseudoform";
        
    function 
__construct() {
        if(
session_id() == '') {
            
session_start();
        }
        if(
$_POST) {
            if(
$_SESSION[$this->sessionName]) {
                foreach(
$_SESSION[$this->sessionName] as $a => $b) {
                    unset(
$_POST[$a]);
                    if(isset(
$_POST[$b])) {
                        
$_POST[$a] = $_POST[$b];
                        unset(
$_POST[$b]);
                    }
                }
            } else {
                
$_POST = array(); # тут пока не решил как фиксить, это если робот и сессия не работает, тогда чистим к чертовой матери массив.
            
}
        } else {
            
$_SESSION[$this->sessionName] = array();
        }
    }
    
    private function 
nameGen($name) {
        return 
$_POST && isset($_SESSION[$this->sessionName][$name])? $_SESSION[$this->sessionName][$name] : uniqid(md5($name));
    }
    
    function 
setName($fieldName) {
        return 
$_SESSION[$this->sessionName][$fieldName] = $this->nameGen($fieldName);
    }
    
}

# example
$pf = new pseudo_form();
echo 
'<form method=post>
<input type=text name="'
.$pf->setName("msg").'">
<input type=submit name="'
.$pf->setName("submit").'">
</form>'
;

## генерим уникальные имена полей, на выходе получаем обычный массив $_POST.
## тобишь setName("msg") на выходе будет $_POST['msg'];
?>

Подскажите, возможно ли както более корректно написать код если отсутствует сессия(не включены куки)? В данном случае просто чистится массив $_POST так как у роботов не включены куки, но так может произойти и с обычным пользователем.

если такой способ Вам интересен, лучше каптчи, попробую доделать в нём возможность использования массивов в именах.

  Ответить  
 
 автор: Лена   (06.04.2010 в 15:24)   письмо автору
 
   для: sl1p   (06.04.2010 в 14:08)
 

Стартовать сессию в конструкторе я бы не стала.
Если до создания экземпляра объекта будет вывод html, идея не сработает.
Или если этот файл подключается к основному файлу, где уже стартовала сессия, выдаст notice.

Нет проверки $_POST на пустоту и допустимые символы, здесь подошли бы исключения(try/throw/catch).

>## генерим уникальные имена полей, на выходе получаем обычный массив $_POST.
>## тобишь setName("msg") на выходе будет $_POST['msg'];

Извините, я не совсем поняла идею.
Какая мне разница, будет имя поля формы уникальным или нет, если на сервер все равно
поступает value формы? Чем это лучше того, когда пользователь руками вбивает цифры на капче?
Еще одно. Когда пользователь руками вбивает капчу - цифры, буквы и другие алгоритмы - форма вообще не отправляется на сервер, если цифры(буквы), введенные пользователем не совпали.
У вас же данные, как я поняла, все равно отправляются...
Или я чего-то недопоняла...

  Ответить  
 
 автор: sl1p   (06.04.2010 в 15:38)   письмо автору
 
   для: Лена   (06.04.2010 в 15:24)
 

Если до создания экземпляра объекта будет вывод html, идея не сработает.
Ну это какбы траблы пользователя :) Можно уже не полениться и засунуть код до вывода.

Или если этот файл подключается к основному файлу, где уже стартовала сессия, выдаст notice.
Есть проверка, стартовала сессия или нет.

Нет проверки $_POST на пустоту и допустимые символы, здесь подошли бы исключения(try/throw/catch).
Зачем? Это дело другого скрипта. Этот скрипт лишь защищает от роботов(спама), генерируя каждый раз новые имена полей.

Чем это лучше того, когда пользователь руками вбивает цифры на капче?
Ответ в Вашем вопросе..

Еще одно. Когда пользователь руками вбивает капчу - цифры, буквы и другие алгоритмы - форма вообще не отправляется на сервер
Каким это образом она не отправляется? Как же Вы будете проверять тогда "цифры, буквы и другие алгоритмы"?

--------------------------------------------

Возможно вы не правильно поняли задачи скрипта.. Многие роботы ищут страницы с формами, подбирают имена полей, чаще всего это например: "message, submit, name, email и т.д." Скрипт же выводит в ХТМЛ название поля по типу "c79bdf421714f5087fc34b7c538b68074bb b1ab3458a7", чего робот распознать не сможет, и подстроиться под форму не сможет так же, потому что имя постоянно меняется.

  Ответить  
 
 автор: Лена   (06.04.2010 в 16:50)   письмо автору
 
   для: sl1p   (06.04.2010 в 15:38)
 

>Ну это какбы траблы пользователя :) Можно уже не полениться и засунуть код до вывода.
Звучит как "все побочные проблемы при использовании скрипта меня не волнуют" :)

>Есть проверка, стартовала сессия или нет.

Например.
В одном из файлов, который подключаеся выше файла с классом, сессия стартует.
session_start();
И далее вы создаете свой объект:
$pf = new pseudo_form();

У вас идентификатор сессии уже не пустой, потому как сессия стартовала выше.
А вы проверяете его на пустоту:
if(session_id() == '') {
session_start();
}


>Нет проверки $_POST на пустоту и допустимые символы, здесь подошли бы

>исключения(try/throw/catch).
>Зачем? Это дело другого скрипта. Этот скрипт лишь защищает от роботов(спама), генерируя
>каждый раз новые имена полей.
Ошибки лучше обрабатывать по месту. Замучаетесь искать ошибки.
Если это дело другого скрипта/класса, у вас же нет внутри вашего класса вызова метода другого класса, который занимается обработкой ошибок...

>Чем это лучше того, когда пользователь руками вбивает цифры на капче?
>Ответ в Вашем вопросе..
Понятно. Капча для ленивых :)

>Возможно вы не правильно поняли задачи скрипта..
Это я поняла. Просто вместе с роботами, вы запутываете и себя... Если форма большая и поля одного типа(напр. text), попробуй потом в исходном коде разберись, какое поле к чему принадлежит. Может, лучше сделать, чтобы поля в форме выглядели как name_c79bdf421714f5087fc34b7c538b68074bb b1ab3458a7

  Ответить  
 
 автор: sl1p   (06.04.2010 в 17:22)   письмо автору
 
   для: Лена   (06.04.2010 в 16:50)
 

Может, лучше сделать, чтобы поля в форме выглядели как name_c79bdf421714f5087fc34b7c538b68074bb b1ab3458a7
Это будет легко пропарсить.
+смысл исходного кода? В самом же коде видно где что.

Ошибки лучше обрабатывать по месту. Замучаетесь искать ошибки.
Если это дело другого скрипта/класса, у вас же нет внутри вашего класса вызова метода другого класса, который занимается обработкой ошибок...

Это тоже самое что данные пришли бы просто так, поэтому проверка на ошибки это совсем не дело этого скрипта.


У вас идентификатор сессии уже не пустой, потому как сессия стартовала выше.
А вы проверяете его на пустоту:

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

  Ответить  
 
 автор: sl1p   (06.04.2010 в 19:29)   письмо автору
 
   для: sl1p   (06.04.2010 в 17:22)
 

Скажите пожалуйста, есть ли такой бот, который может непосредственно действовать как браузер? Тоесть не подставлять данные, а именно вроде как нажать на кнопку и всё такое?

Наблюдаю сейчас за статистикой половина обезвреживается,а половина непонятно как проходит..:\

  Ответить  
 
 автор: buldovsky   (06.04.2010 в 19:56)   письмо автору
 
   для: sl1p   (06.04.2010 в 19:29)
 

Для сервера как и для бота не существет никаких "кнопок". Для них существует HTTP протокол со своими методами (GET, POST и тд).

А то чем вы занимаетесь - никак не аналог каптчи даже близко.

  Ответить  
 
 автор: sl1p   (06.04.2010 в 21:21)   письмо автору
 
   для: buldovsky   (06.04.2010 в 19:56)
 

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

  Ответить  
 
 автор: Николай2357   (06.04.2010 в 22:20)   письмо автору
 
   для: sl1p   (06.04.2010 в 21:21)
 

А в чем тут проблема для бота? Получить страницу с формой, спарсить имя элемента и отправить как положено... Это старо как мир и действует только на самых топоглупых ботов.

  Ответить  
 
 автор: sl1p   (06.04.2010 в 23:12)   письмо автору
 
   для: Николай2357   (06.04.2010 в 22:20)
 

ну а как именно он спалит что это поле отвечает за сообщение или за эмейл?

  Ответить  
 
 автор: Trianon   (07.04.2010 в 00:16)   письмо автору
 
   для: sl1p   (06.04.2010 в 23:12)
 

типы элементов формы все равно видны.
Врядли Ваш портал будет передавать e-mail-адрес в textarea, а тело сообщения - в кнопке submit.

  Ответить  
 
 автор: sl1p   (07.04.2010 в 00:49)   письмо автору
 
   для: Trianon   (07.04.2010 в 00:16)
 

да я так и подумал... :)
ну а вдруг я так сделаю :))
тут же не всё стабильно...

вобщем я так понимаю таким спобом не защититься никак?..

  Ответить  
 
 автор: Trianon   (07.04.2010 в 03:44)   письмо автору
 
   для: sl1p   (07.04.2010 в 00:49)
 

Знаете, я тоже подумал,.. но потом посмотрел на тему 72970 в Разном, и решил не отвечать, от греха подальше.

  Ответить  
 
 автор: buldovsky   (07.04.2010 в 08:40)   письмо автору
 
   для: sl1p   (07.04.2010 в 00:49)
 

А если я каким-то образом открыл вашу форму дважды, заметил это и закрыл вторую страницу, при этом в сессии ведь останутся соответствия именно второй страницы и мои данные скрипт не обработает.

Мое мнение - там где надо защититься, спасет сильная каптча, там где сильно захотят запостить и сильная каптча не поможет, так что не майтесь ерундой.

  Ответить  
 
 автор: sim5   (07.04.2010 в 08:56)   письмо автору
 
   для: buldovsky   (07.04.2010 в 08:40)
 

>А если я каким-то образом открыл вашу форму дважды, заметил это и закрыл вторую страницу,
>при этом в сессии ведь останутся соответствия именно второй страницы и мои данные скрипт не обработает.

Ну не обработает и что? Так извините, можно еще и не такие эксперементы от пользователя ожидать, так теперь что спрашивать его "чего еще сударь желаете"? Нехрен открывать лишнего, а открыл, так это его проблемы.

  Ответить  
 
 автор: buldovsky   (07.04.2010 в 10:08)   письмо автору
 
   для: sim5   (07.04.2010 в 08:56)
 

Странно от Вас это слышать, не ожидал.

В моем понимании web-сайт делается для людей, причем для всяких разных. Я знаю очень много людей старшего поколения которые все интернет ссылки на страницах открывают двойным кликом (по аналогии с файлами в windows). Я считаю, если делаешь сайт - делай его рабочим для всех браузеров и для всех людей!

P.S. Ваше право объяснять блондинке или пенсионеру, что письмо которое он набирал двумя указательными пальцами последние тридцать минут, не отправленно потому что у вас в сессии сохранились другие соответствия формы, потому что этот пенсионер или блондинка видите-ли неправильно вашим сайтом пользуется. Хотите объясняйте.

Я конечно понимаю что, вероятно, в вашем понимании web-сайты пишутся для заказщиков, а не для людей... Интересная у вас позиция: "Что это вы тут зашли на мой сайт и тыкаете по два раза?!"

  Ответить  
 
 автор: sim5   (07.04.2010 в 10:16)   письмо автору
 
   для: buldovsky   (07.04.2010 в 10:08)
 

Я могу вам сказать только одно, чем более каждая форма будет индивидуальней, тем лучше.
.
Ну а насчет стариков, так они более воспитанней и терпеливей, и если им объяснить вежливо, то они выполнят так, как их просят, и не делайте упор на несохраненную сессию, это лишь вопрос техники. А вот у "молодняка" завсегда может быть гвоздь в заднице, особливо у шкодников. Впрочем вы сами себе хозяин, можете и по N страниц открывать для пользователя, извиняться перед ним, и подстраиваться под него, это уж не запретить. ;-)

  Ответить  
 
 автор: buldovsky   (07.04.2010 в 10:56)   письмо автору
 
   для: sim5   (07.04.2010 в 10:16)
 

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

  Ответить  
 
 автор: Trianon   (07.04.2010 в 11:02)   письмо автору
 
   для: buldovsky   (07.04.2010 в 08:40)
 

чтобы такой ситуации избежать, можно хранить в сессии не один "сеансовый жетон", а несколько. В массиве.
И гасить их по приходу адекватных имен полей формы.

  Ответить  
 
 автор: buldovsky   (07.04.2010 в 11:12)   письмо автору
 
   для: Trianon   (07.04.2010 в 11:02)
 

Я это прекрасно понимаю. Однако в коде этого нет, о чем я и решил сообщить автору выше.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования