2011-03-15 40 views
0

我有下面的鏈接:Rails 3:如何防止用戶通過輸入URL來更改數據庫?

link_to("Toggle", "/jobs/#{job.id}/toggle_is_money_paid", :remote => true) 

其切換使用Ajax請求的作業的is_money_paid字段:

def toggle_is_money_paid 
    job = Job.find(params[:id]) 
    job.update_attributes(:is_money_paid => !job.is_money_paid) 
    render :nothing => true 
end 

# config/routes.rb 
match "/jobs/:id/toggle_is_money_paid" => "jobs#toggle_is_money_paid" 

然而,如果直接用戶類型:

http://localhost:3001/jobs/200/toggle_is_money_paid 

在瀏覽器,它將切換作業#200的is_money_paid字段。

我怎樣才能防止這種情況,使用戶只能通過按下鏈接來切換字段。

回答

2

您可以通過不使用match來定義路徑,而是使用其中一個未獲取的HTTP動詞來阻止此操作。更可能的,你會想用put

put "/jobs/:id/toggle_is_money_paid" => "jobs#toggle_is_money_paid" 

然後你會改變link_to這樣:

link_to("Toggle", "/jobs/#{job.id}/toggle_is_money_paid", :remote => true, :method => :put) 
+1

什麼?這不是一個解決方案。它唯一做的是使請求更難做,但仍然有可能。 – ryeguy 2011-03-15 02:33:39

+0

@ryeguy它可以防止CSRF,所以只有用戶自己可以切換字段。 – Samuel 2011-03-15 05:02:20

+0

@ryeguy:人們無法在地址欄中輸入網址並使其正常工作。該方法需要PUT,但URL是GET。 – 2011-03-15 11:01:52