expected file /Users/suzuka/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/devise-4.9.3/app/mailers/devise/mailer.rb to define constant Devise::Mailer, but didn't (Zeitwerk::NameError)
実際に irbで「猫クラス」を作ったところ、class/module name must be CONSTANT (SyntaxError)というエラーが出て、定義できませんでした。
irb(main):* class 猫
irb(main):> end/Users/suzuka/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.2/lib/irb/workspace.rb:117:in`eval': (irb):1: class/module name must be CONSTANT (SyntaxError)
チーム開発でGood First Issueが初マージされた
1/24の開発ミーティングからチーム開発に入り、2つのIssueがマージされました。
初めて取り組んだIssueは「不要なボーダーを一つ消す」というものでしたが、普段使っているBootcampアプリで実際にボーダーが消えた時には感動しました✨
@memos = Memo.where(draft: false).where("content LIKE '%#{params[:term]}%'")
追加したwhere("content LIKE '%#{params[:term]}%'")の意味を確認しましょう。
LIKEは検索、%は0文字以上の任意の文字列を示します。
#{}は式展開で、検索された文字を示すparams[:term]の値を取り出します。
つまりwhere("content LIKE '%#{params[:term]}%'")は、「contentが検索文字列を含むメモの絞り込み」を表しています。
SQLでシングルクォーテーションを2つ記述すると、最初の'が次の'をエスケープします。
つまり対策後のコードでは、AND (content LIKE '%'') OR 1 = 1 --%')の2つ目のシングルクォーテーションが3つ目をエスケープしています。そのため、'%') OR 1 = 1 --%'全体が文字列とされ、SQLインジェクションが起こりません。
対策後のフォームで') OR 1 = 1 --を検索してみます。
単純に「') OR 1 = 1 --」という文字列を含むメモを検索するため、何も表示されなくなりました。