|
|
|
| Возможно велосипед так как читал про это в нете, но решил сделать сам.
Посмотрите пожалуйста, есть ли какието уязвимости и как может выиграть здесь каптча?
<?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 так как у роботов не включены куки, но так может произойти и с обычным пользователем.
если такой способ Вам интересен, лучше каптчи, попробую доделать в нём возможность использования массивов в именах. | |
|
|
|
|
|
|
|
для: sl1p
(06.04.2010 в 14:08)
| | Стартовать сессию в конструкторе я бы не стала.
Если до создания экземпляра объекта будет вывод html, идея не сработает.
Или если этот файл подключается к основному файлу, где уже стартовала сессия, выдаст notice.
Нет проверки $_POST на пустоту и допустимые символы, здесь подошли бы исключения(try/throw/catch).
>## генерим уникальные имена полей, на выходе получаем обычный массив $_POST.
>## тобишь setName("msg") на выходе будет $_POST['msg'];
Извините, я не совсем поняла идею.
Какая мне разница, будет имя поля формы уникальным или нет, если на сервер все равно
поступает value формы? Чем это лучше того, когда пользователь руками вбивает цифры на капче?
Еще одно. Когда пользователь руками вбивает капчу - цифры, буквы и другие алгоритмы - форма вообще не отправляется на сервер, если цифры(буквы), введенные пользователем не совпали.
У вас же данные, как я поняла, все равно отправляются...
Или я чего-то недопоняла... | |
|
|
|
|
|
|
|
для: Лена
(06.04.2010 в 15:24)
| | Если до создания экземпляра объекта будет вывод html, идея не сработает.
Ну это какбы траблы пользователя :) Можно уже не полениться и засунуть код до вывода.
Или если этот файл подключается к основному файлу, где уже стартовала сессия, выдаст notice.
Есть проверка, стартовала сессия или нет.
Нет проверки $_POST на пустоту и допустимые символы, здесь подошли бы исключения(try/throw/catch).
Зачем? Это дело другого скрипта. Этот скрипт лишь защищает от роботов(спама), генерируя каждый раз новые имена полей.
Чем это лучше того, когда пользователь руками вбивает цифры на капче?
Ответ в Вашем вопросе..
Еще одно. Когда пользователь руками вбивает капчу - цифры, буквы и другие алгоритмы - форма вообще не отправляется на сервер
Каким это образом она не отправляется? Как же Вы будете проверять тогда "цифры, буквы и другие алгоритмы"?
--------------------------------------------
Возможно вы не правильно поняли задачи скрипта.. Многие роботы ищут страницы с формами, подбирают имена полей, чаще всего это например: "message, submit, name, email и т.д." Скрипт же выводит в ХТМЛ название поля по типу "c79bdf421714f5087fc34b7c538b68074bb b1ab3458a7", чего робот распознать не сможет, и подстроиться под форму не сможет так же, потому что имя постоянно меняется. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Лена
(06.04.2010 в 16:50)
| | Может, лучше сделать, чтобы поля в форме выглядели как name_c79bdf421714f5087fc34b7c538b68074bb b1ab3458a7
Это будет легко пропарсить.
+смысл исходного кода? В самом же коде видно где что.
Ошибки лучше обрабатывать по месту. Замучаетесь искать ошибки.
Если это дело другого скрипта/класса, у вас же нет внутри вашего класса вызова метода другого класса, который занимается обработкой ошибок...
Это тоже самое что данные пришли бы просто так, поэтому проверка на ошибки это совсем не дело этого скрипта.
У вас идентификатор сессии уже не пустой, потому как сессия стартовала выше.
А вы проверяете его на пустоту:
Ну так, если он пустой тогда сессия уже стартовала и её запускать ненадо, в обратном случае нужно стартовать сессию.. | |
|
|
|
|
|
|
|
для: sl1p
(06.04.2010 в 17:22)
| | Скажите пожалуйста, есть ли такой бот, который может непосредственно действовать как браузер? Тоесть не подставлять данные, а именно вроде как нажать на кнопку и всё такое?
Наблюдаю сейчас за статистикой половина обезвреживается,а половина непонятно как проходит..:\ | |
|
|
|
|
|
|
|
для: sl1p
(06.04.2010 в 19:29)
| | Для сервера как и для бота не существет никаких "кнопок". Для них существует HTTP протокол со своими методами (GET, POST и тд).
А то чем вы занимаетесь - никак не аналог каптчи даже близко. | |
|
|
|
|
|
|
|
для: buldovsky
(06.04.2010 в 19:56)
| | это понятно, я и спрашиваю как некоторые могут пройти, чтобы подставить данные нужно знать имя поля правильно? А имя неизвестно, вот как тогда можно это обойти... | |
|
|
|
|
|
|
|
для: sl1p
(06.04.2010 в 21:21)
| | А в чем тут проблема для бота? Получить страницу с формой, спарсить имя элемента и отправить как положено... Это старо как мир и действует только на самых топоглупых ботов. | |
|
|
|
|
|
|
|
для: Николай2357
(06.04.2010 в 22:20)
| | ну а как именно он спалит что это поле отвечает за сообщение или за эмейл? | |
|
|
|
|
|
|
|
для: sl1p
(06.04.2010 в 23:12)
| | типы элементов формы все равно видны.
Врядли Ваш портал будет передавать e-mail-адрес в textarea, а тело сообщения - в кнопке submit. | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2010 в 00:16)
| | да я так и подумал... :)
ну а вдруг я так сделаю :))
тут же не всё стабильно...
вобщем я так понимаю таким спобом не защититься никак?.. | |
|
|
|
|
|
|
|
для: sl1p
(07.04.2010 в 00:49)
| | Знаете, я тоже подумал,.. но потом посмотрел на тему 72970 в Разном, и решил не отвечать, от греха подальше. | |
|
|
|
|
|
|
|
для: sl1p
(07.04.2010 в 00:49)
| | А если я каким-то образом открыл вашу форму дважды, заметил это и закрыл вторую страницу, при этом в сессии ведь останутся соответствия именно второй страницы и мои данные скрипт не обработает.
Мое мнение - там где надо защититься, спасет сильная каптча, там где сильно захотят запостить и сильная каптча не поможет, так что не майтесь ерундой. | |
|
|
|
|
|
|
|
для: buldovsky
(07.04.2010 в 08:40)
| | >А если я каким-то образом открыл вашу форму дважды, заметил это и закрыл вторую страницу,
>при этом в сессии ведь останутся соответствия именно второй страницы и мои данные скрипт не обработает.
Ну не обработает и что? Так извините, можно еще и не такие эксперементы от пользователя ожидать, так теперь что спрашивать его "чего еще сударь желаете"? Нехрен открывать лишнего, а открыл, так это его проблемы. | |
|
|
|
|
|
|
|
для: sim5
(07.04.2010 в 08:56)
| | Странно от Вас это слышать, не ожидал.
В моем понимании web-сайт делается для людей, причем для всяких разных. Я знаю очень много людей старшего поколения которые все интернет ссылки на страницах открывают двойным кликом (по аналогии с файлами в windows). Я считаю, если делаешь сайт - делай его рабочим для всех браузеров и для всех людей!
P.S. Ваше право объяснять блондинке или пенсионеру, что письмо которое он набирал двумя указательными пальцами последние тридцать минут, не отправленно потому что у вас в сессии сохранились другие соответствия формы, потому что этот пенсионер или блондинка видите-ли неправильно вашим сайтом пользуется. Хотите объясняйте.
Я конечно понимаю что, вероятно, в вашем понимании web-сайты пишутся для заказщиков, а не для людей... Интересная у вас позиция: "Что это вы тут зашли на мой сайт и тыкаете по два раза?!" | |
|
|
|
|
|
|
|
для: buldovsky
(07.04.2010 в 10:08)
| | Я могу вам сказать только одно, чем более каждая форма будет индивидуальней, тем лучше.
.
Ну а насчет стариков, так они более воспитанней и терпеливей, и если им объяснить вежливо, то они выполнят так, как их просят, и не делайте упор на несохраненную сессию, это лишь вопрос техники. А вот у "молодняка" завсегда может быть гвоздь в заднице, особливо у шкодников. Впрочем вы сами себе хозяин, можете и по N страниц открывать для пользователя, извиняться перед ним, и подстраиваться под него, это уж не запретить. ;-) | |
|
|
|
|
|
|
|
для: sim5
(07.04.2010 в 10:16)
| | Ну извиняться перед юзером за его же действия это конечно перебор. Но предусматривать их неординарное поведение, к сожаленью, приходится. | |
|
|
|
|
|
|
|
для: buldovsky
(07.04.2010 в 08:40)
| | чтобы такой ситуации избежать, можно хранить в сессии не один "сеансовый жетон", а несколько. В массиве.
И гасить их по приходу адекватных имен полей формы. | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2010 в 11:02)
| | Я это прекрасно понимаю. Однако в коде этого нет, о чем я и решил сообщить автору выше. | |
|
|
|