2

そうです、ユーザーのサインアップや認証を必要としないサイトの注文フォームを作成しています。フォームには、Order、OrderImage、Printの3つのモデルがあります。注文フォームには多くのOrderImageがあり、OrderImageには多くのプリントがあります。

ユーザーには、注文とともに画像(OrderImage)をアップロードする機能と、注文が確認されて送信される前に各OrderImageに戻って編集する機能が必要です。

フォームは多段階で、次の4つのステージで構成されています。

  1. 画像をアップロードする
  2. アップロードを確認する
  3. あなたの詳細
  4. アップロードの確認

これは問題なく、すべてが計画どおりに機能しており、ユーザーが詳細を入力したり画像をアップロードしたりすると、注文プロセス全体を通じてデータがデータベースに保存されます。

ただし、これは「/ upload?order=5」などのURLが存在することを意味します。これは適切ではありません。認証がないため、これは、誰もが注文のURLを推測して変更できる可能性があることを意味します。

だから私はこのプロセスを管理するための最良の方法は何であるか疑問に思っていますか?私はいくつかのアイデアを念頭に置いていますが、それらのいずれかが問題の最善の解決策であるかどうかはわかりません。

  1. たとえば、URLが「/ upload?order = 645029」のようになるように、6桁以内のランダムな注文番号を生成します。これにより、誰かが注文番号を推測する可能性は低くなりますが、それでも実際にはあまり安全ではありません。

  2. 上記のアイデアを「完了」などの注文のステータスと組み合わせます。したがって、注文が最終的に送信されると、完了としてマークされます。その後、「完了」注文が再度アクセスされるのを防ぐことができます。ただし、注文プロセス中に、注文番号が推測され、改ざんされる可能性があります。

  3. セッションを利用し、注文番号をURLの代わりに、またはフォームの非表示の値としてここに保存します。

ライアン・ベイツがセッションにデータを保存するマルチステップフォームでのRailscastを見てきました。ただし、ライアン自身は、複雑なモデルとオブジェクトをこの方法で格納することは実用的ではないと認めています。

したがって、認証されていない注文フォームを処理するための最良の方法に関する提案をいただければ幸いです。

4

2 に答える 2

0

質問で答えるのは嫌いです...しかし:ユーザーが後でサイトに戻ったときに、どのようにして注文を見つけるのですか?

登録なしで、ユーザーを注文に関連付ける方法を見つける必要があります!。

少なくとも彼に一意のユーザー名を尋ねない限り、どうすればそれを安全に行うことができるかわかりません。

しかし、そうすれば、誰でもこのユーザー名を推測して注文にたどり着くことができます!。

認証が必要ない場合は、他のユーザーが誰かの注文を見るのを気にしないでください。

これが問題になる場合は、単純な形式の認証が必要になります。

于 2011-09-12T15:35:11.113 に答える
0

私はオプション#3で行きます。複雑なオブジェクトをセッションに保存するのは適切ではありませんが、保存する必要があるのは注文のID番号だけで、データベースで検索できます。を使用し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は問題を覆い隠すだけであり、後で拡張するのはおそらくもっと難しいでしょう。

于 2011-09-12T15:53:12.910 に答える