Strong parameters

Posted by Anthony Chao on 2019-09-04

今天來到 5.6 的章節,提到了關鍵字: strong parameters
如果在看 rails 網頁畫面看到這個 error 那你就是遇到今天要講的主題了

strong parameters 是 rails 的眾多防護機制之一
想像某種情境:今天你做出一個表單讓使用者填,但有心人士可能會把一些你不想要的資訊也透過這個表單傳送到你的資料庫,讓你的應用程式崩壞甚至更糟,而strong parameters 的機制就是要防止這種狀況發生

要怎麼防護呢? 其實他就很像一種過濾器的功能,我們預先設定好,不管使用者怎樣使用,只讓我想拿到的參數傳進來


概念上講起來很簡單,但實際上怎麼做呢?

我們從表單拿到的資訊會是一個 params ,這包資訊如果直接想直接存進資料庫就會被 strong parameters 機制卡住,得到上面那種錯誤畫面,所以我們就用 rails 提供的方法來過濾他

我們比較常用的是 requirepermit 這兩種方法

這兩種方法拿的東西有什麼不同呢? require 拿到的是裡面的東西,而permit 拿到的是包括他的整個 Hash

1
2
3
4
5
params = ActionController::Parameters.new(username: "john")
params.permit(:username)
# => { "username" => "john" }
params.require(:username)
# => "john"

(以上範例來自別人網站,來源在這裡

permit 後面接的只能是 scalar values,至於什麼是 scaler values 官網也有寫:

The permitted scalar types are String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile, and Rack::Test::UploadedFile

這裡面是不包括 Hash 跟 Array 的!
假如你今天的資料結構長這樣

1
user: { username: "john" }

你必須用兩段式的方式將他過濾掉

1
clean_params = params.require(:user).permit(:username)

更進階的方法還有在實體剛 new 出來的時候就先用 fetch 抓住資料再過濾或者複雜巢狀結構過濾等等,可以參考下面的參考資料,都寫得非常清楚,我這邊就不再贅述

參考資料
rails guide

超有用的範例網站





prevent_hack