about 11 years ago

上篇: Secure Your Application : The Basic (1)


3. bypass RESTful

RESTful 是初上手 Rails 的開發者,相當討厭的一個課題。因為沒有很好懂,加上被認為不自由。總之,不遵守 RESTful 設計原則原因有很多

  • 老子就是討厭 RESTful
  • 我...不懂 RESTful 要怎麼寫
  • 真的有必要把任何 action 都走 RESTful 嗎?

但是,很多開發者不知道的是:雖然 Rails 提供了 CSRF protection,攻擊者發了錯的 request,就會被導錯誤 422。但是,這樣的預設防禦只在遵守 Rails RESTful 設計規範的情形下運作。

在 Rails 3 的 routes.rb 最下面有一段被註解掉的 code

config/routes.rb
# This is a legacy wild controller route that's not recommended for   RESTful applications.

# Note: This route will make all actions in every controller  accessible via GET requests.

# match ':controller(/:action(/:id(.:format)))'

很多開發者在不知道怎麼設 routing 的情況下就把 match ':controller(/:action(/:id(.:format)))' 這行打開了。

因為打開,程式就可以動了 .....(汗)。

可以繼續快樂的寫 http://example.com/usses/eat/1234 這種直觀的 routing,而不用去管 Rails RESTful 的原則...

這等於把自家大門敞開任人打 XD。

因為 Rails 防禦 CSRF 攻擊的原則上是若對 routing 送了錯誤的 http verb 或者是送了錯的 Authenticity Token,Rails 就視為非法 request 導掉。但是 match everything 的結果是,所有的 action 都變成了 GET,一些需要保護的 POSTPUT action 就門戶洞開了。

可能的解法:

  • routes.rb 幹掉 match ':controller(/:action(/:id(.:format)))' 這行
  • 設立 coding policy,嚴禁任何人再把他加回去。

Rails4 起也已把預設的這行 example 拿掉了...

4. match in routing

這要從 routing 開始講起。

在 Rails 3 時,因為...我也不知道的原因,match 等於 matches all HTTP verb。而所有的 custom routing 的教學都推薦用 match 去實作。所以很多 application 裡的 route 很歡樂的到處都是 match

但是,到處都是 match 就會造成下面的這種類似的 code 會有中招的風險。(allow using GET to massive delete articles)

match "article/delete/:id", :to => "articles#destroy" :as => "delete_article"

解法

  • 檢查 routes.rb 幹掉所有的 `match,改用正確的 HTTP verb
  • Rails 提供正確的 verb 用法可以取代掉 matchget, post, put , delete

所以上面的 example 可以改成

delete "/article/delete/:id", :to => "articles#destroy" :as => "delete_article"
  • 或者是改用 via
match "/article/delete/:id", :to => "articles#destroy", :as => "delete_article", :via => :delete


下篇: Secure Your Application : The Basic (3)

← Secure Your Application : The Basic (1) Secure Your Application : The Basic (3) →
 
comments powered by Disqus