Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Много капч на одной странице. 
:(
    Опции темы
ksnk
Дата 16.7.2013, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

Понятно, что такая схема не работает с большим количеством капч на странице, если картинки разные, так что мне пришлось магическим образом ставить одну и ту же картинку на все формы страницы. Заказчик остался доволен, хотя осадочек остался...

Что хочется:
Чтобы у каждой из множества форм на странице была своя картинка капчи.
Чтобы имелась возможность несколько раз открыть форму логина и заполнить ЛЮБУЮ из открытых форм. Пример - форма логина расположена на каждой странице сайта, юзер понаоткрывал несколько вкладок и внезапно решил на какой-то залогиниться. 

Желательно, чтобы при обновлении страницы капча не обновлялась, а только по кнопке "обновить капчу". Просто для экономии рессурсов сервера.

Если есть идеи, который отличаются от предложенных ниже, можно на пальцах, или несложным кодом объяснить мне как такое можно сделать. Если у кого есть готовый, пусть и не совсем рабочий smile пример, буду рад посмотреть, писать все равно буду сам...

пока видится такое решение:
  •  при генерации формы с капчей генерируется уникальное многобуквенное значение YYY, которое передается скрытым полем в форму.
  •  запрос капчи идет по адресу /images/captcha_YYY.png. В случае, если картинки нет - перенаправляем htaccess'ом на капче-построитель, который построит нужную нам картинку.
  •  В сессии при построении картинок формируется массив из значений YYY=>`слово, которое написано на капче`, слово случайно генерируется построителем.
  •  При проверке формы, по значению YYY получаем нужное слово и сравниваем его с вводом пользователя.

Дополнительные проблемы. Ненужные картинки капчи требуется периодически удалять. По идее, время жизни картинок не более времени жизни сессии, 10-20 минут, что значительно упрощает логику этого процесса.

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

Вероятно, при работе с капчей можно отказаться от сессии. Можно не открывать сессию для юзеров, которые не желают авторизоваться. Хранить информацию о запрошенных капчах и словах разумно в базе. И ключи генерировать уникальные проще, если приписывать к случайному мусору ID записи в хвост, и следить за временем порчи картинок.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 16.7.2013, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(ksnk @  16.7.2013,  11:25 Найти цитируемый пост)
при генерации формы с капчей генерируется уникальное многобуквенное значение YYY, которое передается скрытым полем в форму.

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


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Arantir
Дата 16.7.2013, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Что-то не совсем понял, как это без сессий получится.
Если нет сессии, то между двумя запросами нет связи. Каждое обновление, как новый посетитель. А вы говорите:
Цитата(ksnk @  16.7.2013,  10:25 Найти цитируемый пост)
Желательно, чтобы при обновлении страницы капча не обновлялась, а только по кнопке "обновить капчу". Просто для экономии рессурсов сервера.


Цитата(ksnk @  16.7.2013,  10:25 Найти цитируемый пост)
Хранить информацию о запрошенных капчах и словах разумно в базе.

С таким успехом можно и сессию, собственно, в базе хранить. Просто открывать для гостей пустые сессии (без авторизационных данных). Зато к каждому отдельному посетителю можно что-то прикрепить, например, каптчу.


Ну, в целом, вариант "токен  => слово" с передачей токена в форму — самый непосредственный (без заморочек). 


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
ksnk
Дата 16.7.2013, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Arantir @  16.7.2013,  12:26 Найти цитируемый пост)
Если нет сессии, то между двумя запросами нет связи. Каждое обновление, как новый посетитель.

В общем, да, без сессии не получается. 
Решением, вероятно, будет хранение в сессии значений YYY с привязкой к имени формы (уникально на странице и, при необходимости, по всему сайту). При попытке ввода капчи с таким YYY будем его сбрасывать, чтобы перебор на разных вкладках не срабатывал. Так получится, что для одинаковых форм будет выводится одна и та же капча, при обновлении, выводится она же, при попытке неправильного ввода, при обновлении вкладок выведется другая... Вроде пока получается. 
Вечером, возможно, доберусь и до  кода. smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 18.7.2013, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Добрался до кода. При ближайшем рассмотрении моих привычек и имеющихся проектов, оказалось, что каждая форма УЖЕ имеет свой уникальный идентификатор - имя. Как правило, форма генерируется плагином с уникальным иенем, а внутри плагина все формы перечтены, и имена у них уже есть. Так что придумывать еще одно уникальное значение не нужно, да и сохранять его в скрытом поле не всегда необходимо, только чтобы отличать одну форму от другой, если больше никак...

Таким образом, решение сейчас выглядит так - класс $captcha=new captcha(`имя формы`).
  • reset() - сброс текущей капчи для формы с этим именем.
  • clearOldFiles() - очистка всех старых картинок капч.
  • fileName() - выдать имя файла картинки с капчей.
  • is_correct(`значение пользователя`) - сравнить введенную капчу с сохраненным значением.
  • createImage() - выдать на улицу сгенерированную картинку. C нужными заголовками.
При генерации формы с капчей нужно запросить имя файла и вмонтировать его в картинку. Имя файла выглядит как `captcha_XXX_YYY.png`, где XXX - crc32 от комбинации имени формы и ID сессии, YYY - time() от времени генерации записи о картинке. Пример - .../test.captcha/captcha_3393001107_1374108457.png

При проверке введенных данных, вызывается is_correct, при этом сама капча безусловно сбрасывается.

При запросе картинки, если в сессии нет записи с индексом XXX, выводим 404, значит откуда  то всплыли старые ссылки. Если нет картинки с нужным адресом - генерируем ее и read_file'ом выдаем юзеру. Остальные ссылки на эте картинку будут либо перехватываться htaccess'ом, либо будем отдавать уже готовый файл.

Код, в принципе, готов. Нужно только причесать и воткнуть в живой проект.

Это сообщение отредактировал(а) ksnk - 18.7.2013, 07:50


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 18.7.2013, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



ksnk, а чем тебе мешала одинаковая капча на всех формах?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 18.7.2013, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Соображения, больше, эстетскго плана.

Вообще-то да, можно выводить одну и ту же капчу на все формы сайта и сбрасывать ее при попытке ввода юзера. Но так получится, что несколько разных форм на разных вкладках невозможно будет заполнить одну за другой. Тоесть юзер полез на страницу 1, открыл параллельно страницу 2, заполнил форму на странице 1 и на второй странице у него сразу оказалась невалидная капча.

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

То есть, более правильно, imho, привязывать капчу к форме, а не к сайту.

Это сообщение отредактировал(а) ksnk - 18.7.2013, 11:57


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 18.7.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(ksnk @  18.7.2013,  11:56 Найти цитируемый пост)
 и на второй странице у него сразу оказалась невалидная капча.

типичный случай на большинстве сайтов


Цитата(ksnk @  18.7.2013,  11:56 Найти цитируемый пост)
. А вот с разными формами, 

Не вижу принципиальной разницы. Чем эта же форма открытая во второй вкладке отличается от другой формы, открытой в 3й вкладке?

Цитата(ksnk @  18.7.2013,  11:56 Найти цитируемый пост)
привязывать капчу к форме, а не к сайту.

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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 18.7.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Fortop @  18.7.2013,  12:15 Найти цитируемый пост)
Не вижу принципиальной разницы. Чем эта же форма открытая во второй вкладке отличается от другой формы, открытой в 3-й вкладке?

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

Изначально возникло 2 желания.
- Иметь разные картинки капчи на разных формах на одной странице.
- не менять капча-картинки при обновлении страницы.

Осмысленность этих желаний - обсуждается. smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 18.7.2013, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(ksnk @  18.7.2013,  14:13 Найти цитируемый пост)
форму можно заполнять только один раз

добавить товар? smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 18.7.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Fortop @  18.7.2013,  16:13 Найти цитируемый пост)
добавить товар?

Добавить товар - без капчи везде, так что не защитывается.  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 18.7.2013, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



ок, провести платеж


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 18.7.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ну, это убедительнее, но есть и возражения.

Где проводим и кто? В админке нету капчи, так что про что это? юзер с сайта оформляет заказ на накликанный в корзинку товар? При этом открыл корзинку в нескольких вкладках? imho, очень разумно будет не позволить ему оформить заказ и не позволить оплатить его еще раз с соседней вкладки.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 18.7.2013, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Да не, просто комунальный платеж
Свет. вода, газ.

Или оплата поставщику 1,2,3.
Не из корзины

Добавлено через 13 секунд
а вообще о чем мы сейчас рассуждаем? smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 19.7.2013, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Fortop @  18.7.2013,  21:24 Найти цитируемый пост)
Да не, просто комунальный платеж
Свет. вода, газ.

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

Или есть какой реальный пример?

Цитата(Fortop @  18.7.2013,  21:24 Найти цитируемый пост)
а вообще о чем мы сейчас рассуждаем?  

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

В качестве конкурирующих схем идут
- каждая форма всегда имеет валидную капчу. Немного более затратна по рессурсам (больше слов хранить в сессии), на каждой новой вкладке с той же формой будет новая картинка.
- одна капча на весь сайт. Первая введенная капча валидна, остальные открытые капчи автоматически тухнут. Ну, это чтобы выбор был из 3-х и боле кандидатов  smile 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.