Форма ajax для кросс (под) домена, представленная с капчей - PullRequest
1 голос
/ 27 апреля 2011

Я сталкиваюсь со следующей проблемой. Веб-сайт внешнего интерфейса (www.domain.com) используется для заполнения формы, принадлежащей бэкенду (backend.domain.com). Эта форма защищена с помощью капчи, а эталонное значение для капчи сохраняется в сеансе пользователя (в PHP).

Представление должно быть на основе Ajax, что создает некоторые проблемы с кросс-доменами. Поэтому я написал небольшой прокси PHP на www.domain.com. Этот прокси-сервер запрашивает форму серверной части. Когда пользователь отправляет форму, Ajax-запрос отправляется прокси-серверу, и прокси-сервер отправляет запрос проверки на сервер и возвращает результат.

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

Как лучше всего это исправить? Я придумал 2 метода. Первый - включить ссылку на капчу в форму (хешированную), чтобы сеансы не требовались. Другой способ - включить форму непосредственно из бэкэнда, используя iframe. Этот второй метод, вероятно, будет хорошо работать, но он кажется действительно уродливым. Что бы вы предложили для такой ситуации?

Обновление: диаграмма последовательности, описывающая ситуацию:

Client                  www.domain.com   backend.domain.com
  |                            |                   |
  |-------visit site---------->|                   |
  |                            |-----get form----->|
  |                            |<----return form---|
  |<------return form----------|                   |
  |                            |                   |
  |-------submit form--------->|                   |
  |                            |-----submit form-->|
  |                            |<----send reply----|
  |<------captcha failed-------|                   |
  v                            v                   v

1 Ответ

1 голос
/ 27 апреля 2011

Это похоже на проблему с файлом cookie (или номером сеанса). Набор файлов cookie для сеанса действителен для сайта www, но не для внутреннего сайта. Но так как все общение происходит через ваш интерфейс, не могли бы вы использовать сайт для выполнения авторизации?

Client                  www.domain.com   backend.domain.com
  |                            |                   |
  |-------visit site---------->|                   |
  |                            |--get login form-->|
  |                            |<----return form---|
  |                            |set cookie         |
  |<-return login form+cookie--|                   |
  |                            |                   |
  |----submit login form------>|                   |
  |                            |-----submit form-->|
  |                            |                   |check cookie
  |                            |<----send reply----|
  |<------captcha failed-------|                   |
  v                            v                   v

Сайт www должен устанавливать cookie, так как он связывается с клиентом, но сервер проверяет его - так как cookie установлен для другого домена, сервер не может получить к нему доступ. Решение: www должен прочитать cookie и переслать данные cookie в серверную часть для обработки.

...