Лучший подход для безопасной формы заказа Rails 3 MultiStep без аутентификации - PullRequest
2 голосов
/ 12 сентября 2011

Правильно, я создаю форму заказа для сайта, который не требует какой-либо регистрации пользователя или аутентификации. Форма имеет три модели: Order, OrderImage, Print. Форма заказа имеет много OrderImage и OrderImage имеет много отпечатков.

Пользователю требуется возможность загружать изображения (OrderImage's) со своим заказом, а также возможность вернуться и редактировать каждый OrderImage до подтверждения и отправки Заказа.

Форма многоступенчатая и состоит из четырех этапов:

  1. Загрузить изображения
  2. Обзор загрузок
  3. Ваши данные
  4. Подтверждение загрузки

Это нормально, и все работает как запланировано, и данные сохраняются в базе данных на протяжении всего процесса заказа, когда пользователь вводит больше деталей или загружает больше изображений.

Однако это означает, что существуют такие URL, как "/ upload? Order = 5", что не очень хорошо. Поскольку аутентификация отсутствует, это означает, что любой может угадать URL-адрес заказа и изменить его.

Так что мне просто интересно, как лучше всего управлять этим процессом? Я имею в виду пару идей, но не уверен, является ли какая-либо из них лучшим решением проблемы:

  1. Создайте случайный номер заказа, например, из 6 цифр, чтобы URL был больше похож на: "/ upload? Order = 645029". Это приведет к снижению вероятности того, что кто-то угадает номер заказа, но на самом деле все еще не очень надежно.

  2. Объединение вышеприведенной идеи со статусом в заказе, например, «Завершено». Поэтому, когда ордер окончательно отправлен, он помечается как завершенный. Тогда я мог бы предотвратить повторный доступ к любым «завершенным» заказам. Однако во время процесса заказа номер заказа все еще можно угадать и изменить.

  3. Использование сеанса и сохранение номера заказа здесь, а не в URL или в качестве скрытого значения в форме.

Я наблюдал за Railscast Райана Бейтса на многоступенчатых формах, в которых он хранит данные в сеансе. Однако сам Райан признает, что хранить сложные модели и объекты таким образом нецелесообразно.

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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

Я бы выбрал вариант № 3. Вы правы, что нехорошо хранить сложные объекты в сеансе, но все, что вам нужно сохранить, это идентификационный номер заказа, тогда вы можете найти его в базе данных. Вы можете использовать before_filter, чтобы гарантировать, что запрошенный заказ принадлежит текущему пользователю:

class OrdersController < ApplicationController
  before_filter :check_ownership, :except => [:new, :create]

  private

  def check_ownership
    redirect_to '/' unless params[:id] == session[:current_order_id]
  end
end

Этот пример может быть легко расширен позже, чтобы пользователи с аккаунтами могли просматривать историю своих заказов (а не только текущий заказ). Опции # 1 и # 2 только маскируют проблему, и, вероятно, их будет сложнее расширить позже.

0 голосов
/ 12 сентября 2011

Я не хочу отвечать на вопрос ... но: Как пользователь находит свой заказ, когда он возвращается на сайт позже?

Без регистрации вы должны найти способ связать пользователяс заказом!

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

Но тогда любой мог бы угадать это имя пользователя и получить заказ!.

Я бы сказал, если вы не хотите аутентификацию ... тогда вам не нужно, чтобы другие пользователи видели чьи-либо приказы!

Если это проблема, вам понадобитсяпростая форма аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...