2011-09-12 20 views
2

正確的做法是爲不需要任何用戶註冊或驗證的網站訂購表格。該表單有三種模式:Order,OrderImage,Print。訂單表單有許多OrderImage,而OrderImage有許多印刷品。沒有驗證的安全Rails 3 MultiStep訂單表格的最佳方法

用戶需要能夠上傳圖像(OrderImage)與他們的訂單,並且還能夠在確認並提交訂單之前返回並編輯每個OrderImage。

形式是多級和由四個階段組成:

  1. 上傳圖片
  2. 審查上傳
  3. 您的詳細
  4. 確認上傳

這是好的,一切都按照計劃進行工作,並在用戶輸入更多詳細信息或上傳mo時將數據存儲到整個Order流程的數據庫中重新圖像。

但是,這意味着存在URL,例如「/ upload?order = 5」,這是不好的。由於沒有身份驗證,這意味着任何人都可能猜測訂單的URL並更改它。

所以我只是想知道管理這個過程的最佳方式是什麼?我有一對夫婦的心中的想法,但不知道是否任何人都對這個問題的最佳解決方案:

  1. 生成6位數字,例如內的隨機順序號這樣的URL會更喜歡:「/ upload?order = 645029」。這會導致有人猜測訂單號的機會減少,但實際上還不是很安全。

  2. 將上述想法與訂單狀態相結合,如「完成」。所以當一個訂單最終提交時,它被標記爲完整。然後,我可以防止再次訪問任何「完成」訂單。然而,在訂單流程中,訂單號仍然可能被猜測和篡改。

  3. 使用會話並將訂單號存儲在此處而不是存儲在URL中,或作爲表單中的隱藏值。

我看過Ryan Bates的Railscast在Multistep窗體中存儲數據的過程。然而,瑞恩自己承認以這種方式存儲複雜的模型和對象是不實際的。

因此,有關處理未經驗證的訂單表單的最佳方式的任何建議將非常感謝,謝謝。

回答

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只是掩蓋了問題,並且稍後可能更難以延伸。

+0

順便說一句,如果你使用這個例子,小心類型。 'params [:id]'很可能是一個字符串,'session [:current_order_id]'可能是一個字符串或整數。 – David

0

我討厭回答一個問題......但是:用戶在以後回到網站時如何找到他的訂單?

沒有註冊,你必須找到一種方法來將用戶與訂單相關聯!

我看不出你如何安全地做到這一點,至少向他詢問一個唯一的用戶名。

但是,然後,任何人都可以猜到這個用戶名,並得到命令!

我會說,如果你不想認證...那麼你不應該在意其他用戶看到任何人的命令!

如果這是一個問題,您將需要一種簡單的身份驗證方式。

+0

用戶在提交訂單後無需訪問訂單。一旦提交,訂單就會離線處理和開票。 – Pete

+0

@ Cygnusx1,用戶在提交它們後可以訪問他們的訂單似乎並不是一種要求,但通過電子郵件向用戶發送帶有生成的訪問令牌的鏈接,例如'/ orders/42?access_token = 988881adc9fc3655077dc2d4d757d480b5ea0e11'。 – David

+0

確定我錯過了我的想法..:「並且還能夠在訂單確認並提交之前返回並編輯每個OrderImage。」我明白用戶可以回來改變他的訂單!但我想你們都想在一次會議中做到這一點? – Cygnusx1