2016-06-27 102 views
0

我正在Rails中進行基於在線計算機的測試。每個問題都有一個形式爲/questions/<id>的頁面網址。
每個問題的頁面上都有一個「下一個」按鈕,指向下一個問題,如/questions/<another-id>。我不希望用戶手動輸入任何問題的網址並轉到該頁面。
有什麼辦法可以實現這一點,最好是服務器端解決方案。如何限制對rails中頁面的訪問,除非用戶通過特定頁面的鏈接來訪問?

+0

作爲一個簡單的(但不是非常安全的)解決方案,你可能有「下一步」按鈕來提交表單(也許是空的),並且只允許/ questions/id路徑在POST中可用而不是GET?這種方式輸入URL將不會工作,因爲它會導致GET請求。 –

回答

2

我對你有一個服務器端解決方案可能是將解決你的問題如下說明如下......

  1. 假設,你有一個固定的鏈接,用戶可以開始測試。

  2. 一旦用戶開始測試,然後添加問題-ID到會話像下面...

    會話[:電流問題-ID] =參數[:question_id]

  3. 總是檢查下一個問題ID增加一個sesssion問題ID,如果匹配,然後顯示問題或不做任何重定向回。

該解決方案將工作,如果你有問題的序列,如1,2,3 ... n。

4

您可以使用:

Friendly ID Gem,這將你的ID轉換成團狀,從而使最終用戶無法確定究竟是傳遞到URL參數。

1

有點像巴拉特瑞裏:

就可以構建結合你的問題Id和連接到用戶會話的隨機數建立了一個ID的URL。

您可以使用SHA1(或您選擇的算法)組合這兩個值。例如:

問題編號:123

祕密會話哈希:857c9e05-8ad0-4d6b-8112-5f442a731dc1(SecureRandom.uuid上的會話#創建)

計算您摘要:

Digest::SHA1.hexdigest "#{question_id}#{secret_session_hash}"

=> e951774237433335a6c9c0928d5691ca0c2a31b5

建立您的網址:

website/question/123?key=e951774237433335a6c9c0928d5691ca0c2a31b5

你必須確保你的控制器摘要你PARAMS收到[:鍵]就是消化你計算相同。

通過這種方式,您可以合理地確保您的用戶不會作弊,並且他無法將網址提供給其他人。