週刊Railsウォッチ(20180813)Rails 5.2.1リリース、sanitize_sql_arrayは5.2からpublicだった、Dev.toがRailsアプリのソースを公開ほか

こんにちは、hachi8833です。自宅のエアコンの室内機からジャージャー水漏れしたのでこいつ↓でドレーンパイプを吸ったらコガネムシの破片が転がり出てきました🐞。 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄 ⚓Rails: 先週の改修(Rails公式ニュースより) Rails 5.2.1が8/7に正式にリリースされました🎉🎉。 早速記念写真。 その後のコミットを見ると、Railsガイドの修正が目立ちます。 なお、References to changes in Rails 5.2という変更点まとめ記事をHacklinesで見つけました。網羅しているかどうかはわかりませんが、トリビアな変更を避けているっぽいです。 つっつきボイス: 「お、これで5.2系もマイナーバージョンが1つ上がって安定度が増すかな😋」「😆書籍も初版は誤植が付き物ですしね」「実際gem install railsでインストールされるようになってから本格的にバグが見つかるし😎」 ⚓ActiveRecordのsanitize_sql_*系メソッドが5.2で既にpublicメソッドに PR: Make `sanitize_sql_` methods public by y-yagi · Pull Request #31392 · rails/rails 先週のではなく2017年のy-yagiさんによる改修でした。 それ、絶対どこの会社にもあるw — ジョーカー 1007 (@joker1007) August 8, 2018 5.2からpublicやで https://t.co/lmuaeXnblI — Ryuta Kamizono (@kamipo) August 8, 2018 # activerecord/test/cases/sanitize_test.rb#L12 def test_sanitize_sql_array_handles_string_interpolation quoted_bambi = ActiveRecord::Base.connection.quote_string(“Bambi”) – assert_equal “name=’#{quoted_bambi}'”, Binary.send(:sanitize_sql_array, [“name=’%s'”, “Bambi”]) – assert_equal “name=’#{quoted_bambi}'”, Binary.send(:sanitize_sql_array, [“name=’%s'”, “Bambi”.mb_chars]) + assert_equal “name=’#{quoted_bambi}'”, Binary.sanitize_sql_array([“name=’%s'”, “Bambi”]) + assert_equal “name=’#{quoted_bambi}'”, Binary.sanitize_sql_array([“name=’%s'”, “Bambi”.mb_chars]) quoted_bambi_and_thumper = ActiveRecord::Base.connection.quote_string(“Bambi\nand\nThumper”) – assert_equal “name=’#{quoted_bambi_and_thumper}'”, Binary.send(:sanitize_sql_array, [“name=’%s'”, “Bambi\nand\nThumper”]) – assert_equal “name=’#{quoted_bambi_and_thumper}'”, Binary.send(:sanitize_sql_array, [“name=’%s'”, “Bambi\nand\nThumper”.mb_chars]) + assert_equal “name=’#{quoted_bambi_and_thumper}'”, Binary.sanitize_sql_array([“name=’%s'”, “Bambi\nand\nThumper”]) + assert_equal “name=’#{quoted_bambi_and_thumper}'”, Binary.sanitize_sql_array([“name=’%s'”, “Bambi\nand\nThumper”.mb_chars]) end もうsendで叩かなくて済むということですね。 つっつきボイス: 「おおこれは前から何かと話しに上がってたヤツ: 自分もsendで叩いてたし」「やっぱり使ってたんですね?」「sanitize_sql_arrayとかは生SQLを書く人には絶対に必要です😤」「これはSQLインジェクション防止のために超大事なヤツっす」「なぜ今までこれがprivateだったのかホント不思議なくらいで、ツイートにもあるけど誰もが同じこと思ってた」「sendすれば使えますけどねっ🕶書き方としてよくないというだけで」 「生SQLで変数のプレースホルダーが複数出てきたりすると結局sanitize_sql_arrayとかでやる以外に方法はないですね: 当時自力で追いかけましたもん🤓」「2017年に入ってたのにウォッチで見逃してたとは…😅これだけのために5.2入れる甲斐がありそう」「あ、今回の5.2.1からじゃなくて5.2で既に入ってたのか😲」「そうそう、もう大手を振って使えます😋ある程度以上大きなプロジェクトならたいてい生SQL書くことになるので」 確かに5.2で入ってました↓。5.1ではClassMethodsが丸ごとprivateになっていました。 # https://github.com/rails/rails/blob/5-2-0/activerecord/lib/active_record/sanitization.rb#L123 def sanitize_sql_array(ary) statement, *values = ary if values.first.is_a?(Hash) && /:\w+/.match?(statement) replace_named_bind_variables(statement, values.first) elsif statement.include?(“?”) replace_bind_variables(statement, values) elsif statement.blank? statement else statement % values.collect { |value| connection.quote_string(value.to_s) } end end private 参考: Ruby on Rails 5.2 / ActiveRecord::Sanitization::ClassMethods — DevDocs 参考: SQLインジェクション - Wikipedia 「今までprivateだったのは、もしかすると『生SQL書くな』ってことなのかな?なんて思ったりもするけど」 「話逸れますけど、@__gfx__さんのTwitter IDの前後にアンスコが2つずつついてるので、この人のツイートはTechRachoの記事に直接埋め込めないんです😭」「Markdownと誤認識されちゃうのね: ワカルワカル😆」「RailsdmでElasticsearchの話してた方でしたね↓」 「SQL向けのpublicなsanitizeメソッドって他にあった気がしないでもないけど気のせいだったかな🤔…?」 ActiveRecord::Base.sanitizeが以前あったのが削除されたそうです↓。placeholder展開もしないようです。 * ActiveRecord::Base.sanitize removed in 5.1 · Issue #28947 · rails/rails 追いかけボイス: 「(後日)sanitize_sql_arrayあまり使わないと聞きましたが」「Arelは基本使わないし、生SQLも本当に必要になるまで使わないマンなので🤓」「Rails wayというかActiveRecord wayでやってるんですね☺️」「生SQLは最近少し使ったのでそのときはさすがにsanitize_sql_arrayしましたが😎」 ⚓「Relation#updateのスコープ追加回避」を取り消し … Continue reading 週刊Railsウォッチ(20180813)Rails 5.2.1リリース、sanitize_sql_arrayは5.2からpublicだった、Dev.toがRailsアプリのソースを公開ほか