2016-11-24 24 views
1

Brakemanのツールでコードをスキャンすると、警告メッセージが表示されます。それはにスコープ外の呼び出しは次のクエリがあると述べている:ここではBrakemanの "Unscoped call to"という警告は何ですか?

@applicant = Applicant.find(params[:id]) 

は、実際のエラーメッセージです:

+------------+----------------------+---------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ 
| Confidence | Class    | Method | Warning Type | Message                                 | 
+------------+----------------------+---------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ 
| Weak  | ApplicantsController | show | Unscoped Find | Unscoped call to Applicant#find near line 25: Applicant.find(+params[:id]+)                |              | 
+------------+----------------------+---------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ 

しかし、私は、次のいずれかで上記のクエリを交換するとき、それはいいのよ:

@applicant = Applicant.where("id = ?", params[:id]).first 

最初のクエリで何が問題なのか分かりません。

+0

実際のエラーメッセージを投稿できますか? – mysmallidea

+0

@mysmallidea質問を更新しました。 –

答えて

6

BrakemanはApplicantテーブル全体を照会していて、current_tenant.applicants.find...のような別のモデルではスコープしていないことを警告しています。 Brakeman's docs

範囲指定されていないfind(および関連するメソッド)は、ダイレクトオブジェクト参照の形式です。別のモデルに属するモデルは、通常、スコープ付きクエリを介してアクセスする必要があります。アカウントがユーザーに属している場合

は、例えば、これは安全ではない、スコープ外見つけることがあります

Account.find(params[:id]) 

アクションに応じて、これは、攻撃者は、彼らが望む任意のアカウントにアクセスする可能性があります。

は代わりに、現在ログインしているユーザにスコープする必要があります。

current_user = User.find(session[:user_id]) 
current_user.accounts.find(params[:id]) 

これはあなたの希望の動作であるならば、あなたは偽陽性としてこの警告を無視し制動手を設定することができます。これを行うには、-Iフラグ(または--interactive-ignore)を使用してbrakemanを実行します。 Ignoring False Positivesの指示に従ってすべての警告を実行し、この特定のファイルを無視ファイルに追加します。一言で言えば

$ brakeman -I 
Input file: |config/brakeman.ignore| 
# press Enter to accept the default ignore file 
No such file. Continue with empty config? 
# press Enter to create the file 
> 
1. Inspect all warnings 
2. Hide previously ignored warnings 
3. Skip - use current ignore configuration 
# press 2 to step through all warnings, skipping previously ignored 
# Brakeman will now step through each warning, prompting you to for each one. 
# Press i to add this warning to the ignore list. 
# When finished, Brakeman will ask you what to do. 
# Press 1 to save changes to the ignore file. 

あなたは制動手を次回実行時、この警告は表示されません。

+0

この情報に感謝します。私の2番目のクエリで使用しようとしている方法は正しいですか? –

+0

私は最初のクエリ( '@applicant = Applicant.find(params [:id])')を使用します - レコードが見つからない場合は、2番目の方法( 'where..first')で404エラーが発生しません。それを最初の方法で実行すると、ActiveRecord :: RecordNotFound例外が発生します。これは必要なものです。 – mysmallidea

+0

これは似たような答えです:http://stackoverflow.com/questions/32102172/ruby-on-rails-what-do-these-brakeman-warnings-mean – mysmallidea

関連する問題