我看到,當我們的名字在配置文件的路徑,像這樣:如何有一個路線從代碼只訪問,而不是從URL
match 'controller/posts' => 'controller#posts', :as => 'posts'
它創建與動作控制器命名路線。
但是這條路線需要從代碼中訪問。說我點擊帖子按鈕時,它應該爲用戶執行此操作。
但是,當某人執行www.xyz.com/posts時,它不應該嘗試執行此操作。那可能嗎 ?
我看到,當我們的名字在配置文件的路徑,像這樣:如何有一個路線從代碼只訪問,而不是從URL
match 'controller/posts' => 'controller#posts', :as => 'posts'
它創建與動作控制器命名路線。
但是這條路線需要從代碼中訪問。說我點擊帖子按鈕時,它應該爲用戶執行此操作。
但是,當某人執行www.xyz.com/posts時,它不應該嘗試執行此操作。那可能嗎 ?
我不確定你爲什麼會這樣做。這聽起來像你想要的是能夠從另一個控制器調用特定位的代碼。所以一條路線不會因爲你提到的原因而工作(它可以在瀏覽器中使用)。
相反,你應該提取這段代碼並將其放入它自己的庫中。
的lib/foobar.rb:
module Foobar
def my_method
# add your code here
end
end
然後你可以從徘徊無論你想在你的代碼中調用它。
不,如果有人在瀏覽器中輸入URL而不是點擊鏈接,則無法設置路由並拒絕訪問。
它聽起來像你試圖做的是阻止用戶猜測一個URL。有幾個選項來做到這一點:
你可以使用devise進行身份驗證。
要使用令牌,你可以設置像一個路線:
match 'controller/{some unique token here}/posts' => 'controller#posts', :as => 'posts'
看一看在Rails guide on Routes其他方式來設定的路線上的約束。
其實對於一個POST路由來說,它*有可能進一步發展,例如對請求進行數字簽名,和/或使用一個隨機數,以便只有先前呈現的HTML表單(或其自動化)可以通過一些額外的隱藏領域。這可以用來防止重複請求攻擊。不清楚OP是否會從中受益,還是要求更根本性的安全問題(您的回答地址)。您對獨特令牌的建議非常接近我認爲OP所要求的。 –
關於POST請求和nonce的好處。這可以是URL請求的一部分,通過使用public/private crypto來生成一段有效的簽名令牌(類似於csrf-token rails生成的)。我會用這個更新我的答案。 – roo
對我來說不是100%清楚你的意思是「這條路線需要從代碼中訪問」?你是否在問如何創建一個控制器,它將*只響應你之前呈現的HTML請求?你的應用程序是否已經有認證和用戶會話? –