![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Внезапно потребовалось на одной страничке разместить несколько несвязанных друг с другом форм, каждая из которых защищена капчей.
Капча формируется одним и тем-же скриптом, который просто складывает в сессию текущее сгенерированное значение и при проверке ввода юзера тупо сравнивается введённые цифры с сессионными. Понятно, что такая схема не работает с большим количеством капч на странице, если картинки разные, так что мне пришлось магическим образом ставить одну и ту же картинку на все формы страницы. Заказчик остался доволен, хотя осадочек остался... Что хочется: Чтобы у каждой из множества форм на странице была своя картинка капчи. Чтобы имелась возможность несколько раз открыть форму логина и заполнить ЛЮБУЮ из открытых форм. Пример - форма логина расположена на каждой странице сайта, юзер понаоткрывал несколько вкладок и внезапно решил на какой-то залогиниться. Желательно, чтобы при обновлении страницы капча не обновлялась, а только по кнопке "обновить капчу". Просто для экономии рессурсов сервера. Если есть идеи, который отличаются от предложенных ниже, можно на пальцах, или несложным кодом объяснить мне как такое можно сделать. Если у кого есть готовый, пусть и не совсем рабочий пока видится такое решение:
Дополнительные проблемы. Ненужные картинки капчи требуется периодически удалять. По идее, время жизни картинок не более времени жизни сессии, 10-20 минут, что значительно упрощает логику этого процесса. Недостатком видится использование htaccess. Просто из эстетских соображений, чтобы не умножать сущьности. Вероятно, при работе с капчей можно отказаться от сессии. Можно не открывать сессию для юзеров, которые не желают авторизоваться. Хранить информацию о запрошенных капчах и словах разумно в базе. И ключи генерировать уникальные проще, если приписывать к случайному мусору ID записи в хвост, и следить за временем порчи картинок. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
лично я за этот вариант. можно делать чертову кучу форм с капчами и между ними не будет зависимостей. -------------------- Amazing |
|||
|
||||
| Arantir |
|
|||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 16 Всего: 55 |
Что-то не совсем понял, как это без сессий получится.
Если нет сессии, то между двумя запросами нет связи. Каждое обновление, как новый посетитель. А вы говорите:
С таким успехом можно и сессию, собственно, в базе хранить. Просто открывать для гостей пустые сессии (без авторизационных данных). Зато к каждому отдельному посетителю можно что-то прикрепить, например, каптчу. Ну, в целом, вариант "токен => слово" с передачей токена в форму — самый непосредственный (без заморочек). -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
В общем, да, без сессии не получается. Решением, вероятно, будет хранение в сессии значений YYY с привязкой к имени формы (уникально на странице и, при необходимости, по всему сайту). При попытке ввода капчи с таким YYY будем его сбрасывать, чтобы перебор на разных вкладках не срабатывал. Так получится, что для одинаковых форм будет выводится одна и та же капча, при обновлении, выводится она же, при попытке неправильного ввода, при обновлении вкладок выведется другая... Вроде пока получается. Вечером, возможно, доберусь и до кода. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Добрался до кода. При ближайшем рассмотрении моих привычек и имеющихся проектов, оказалось, что каждая форма УЖЕ имеет свой уникальный идентификатор - имя. Как правило, форма генерируется плагином с уникальным иенем, а внутри плагина все формы перечтены, и имена у них уже есть. Так что придумывать еще одно уникальное значение не нужно, да и сохранять его в скрытом поле не всегда необходимо, только чтобы отличать одну форму от другой, если больше никак...
Таким образом, решение сейчас выглядит так - класс $captcha=new captcha(`имя формы`).
При проверке введенных данных, вызывается is_correct, при этом сама капча безусловно сбрасывается. При запросе картинки, если в сессии нет записи с индексом XXX, выводим 404, значит откуда то всплыли старые ссылки. Если нет картинки с нужным адресом - генерируем ее и read_file'ом выдаем юзеру. Остальные ссылки на эте картинку будут либо перехватываться htaccess'ом, либо будем отдавать уже готовый файл. Код, в принципе, готов. Нужно только причесать и воткнуть в живой проект. Это сообщение отредактировал(а) ksnk - 18.7.2013, 07:50 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
ksnk, а чем тебе мешала одинаковая капча на всех формах?
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Соображения, больше, эстетскго плана.
Вообще-то да, можно выводить одну и ту же капчу на все формы сайта и сбрасывать ее при попытке ввода юзера. Но так получится, что несколько разных форм на разных вкладках невозможно будет заполнить одну за другой. Тоесть юзер полез на страницу 1, открыл параллельно страницу 2, заполнил форму на странице 1 и на второй странице у него сразу оказалась невалидная капча. В моем теперешнем случае, конечно, юзер может открыть одну и ту же форму несколько раз и на следующей вкладке у него появится возможность потупить, но тут есть оправдание, типа уже раз форма заполнялась... А вот с разными формами, оправдания не так убедительно звучат. То есть, более правильно, imho, привязывать капчу к форме, а не к сайту. Это сообщение отредактировал(а) ksnk - 18.7.2013, 11:57 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
типичный случай на большинстве сайтов Не вижу принципиальной разницы. Чем эта же форма открытая во второй вкладке отличается от другой формы, открытой в 3й вкладке? Это сугубо мое личное мнение, но капчу стоит привязывать к открытой странице тогда таких проблем не будет. (т.е. если мы открываем эту же страницу в другой вкладке - там своя капча не влияющая на первую) А отправить 15ть форм с одной страницы (не аяксом) ты не сможешь. Т.е. капча может быть одна на всю страницу. К форме привязывать ее нужно только если используешь аякс. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Вроде как, в реальности, обычно, форму можно заполнять только один раз. Ну, типа, отослать рекламацию, зарегистрироваться, откоментировать запись, проголосовать. Та же самая форма на том же месте уже не должна корректно работать в таких случаях, только после обновления. С такой капчей она и не будет. Хотя, конечно, такой контроль не стоит полностью переваливать на постороннюю капчу, не очень спортивно... Изначально возникло 2 желания. - Иметь разные картинки капчи на разных формах на одной странице. - не менять капча-картинки при обновлении страницы. Осмысленность этих желаний - обсуждается. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Добавить товар - без капчи везде, так что не защитывается. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
ок, провести платеж
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Ну, это убедительнее, но есть и возражения.
Где проводим и кто? В админке нету капчи, так что про что это? юзер с сайта оформляет заказ на накликанный в корзинку товар? При этом открыл корзинку в нескольких вкладках? imho, очень разумно будет не позволить ему оформить заказ и не позволить оплатить его еще раз с соседней вкладки. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
Да не, просто комунальный платеж
Свет. вода, газ. Или оплата поставщику 1,2,3. Не из корзины Добавлено через 13 секунд а вообще о чем мы сейчас рассуждаем? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Это действие тоже как бы не случайно. Юзер заходит в банковский клиент и там уже выбирает нужные счет для оплаты. Чем не админка? Без регистрации такое никому позволить нельзя, так что форма регистрации уже была, капча не нужна. Или есть какой реальный пример? Я пытаюсь убедить себя, что выбранная сейчас схема работы с капчей (капча жестко закрепляется за формой) разумна и ее можно везде применять. В принципе, я пока в этом себя благополучно убеждаю В качестве конкурирующих схем идут - каждая форма всегда имеет валидную капчу. Немного более затратна по рессурсам (больше слов хранить в сессии), на каждой новой вкладке с той же формой будет новая картинка. - одна капча на весь сайт. Первая введенная капча валидна, остальные открытые капчи автоматически тухнут. Ну, это чтобы выбор был из 3-х и боле кандидатов -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |